プロが教えるわが家の防犯対策術!

Delphi XE5 Starterを使っています。
http://delphi.arcadiangarden.com/delphilounge/we …
を参考に(というかそのまま)次のようにしたのですが、コンパイルすると「未定義の識別子TModalResult」と出ます。どこか間違っていますか?
//------------------------------------------------
library TestDll;

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

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

exports
ShowTestForm;

begin
end.

//--------------------------------
unit DllMain;

interface

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

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

var
DllForm: TDllForm;

implementation

{$R *.DFM}

procedure TDllForm.Button1Click(Sender: TObject);
begin
ModalResult := mrOK;
end;

end.

質問者からの補足コメント

  • 回答ありがとうございます。おかげさまでコンパイルはできました。
    でも、テスト用のメインプログラムを作って実行させようとしたところ、
    「...例外により実行を停止しました。...」と表示されます。
    それにメインプログラムのコンパイルでもビルドでも、いつもはできるはずのexeファイルが作成されません。(作成したDLLは実行ファイルと同じディレクトリに置こうと思ったのですが、仕方なくUnit1.pasと同じディレクトリに置いています)
    なぜなんでしょうか?
    メインプログラムは次の補足の通りです。

      補足日時:2015/05/23 10:40
  • //----------------
    unit Unit1;

    interface

    uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

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

    //---次の補足に続きます

      補足日時:2015/05/23 10:42
  • var
    Form1: TForm1;

    implementation

    {$R *.dfm}
    function ShowTestForm(hOwner:HWND):Integer;stdcall;external 'TestDll.dll';

    procedure TForm1.Button1Click(Sender: TObject);
    begin


    if ShowTestForm(Application.Handle) = mrOK then begin
    MessageBeep($FFFFFFFF);
    end;

    end;

    end.

      補足日時:2015/05/23 10:42
  • 動的インポートをすれば、エラーは出ず、DLLのフォームも表示され、exeファイルもいつの間にかできていました。
    ただ、DLLのフォームのボタンを押しても何も応答がありません(DLLのフォームも消えません)。

      補足日時:2015/05/23 11:11

A 回答 (2件)

なんせそのサイトは2001年のときのものですからねえ。


たぶんTModalResultを定義している場所が変わったか、定義自体がなくなったかのどちらかでしょう。

ShowTestFormの返り値は、ShowModalの返り値と同じとしていますから、
TModalResultをIntegerに替えても大丈夫です。
    • good
    • 0

>ただ、DLLのフォームのボタンを押しても何も応答がありません(DLLのフォームも消えません)。



古いバージョンのDelphiですが、作成して実行してみたら問題なく動いています。
XE5でも問題ないはずなんですが。

ひとつひとつ検証していくしかないでしょうね。
1.Dllフォームの右上の閉じるボタンは有効か?
2.ボタンイベントは有効か?
   確認方法は、例えば、
   ModalResult := mrOK;
   の前に、フォームのCaptionに何か表示してみるとか。

プログラマにとって大切なのは、バグのないプログラムを作ることはもちろんですが、バグが発生したとき、いかに早く対処できるかも重要です。
がんばってください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
とりあえず今回はボタンの返り値を必要としないのでなんとかなりそうです。

お礼日時:2015/05/27 08:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!