CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

菜鸟级问题,在Delphi5中怎样写小应用程序?

楼主cdimp(生鱼片)2001-08-05 19:47:48 在 Delphi / VCL组件开发及应用 提问

在Delphi5新建窗体中,不放任何控件编译它后生成的exe文件体积还有288k.  
  请问各位大侠这是怎么会事? 问题点数:20、回复次数:22Top

1 楼chechy(www.qdocuments.net)回复于 2001-08-05 19:50:06 得分 1

主要是VCL类库在作怪。尤其实DOCK功能。难道现在写程序还在乎大小吗?如果你在乎,建议你用Windows   SDK写,保证小。如果还不满意,可以用汇编,这样就是小得不能在小了。Top

2 楼ymkj(ymkj)回复于 2001-08-05 19:53:44 得分 1

不要FORM可写几K的小程序。Top

3 楼cdimp(生鱼片)回复于 2001-08-05 19:54:28 得分 0

chechy,谢谢您的回复!Top

4 楼cdimp(生鱼片)回复于 2001-08-05 19:56:03 得分 0

不要FORM控件放哪?Top

5 楼tikkypeng(千两狂死郎之天衣有缝)回复于 2001-08-05 20:19:54 得分 1

呵呵~~delphi的缺点~~呵呵~~不过不是有一个什么工具可以压缩exe文件~~  
  压缩以后很小的~而且用起来也没有问题~~不过名字我忘了~~不好意思Top

6 楼cdimp(生鱼片)回复于 2001-08-05 20:30:18 得分 0

还是用汇编好了,不过我还不会。Top

7 楼dsyxl(天狼星)回复于 2001-08-05 20:34:34 得分 1

以现在硬件来说,软件的大小已经不太重要了,再说了,第一个窗体两百多K,加一个窗体它不会是四百多K放心吧!Top

8 楼navy_koo(平湖秋水)回复于 2001-08-05 20:35:26 得分 1

在工程选项卡中(link)设置一下,先写点dos程序。Top

9 楼aningstar(乘风破浪终有时)回复于 2001-08-05 20:41:34 得分 1

呵呵  
  用Aspack压缩吧,可以缩小尽一半  
  这个软件也是用Delphi写的  
  华军有下的Top

10 楼dsyxl(天狼星)回复于 2001-08-05 20:46:07 得分 1

对了,这个软件我也用过,可是为什么到50%的时候就会出错而中止了呢?谁知道?Top

11 楼cdimp(生鱼片)回复于 2001-08-05 20:48:22 得分 0

我先压一下吧Top

12 楼tikkypeng(千两狂死郎之天衣有缝)回复于 2001-08-05 20:56:31 得分 1

对了~~请教一下~~怎么才能突破那个软件的30天的试用期??Top

13 楼cdimp(生鱼片)回复于 2001-08-05 21:03:33 得分 0

我只是想把程序做到百K以下.Top

14 楼chechy(www.qdocuments.net)回复于 2001-08-05 21:06:21 得分 1

那里用Package,在Project   Options中Use   Package。程序会小的惊人。Top

15 楼ymkj(ymkj)回复于 2001-08-05 21:11:27 得分 1

用程序行实现FORM功能。Top

16 楼DD88(程序设计中...)回复于 2001-08-05 21:23:44 得分 1

程序员2000的光碟里有不少EXE的压缩程序,自己找找。Top

17 楼eDRIVE(awxzz)回复于 2001-08-06 00:37:53 得分 1

to   chechy(chechy):  
  作为使用Use   Package的代价,你不得不随着你的程序附带一个几兆大的VCL运行库?!   呵呵Top

18 楼chechy(www.qdocuments.net)回复于 2001-08-06 08:52:25 得分 1

世上有  
  既要马儿跑得快,又要马儿不吃草  
  的事情吗?Top

19 楼jps(芳邻)回复于 2001-08-06 09:00:49 得分 5

