喫茶XRAYトップページ

[スレッド全体
]

[315] Re7:DllでMainForm以外からのClose Re5:追加返信 削除
2005/6/20 (月) 18:15:36 りおりお
こんにちは。

なにも問題なさそうですけど。

--------------- Exe ---------------------

function ShowTestForm(hOwner:HWND):HWND;stdcall;
                               external 'TestDll.dll' name 'ShowTestForm';

function ShowSubForm(hOwner:HWND):HWND;stdcall;
                               external 'TestDll.dll' name 'ShowSubForm';

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowTestForm(Application.Handle);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowSubForm(Application.Handle);
end;

---------------- DLL --------------------

--------------- project

library TestDll;

uses
  Forms,
  Windows,
  Controls,
  DllMain in 'DllMain.pas' {DllForm},
  DllUnit2 in 'DllUnit2.pas' {DllSubForm};

function ShowTestForm(hOwner:HWND):HWND;stdcall;
begin
  //Application.Handle := hOwner;
  DllForm := TDllForm.Create(Application);
  result := DllForm.Handle;
  DllForm.Show;
  //Application.Handle := 0;
end;

function ShowSubForm(hOwner:HWND):HWND;stdcall;
begin
  //Application.Handle := hOwner;
  DllSubForm := TDllSubForm.Create(Application);
  result := DllSubForm.Handle;
  DllSubForm.Show;
  //Application.Handle := 0;
end;

exports
  ShowTestForm,
  ShowSubForm;

begin
end.

[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