喫茶XRAYトップページ

[スレッド全体
]

[316] Re8:DllでMainForm以外からのClose Re5:追加返信 削除
2005/6/20 (月) 18:16:57 りおりお
つづき

--------------------

unit DllMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DllUnit2;

type
  TDllForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  DllForm: TDllForm;

implementation

{$R *.dfm}

procedure TDllForm.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TDllForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  if Assigned(DllSubForm) then DllSubForm.Release;
end;

end.

--------------------------

unit DllUnit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TDllSubForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  DllSubForm: TDllSubForm;

implementation

{$R *.dfm}

uses
  DllMain;

procedure TDllSubForm.Button1Click(Sender: TObject);
begin
  DllForm.Close;
end;

end.

--------------------

これで DllSubForm の Button1Click で両方閉じます。

[317] Re9:DllでMainForm以外からのClose Re5:追加返信 削除
2005/6/20 (月) 19:20:14 Syake
▼ りおりおさん
色々ありがとうございます。<m(__)m>

Helpで再確認したところ
「フォームまたはその子フォームのイベントハンドラでは
Free (Delphi) のかわりに Releaseを使う必要があります。
そうしないと,メモリアクセスエラーが発生することがあ
ります。」と親切に書いてありました。
procedure TfrmMain.FormClose(Sender: TObject;
        var Action: TCloseAction);
begin
   //frmMain.Free;
   Action := caFree;
   //frmSub.Free;{これは駄目でした}
  //if Assigned(frmSub) then frmSub.Release;{}
  frmSub.Release;
end;

この場合の Action := caFree と frmMain.Freeは同じ意味
で、動作に支障は無い。
frmMain以外のFormは「Release」としなければならない。
と、言うことでしょうか。

う〜む、では何でFrmMainからCloseしたら何もエラーが
出なかったのだろうか?
「メモリアクセスエラーが発生することがあります。」
だから、たまたまって事で、やはり「Release」て事かな。


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82