北
北京男人
Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi做的Exe文件真可以这么小吗?那如何发布程序?[]
-----
问题一:
-----
平时发布程序我就直接发布,一个工程创建直接运行默认200-300k那么大,不过今天发现在Delphi菜单的
project/Options/Packages/Runtime packages下的
Build with runtime packages
这里,如果选择这个CheckBox并编译程序的话程序才只有13K,不过我不理解既然是Build with??那么Exe文件必然要比原先的大才对,怎么
才13K呢?那么发布这样的程序的话是不是和Vcl50.dcp;Vclx50.dcp...这些运行期包一起打包发布呢?如何发布呀?
看来我对Design time package 和 Runtime package的理解还不够深刻,我是这样想的,Delphi的组件包默认是Desintime and runtime,所
以Exe文件生成后因为包含运行期设计期两个包,所以文件很大,如果选择了Build with runtime packages这个选项那么只和运行期包编译而
不再管设计期包,所以Exe文件变小多了,完全和C++,C#媲美了,对吗?
而Delphi6开始就严格将Design time package 和 Runtime package区分来设计成两个单独的包,以防止代码膨胀,这是Borland 程序员Jeff
Overcash提出的想法,也引起了是Delphi5的组件升级成Delphi6时候出现的“Proxies.pas not found”、“DsgnIntf.dcu not found”等问题
。
大家说我说的对吗?这是我个人的理解,请大家多多指教!:)
-----
问题二
-----
我Delphi5下做的以下组件无法在Delphi6下使用,就是编译时属性编辑器出错,放到设计期运行期包都不合适,请问如何修改?只要实现一
个About属性即可。
{-----------------------------------------}
{功能:能包容其他组件的进度条控件 }
{-----------------------------------------}
unit tzStatusBar;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls,
{$IFDEF VER130} //D5
DsgnIntf
{$ENDIF}
{$IFDEF VER140} //D6
DesignIntf, DesignEditors, VCLEditors
{$ENDIF}
{$IFDEF VER150} //D7
DesignIntf, DesignEditors, VCLEditors
{$ENDIF}
;
type
{属性编辑器类}
TAboutProperty = Class(TPropertyEditor)
public
procedure Edit;
override;
function GetAttributes: TPropertyAttributes;
override;
function GetValue: string;
override;
end;
{进度条类}
TtzStatusBar = class(TStatusBar)
private
{ Private declarations }
FAbout: TAboutProperty;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);
override;
published
{ Published declarations }
property About: TAboutProperty read FAbout;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('TZhuang', [TtzStatusBar]);
RegisterPropertyEditor(TypeInfo(TAboutProperty), TtzStatusBar, 'About', TAboutProperty);
end;
{ TtzStatusBar }
constructor TtzStatusBar.Create(AOwner: TComponent);
begin
inherited create(AOwner);
ControlStyle:= ControlStyle + [csAcceptsControls];
end;
{ TAbout }
procedure TAboutProperty.Edit;
begin
//双击时干什么?
Application.MessageBox('TtzStatusBar,FreeWare,Enjoy.'#13#10 +
'E-mail: tzdgg@163.net','About TtzStatusBar',MB_OK + MB_ICONINFORMATION);
end;
function TAboutProperty.GetAttributes: TPropertyAttributes;
begin
Result:= [paDialog,paReadOnly];
{ _____|
|
//双击属性弹出一个窗口}
end;
function TAboutProperty.GetValue: string;
begin
Result:= '(About...)';
end;
end.
-----
问题一:
-----
平时发布程序我就直接发布,一个工程创建直接运行默认200-300k那么大,不过今天发现在Delphi菜单的
project/Options/Packages/Runtime packages下的
Build with runtime packages
这里,如果选择这个CheckBox并编译程序的话程序才只有13K,不过我不理解既然是Build with??那么Exe文件必然要比原先的大才对,怎么
才13K呢?那么发布这样的程序的话是不是和Vcl50.dcp;Vclx50.dcp...这些运行期包一起打包发布呢?如何发布呀?
看来我对Design time package 和 Runtime package的理解还不够深刻,我是这样想的,Delphi的组件包默认是Desintime and runtime,所
以Exe文件生成后因为包含运行期设计期两个包,所以文件很大,如果选择了Build with runtime packages这个选项那么只和运行期包编译而
不再管设计期包,所以Exe文件变小多了,完全和C++,C#媲美了,对吗?
而Delphi6开始就严格将Design time package 和 Runtime package区分来设计成两个单独的包,以防止代码膨胀,这是Borland 程序员Jeff
Overcash提出的想法,也引起了是Delphi5的组件升级成Delphi6时候出现的“Proxies.pas not found”、“DsgnIntf.dcu not found”等问题
。
大家说我说的对吗?这是我个人的理解,请大家多多指教!:)
-----
问题二
-----
我Delphi5下做的以下组件无法在Delphi6下使用,就是编译时属性编辑器出错,放到设计期运行期包都不合适,请问如何修改?只要实现一
个About属性即可。
{-----------------------------------------}
{功能:能包容其他组件的进度条控件 }
{-----------------------------------------}
unit tzStatusBar;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls,
{$IFDEF VER130} //D5
DsgnIntf
{$ENDIF}
{$IFDEF VER140} //D6
DesignIntf, DesignEditors, VCLEditors
{$ENDIF}
{$IFDEF VER150} //D7
DesignIntf, DesignEditors, VCLEditors
{$ENDIF}
;
type
{属性编辑器类}
TAboutProperty = Class(TPropertyEditor)
public
procedure Edit;
override;
function GetAttributes: TPropertyAttributes;
override;
function GetValue: string;
override;
end;
{进度条类}
TtzStatusBar = class(TStatusBar)
private
{ Private declarations }
FAbout: TAboutProperty;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent);
override;
published
{ Published declarations }
property About: TAboutProperty read FAbout;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('TZhuang', [TtzStatusBar]);
RegisterPropertyEditor(TypeInfo(TAboutProperty), TtzStatusBar, 'About', TAboutProperty);
end;
{ TtzStatusBar }
constructor TtzStatusBar.Create(AOwner: TComponent);
begin
inherited create(AOwner);
ControlStyle:= ControlStyle + [csAcceptsControls];
end;
{ TAbout }
procedure TAboutProperty.Edit;
begin
//双击时干什么?
Application.MessageBox('TtzStatusBar,FreeWare,Enjoy.'#13#10 +
'E-mail: tzdgg@163.net','About TtzStatusBar',MB_OK + MB_ICONINFORMATION);
end;
function TAboutProperty.GetAttributes: TPropertyAttributes;
begin
Result:= [paDialog,paReadOnly];
{ _____|
|
//双击属性弹出一个窗口}
end;
function TAboutProperty.GetValue: string;
begin
Result:= '(About...)';
end;
end.