1

最近、非常に多くのフォーム、フレーム、および追加のコントロールを使用してプロジェクトを開始したため、アプリケーションが膨張し、プロジェクトで3つのexe(すべてDelphi 2009で作成)を使用しています。これらのアプリケーションも同じフレームとフォームを共有しています。だから私はこれらのフォームを共有するためにdllを使用しました。

しかし、別のTfontエラーという問題が発生しました。だから私はオンラインで参照し、選択するという答えを持ってきました| ランタイムパッケージを使用してビルドしますその後、すべてが完璧に機能し始めました

しかし、私がウィンドウズのタスクマネージャーをチェックしたとき| memusageは約21500kb(21.5 mb)です(ただし、me​​mの使用量はランタイムパッケージを使用したビルドなしでわずか2000 kbであり、3つのexeプロジェクトすべてに追加して手動でフレームを含めることもできます)。ランタイムパッケージ

そして今、私は3つのexe +delphibplランタイムパッケージ+dllでプロジェクトを配布する必要があります

しかし、メモリがどのように増加したかを知りたいので、3つのexe + dllのみを配布したい(通常のdelphi exeがどのように配布されるか)メモリマネージャーを使用したことがありますが、機能しませんでした

この問題を克服する方法

これは私が使用したコードです

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パッケージなしでそのようなアプリケーションを作成する方法を教えてください

4

2 に答える 2

3

1)特にオブジェクト/画像などがたくさんある場合は自然だと思います。いくつかの画像/フォームなどをリソースとしてdllに移動する場合はどうでしょうか。次に、必要に応じて呼び出し、そうでない場合は解放します。

2)メモリリークもチェックしてみてください。以前も同じ問題がありました。プログラムを開始すると、メモリ使用量がどんどん大きくなっています。FastMM4を使用してみてください。

3)使用されていない一部のbplsを除外します。使用しなくてもランタイムが作成されるためです。例「InterBaseDriver;DBXMySQLDriver;dbexpress; dbxcds; VirtualTreesD12など。」私はそれを使用しなかったので、それを除外するつもりはありません。uがどのbplに属しているかを知るようにしてください。

于 2010-10-21T09:14:24.073 に答える
1

フレームには dll を使用せず、bpl を使用してください。

新しいパッケージを作成し、フレームのコードを追加します。アプリケーションでは、ユニットをフレームで使用し、TFrame2.Create(Self);dll がない場合に通常行うように呼び出します。

エグゼで:

procedure TForm1.Button1Click(Sender: TObject);
var
  MyFrame: TFrame2;
begin
  MyFrame := TFrame2.Create(Tabsheet1);
  MyFrame.Parent := Tabsheet1;
end;
于 2010-10-21T12:44:34.067 に答える