象C语言一样,用Delphi也能写出只有几十K、十几K、甚至只有几K的小程序,本文将   以一个能将Win95桌面藏起来的仅有38K的小程序为例教会读者这一技巧,同时本文还   将涉及Win95   TrayIcon的显示。  
   
  本程序能写得很小的诀窍是:根本没有用任何的   Form   。也就是说,源程序只有一个   Desktop.dpr   文件,程序完全用标准的   WINAPI   写成,由于用到的资源很少,所以程序的体积也很小。当然,用这样的方法编程时不能使用   Delphi的所见即所得的编程方式。}  
   
  {首先看看程序头的写法:}  
   
  program   DeskPop;  
   
  uses   Windows,   Messages,   ShellAPI,   sysutils;  
   
  {$R   *.RES}  
   
  {可以看出本程序比普通的   Delphi   程序用到的   Unit   少的多。   下面声明了全局常量和变量,暂时可以不管他们。}  
   
  const  
   
  AppName   =   'DeskTop   Hide';  
   
  var  
   
  x:   integer;  
   
  tid:   TNotifyIconData;  
   
  WndClass:   array[0..50]   of   char;  
   
  {现在进入程序的主要部分,首先是定义了一批过程,为了能让读者更好地理解,我们先把这些过程跳过去,先说主程序。主程序位于程序的最后,这样做的好处是可以直接使用程序中定义的过程。主程序十分简单:}  
   
  begin  
   
  WinMain;  
   
  end.  
   
  {看来所有的工作都由   WinMain   完成了。这个   WinMain   使用标准的   WinAPI   函数进行编程,主要步骤是:先声明一个窗口类,然后创建一个主窗口,最后进入消息循环,直到程序结束。}  
   
  procedure   WinMain;  
   
  var  
   
  Wnd:   hWnd;   {声明窗口句柄(Handle)变量}  
   
  Msg:   TMsg;   {声明消息变量}  
   
  cls:   TWndClass;   {窗口类变量}  
   
  begin  
   
  {   Previous   instance   running   ?   If   so,   exit   }  
   
  {   检查是否程序已经运行,如果已经运行则调用Panic过程退出   }  
   
  if   FindWindow   (AppName,   Nil)   <>   0   then  
   
  Panic   (AppName   +   '   is   already   running.');  
   
  {   Register   the   window   class   }  
   
  {   这里的注册窗口类程序是例行公事,照抄即可}  
   
  FillChar   (cls,   sizeof   (cls),   0);   {用这一句将窗口类变量cls清零)  
   
  cls.lpfnWndProc   :=   @DummyWindowProc;   {取回调函数DummyWindowProc的地址}  
   
  cls.hInstance   :=   hInstance;   {实例句柄}  
   
  cls.lpszClassName   :=   AppName;   {窗口类名}  
   
  RegisterClass   (cls);   {注册窗口类cls}  
   
  {   现在可以创建程序的主窗口了-在本程序中是个虚拟窗口}  
   
  {   Now   create   the   dummy   window   }  
   
  Wnd   :=   CreateWindow   (AppName,   AppName,   ws_OverlappedWindow,  
   
  cw_UseDefault,   cw_UseDefault,   cw_UseDefault,   cw_UseDefault,  
   
  0,   0,   hInstance,   Nil);  
   
  x:=   0;   {变量X其实是个开关变量,记录现在是否已经隐藏了桌面}  
   
  {   如果窗口创建成功,则显示窗口,并进入消息循环   }  
   
  if   Wnd   <>   0   then  
   
  begin  
   
  ShowWindow   (Wnd,   sw_Hide);{本例中窗口是隐藏的}  
   
  {   下面进入消息循环,该循环将不断运行直到   GetMessage返回0   }  
   
  while   GetMessage   (Msg,   0,   0,   0)   do  
   
  begin  
   
  TranslateMessage   (Msg);  
   
  DispatchMessage   (Msg);  
   
  end;  
   
  end;  
   
  end;  
   
  {现在看来,程序的主框架很明了,但是它还不能完成任何任务。过程   Panic将显示一个对话框后退出程序,它在   Winmain   过程的开始部分被调用,其实   Panic的功能很简单,之所以要写成一个函数的原因恐怕一方面是结构化编程的需要,另一方面借此避开了   String   和   PChar   的转换。}  
   
  procedure   Panic   (szMessage:   PChar);  
   
  begin  
   
  if   szMessage   <>   Nil   then  
   
  MessageBox   (0,   szMessage,   AppName,   mb_ok);  
   
  Halt   (0);  
   
  end;  
   
  {下面是回调(Callback)函数   DummyWindowProc,如果说   Winmain   过程是本程序-或者说是本应用或实例的生命,那么这个回调函数可以说是主窗口的灵魂。每一个标准的或者说是规范的Windows窗口都有一个回调函数,以处理发给该窗口的消息。所谓“回调”的意思是这个函数不是由程序直接调用的,而是由   Windows   系统调用(还记得我们在窗口类中给lpfnWndProc赋过值吗),   这就是事件驱动编程。}  
   
  function   DummyWindowProc   (Wnd:   hWnd;   Msg,   wParam:   Word;   lParam:   LongInt)  
   
  :LongInt;   stdcall;   {注意这里有一个   stdcall;定义了回调函数}  
   
  var  
   
  TrayHandle:   THandle;  
   
  dc:   hDC;  
   
  i:   Integer;  
   
  pm:   HMenu;  
   
  pt:   TPoint;  
   
  begin  
   
  DummyWindowProc   :=   0;  
   
  {下面两句是找到   Win95   任务栏的句柄}  
   
  StrPCopy(@WndClass[0],   'Progman');  
   
  TrayHandle   :=   FindWindow(@WndClass[0],   nil);  
   
  {下面开始处理消息}  
   
  case   Msg   of  
   
  {收到窗口创建消息   -   在任务栏上显示一个图标}  
   
  wm_Create:   //   Program   initialisation   -   just   set   up   a   tray   icon  
   
  begin  
   
  tid.cbSize   :=   sizeof   (tid);  
   
  tid.Wnd   :=   Wnd;  
   
  tid.uID   :=   1;  
   
  tid.uFlags   :=   nif_Message   or   nif_Icon   or   nif_Tip;  
   
  tid.uCallBackMessage   :=   wm_User;  
   
  tid.hIcon   :=   LoadIcon   (hInstance,   'MAINICON');  
   
  lstrcpy   (tid.szTip,'Desktop   is   on');  
   
  Shell_NotifyIcon   (nim_Add,   @tid);  
   
  end;  
   
  wm_Destroy:   {收到关闭窗口消息时的处理}  
   
  begin  
   
  Shell_NotifyIcon   (nim_Delete,   @tid);  
   
  PostQuitMessage   (0);  
   
  ShowWindow(TrayHandle,   SW_RESTORE);  
   
  end;  
   
  {收到菜单消息时调用   HandleCommand   过程,并退出函数}  
   
  wm_Command:   //   Command   notification  
   
  begin  
   
  HandleCommand   (Wnd,   LoWord   (wParam));  
   
  Exit;  
   
  end;  
   
  {收到其他用户消息时的处理}  
   
  wm_User:   //   Had   a   tray   notification   -   see   what   to   do  
   
  {如果单击了鼠标左键,   则打开或关闭桌面}  
   
  if   (lParam   =   wm_LButtonDown)   then  
   
  begin  
   
  if   x   =   0   then  
   
  begin  
   
  ShowWindow(TrayHandle,   SW_HIDE);  
   
  tid.hIcon   :=   LoadIcon   (hInstance,   'offICON');  
   
  lstrcpy   (tid.szTip,'Desktop   is   off');  
   
  Shell_NotifyIcon   (NIM_MODIFY,   @tid);  
   
  x:=1  
   
  end   else  
   
  begin  
   
  ShowWindow(TrayHandle,   SW_RESTORE);  
   
  tid.hIcon   :=   LoadIcon   (hInstance,   'ONICON');  
   
  lstrcpy   (tid.szTip,'Desktop   is   on');  
   
  Shell_NotifyIcon   (NIM_MODIFY,   @tid);  
   
  x:=   0;  
   
  end;   {end   of   if}  
   
  end   else  
   
  {如果是鼠标右键,则动态生成一个弹出式菜单}  
   
  if   (lParam   =   wm_RButtonDown)   then  
   
  begin  
   
  GetCursorPos   (pt);  
   
  pm   :=   CreatePopupMenu;  
   
  AppendMenu   (pm,   0,   Ord   ('A'),   'About   DeskTop   Hide...');  
   
  AppendMenu   (pm,   mf_Separator,   0,   Nil);  
   
  AppendMenu   (pm,   0,   Ord   ('E'),   'Exit   DeskTop   Hide');  
   
  SetForegroundWindow   (Wnd);  
   
  dc   :=   GetDC   (0);  
   
  if   TrackPopupMenu   (pm,   tpm_BottomAlign   or   tpm_RightAlign,  
   
  pt.x,GetDeviceCaps(dc,HORZRES){pt.y},   0,   Wnd,   Nil)  
   
  then   SetForegroundWindow   (Wnd);  
   
  DestroyMenu   (pm)  
   
  end;   {end   of   if}  
   
  end;   {end   of   case}  
   
  {在处理过消息之后,还要调用默认函数,以完成标准的Windows程序应该执行的任务,所以这一句非常重要}  
   
  DummyWindowProc   :=   DefWindowProc   (Wnd,   Msg,   wParam,   lParam);  
   
  end;  
   
  {这个就是处理菜单消息的过程}  
   
  procedure   HandleCommand   (Wnd:   hWnd;   Cmd:   Word);  
   
  begin  
   
  case   Cmd   of  
   
  Ord   ('A'):   MessageBox   (0,   'Freeware   brian.slack@strath.ac.uk   1997',  
   
  AppName,   mb_ok);  
   
  Ord   ('E'):   PostMessage   (Wnd,   wm_Close,   0,   0);  
   
  end;  
   
  end;  
   
  至此我们已经完成了这个只有38K的能将Win95桌面隐藏起来的程序,只要将本文中所有的函数和过程的顺序倒置,并将主程序放到最后,即可编译通过。  
   
  Top

