最近我开始了一个有很多表单,框架和额外控件的项目,所以我的应用程序膨胀了,我在我的项目中使用了3个exes(全部在Delphi 2009中制作),这些应用程序也共享相同的框架和表单。所以我用dll分享这些表格。
但是问题出现了不同的Tfont错误。所以我在网上进行了评论,并附上答案说选择|使用运行时包构建。然后每件事情都开始完美运行
但是当我检查Windows Taskmanager时memusage它是~21 500 kb(21.5 mb)。(但是如果没有Build with runtime packages,mem的使用量只有2000 kb,还包括通过在所有3个exe项目中添加它来手动创建帧)我的编译器也很慢,启用了Build with运行时包
现在我必须用 3 exes + delphi bpl运行时包+ dll
分发项目但是我想知道memusage是如何增加的,我只想要分发 3 exes + dll (只是正常的delphi exes被分发)我甚至使用了内存管理器但没有工作
如何解决这个问题
这是我使用的代码
在exe
中procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame =Function( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall ;
var
GetTheFrame : TGetTheFrame;
begin
try
GetTheFrame(application,TabSheet1).Free ;
except
end;
frm := GetTheFrame(application,TabSheet1) ;
dllHandle := LoadLibrary('project1.dll') ;
if dllHandle <> 0 then
begin
GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ;
frm := GetTheFrame(application,TabSheet1) //call the function
{ ShowMessage('error function not found') ;
FreeLibrary(dllHandle) ; }
end
else
begin
ShowMessage('xxxx.dll not found / not loaded') ;
end
在dll中
uses
Windows,
Messages,
SysUtils,
Classes,
Forms,StdCtrls, Controls,
Unit2 in 'Unit2.pas' {Frame2: TFrame};
{$R *.res}
Function GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
Result := TFrame2.Create( Owner );
Result.Parent := TheParent;
End;
exports gettheframe;
begin
end.
最后如何在没有使用运行时包装构建的情况下完成所有这些
不仅仅是内存问题,请告诉我如何在没有buildwithruntime软件包的情况下创建这样的应用程序
答案 0 :(得分:3)
1)我认为它很自然,特别是如果有很多物体/图像等,如果你将一些图像/表格等移动到dll作为资源怎么样。然后在需要时调用它,如果没有则释放。
2)尝试检查内存泄漏。我之前遇到同样的问题,当我的程序启动时,内存使用量越来越大。尝试使用FastMM4。
3)排除一些未使用的bpls。因为即使你不使用它也会创建运行时。例如“InterBaseDriver; DBXMySQLDriver; dbexpress; dbxcds; VirtualTreesD12等......”我没有使用它,所以我不会删除它。试着了解你曾经使用过的所有单位。
答案 1 :(得分:1)
不要将dll用于你的帧,而是使用bpl。
因此,创建一个新包,在其中添加框架的代码。在您的应用程序中,将该单元与框架一起使用,并像通常那样调用TFrame2.Create(Self);
,如果您没有dll的话。
在exe中:
procedure TForm1.Button1Click(Sender: TObject);
var
MyFrame: TFrame2;
begin
MyFrame := TFrame2.Create(Tabsheet1);
MyFrame.Parent := Tabsheet1;
end;