|
kabe さん、こん**は。Hidemi Oya です。
060820 版は未使用ですが、[#448] の
>メインフォームの Createイベントの最後で、データ更新機能を動かすようにしており、データ更新はしているのですが、メモリリークが出たりでまだ実用になりそうもありません。
に関して…。Sample1 のように、メインフォーム OnCreate イベントの最初で Application.Terminate を実行してもメモリリークが発生しますか?
もし発生するなら、Sample2 はどうでしょう?
----- Sample1 -----
-- sample1.dpr --
program sample1;
uses
Forms,
Main in 'Main.pas' {frmMain};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
-- Main.pas --
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TfrmMain = class(TForm)
procedure FormCreate(Sender: TObject);
private { Private 宣言 }
public { Public 宣言 }
end;
function UpdateOnly: boolean;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
uses
Sub;
function UpdateOnly: boolean;
var
i: integer;
begin
Result := false;
for i := 1 To ParamCount do begin
Result := AnsiSameText(ParamStr(i), '/U');
if Result then break;
end;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
if IsUpdated then
with TfrmSub.Create(Self) do begin
ShowModal;
Release;
end;
if UpdateOnly then begin
Application.Terminate;
Exit;
end;
// 本来のメインフォーム OnCreate イベントハンドラ
end;
end.
-- Sub.pas --
unit Sub;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmSub = class(TForm)
private { Private 宣言 }
public { Public 宣言 }
end;
function IsUpdated: boolean;
var
frmSub: TfrmSub;
implementation
{$R *.dfm}
function IsUpdated: boolean;
begin
Result := true; // 本来はアップデートされているかどうかを返す
end;
end.
----- Sample2 -----
-- sample2.dpr --
program sample2;
uses
Forms,
Main in 'Main.pas' {frmMain},
Sub in 'Sub.pas' {frmSub};
{$R *.res}
begin
Application.Initialize;
if IsUpdated then
with TfrmSub.Create(nil) do begin
ShowModal;
Release;
end;
if UpdateOnly then
Application.Terminate // これは不要かも
else begin
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end;
end.
-- Main.pas --
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TfrmMain = class(TForm)
procedure FormCreate(Sender: TObject);
private { Private 宣言 }
public { Public 宣言 }
end;
function UpdateOnly: boolean;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
uses
Sub;
function UpdateOnly: boolean;
var
i: integer;
begin
Result := false;
for i := 1 To ParamCount do begin
Result := AnsiSameText(ParamStr(i), '/U');
if Result then break;
end;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
// メインフォーム OnCreate イベントハンドラ
end;
end.
-- Sub.pas --
unit Sub;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmSub = class(TForm)
private { Private 宣言 }
public { Public 宣言 }
end;
function IsUpdated: boolean;
var
frmSub: TfrmSub;
implementation
{$R *.dfm}
function IsUpdated: boolean;
begin
Result := true; // 本来はアップデートされているかどうかを返す
end;
end.
|
|