20 楼xzm2000(傻B)回复于 2001-08-06 09:06:01 得分 1

不要用vcl,直接用api写那样应该会很小,至于你说的控件放在什么地方,是先用api创建一个窗体,然后自己用gdi函数画了,这样会很麻烦,如果一定要写小于100k的程序,劝你用bcb,和delphi差不多:)Top

21 楼xzgyb(老达摩)回复于 2001-08-06 09:35:42 得分 1

我觉得如用一般控件的话,可以写含有对话框的资源文件,给出控件ID,类型,位置,当然得需要了解资源文件的写法,也可用vc的资源编辑器,建立对话框资源,在与程序连接  
  不过控制还得用api,很麻烦哪Top

22 楼cdimp(生鱼片)回复于 2001-08-06 19:02:10 得分 0

谢谢大家的回复Top

相关问题

  • 菜鸟级问题:怎样生成最小的应用程序
  • 菜鸟提问:如何获得应用程序路径?
  • 菜鸟的问题,VB.net下应用程序的安装制作
  • 菜鸟的MFC编写数据库应用程序的求助
  • 菜鸟问题:建立c#wed应用程序失败
  • 菜鸟问题,关于C#应用程序的编译!
  • 菜鸟提问 关于c#woindows应用程序
  • 菜鸟级问题,数据库能将应用程序放进去吗?
  • 一个很菜鸟的问题:关于用vb编写web应用程序
  • [菜鸟问题]在windows应用程序中的数据库调用请教

关键词

  • win95
  • 函数
  • 控件
  • delphi
  • 消息
  • 循环
  • 文件
  • 程序
  • 变量
  • dummywindowproc

得分解答快速导航

  • 帖主:cdimp
  • chechy
  • ymkj
  • tikkypeng
  • dsyxl
  • navy_koo
  • aningstar
  • dsyxl
  • tikkypeng
  • chechy
  • ymkj
  • DD88
  • eDRIVE
  • chechy
  • jps
  • xzm2000
  • xzgyb

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo