言語:Delphi2007 for Win32
OS:Windows7
検索ダイアログを作成しています。
この検索ダイアログはExcelの検索ダイアログのように、表示されたままで検索ボタンをクリックするたびにマッチする文字列(顧客名)を検索するものとして考えています。
このとき、メインフォーム側で OnCustomer イベント(独自イベント)を拾いたいのですが、どうしたらよいでしょうか。
type
TCustomerEvent = procedure(Sender: TObject; Customer: string) of object;
type
TFrmSearch = class(TForm)
Label1: TLabel;
EdtSearch: TEdit;
BtnSerch: TButton;
BtnClose: TButton;
// 検索ボタンクリックイベント
procedure BtnSerchClick(Sender: TObject);
// 閉じるボタンクリックイベント
procedure BtnCloseClick(Sender: TObject);
private
FOnCustomer: TCustomerEvent;
FCustomer: string;
protected
procedure Customer; dynamic;
public
property OnCustomer: TCustomerEvent read FOnCustomer write FOnCustomer;
end;
var
FrmSearch: TFrmSearch;
:
:
procedure TFrmSearch.BtnSerchClick(Sender: TObject);
begin
FCustomer := EdtSearch.Text;
Customer;
end;
:
:
procedure TFrmSearch.Customer;
begin
if Assigned(FOnCustomer) then begin
FOnCustomer(Self, FCustomer);
end;
end;
イベントが起こる前提条件として、検索ダイアログで検索ボタンが必ず押されることになると思いますが、そこのイベント(OnClick)を利用することはできないのでしょうか。
type
TForm1 = class(TForm)
...
private
procedure CustomerFound(Sender: TObject; Costomer: String);
end;
というようにメインフォーム側に呼び出されるメソッドを用意し、適切な
タイミングで
FrmSearch.OnCustomer := CustomerFound;
とすればいいのでは?外したらすいません。
あさん、レスありがとうございます。
>イベントが起こる前提条件として、検索ダイアログで検索ボタンが必ず押されることになると思いますが、
その部分が上述のコードの
procedure TFrmSearch.BtnSerchClick(Sender: TObject);
begin
FCustomer := EdtSearch.Text;
Customer;
end;
に相当します。
要するにエディットボックスで入力された文字列を引数にして、「検索」ボタンがクリックされたときに独自イベントをメインフォーム(親画面)に通知したいのですが。
メインフォーム側で検索フォームのユニットを参照するのはもちろんとして
メインフォームから検索フォームを
FrmSearch.Show;
とかして表示できるのですよね?
それであれば
メインフォームの定義に
type
TFrmMain = class(TForm)
private
procedure OnCustomer(Sender: TObject; Customer: string);
を追加定義して
メインフォーム側の生成イベントか何かで
FrmSearch.OnCustomer = OnCustomer;
ってすればイベントを受け取れるのでは?
イベントを定義したいとのことですが、このようなページは参考になりますか?
(大まかなイメージはつかんでもらえると思います。)
http://www.geocities.co.jp/SiliconValley-SanJose/2560/delphi4/compo/CustomEvent.htm
この場合、必要となる手続きをコンポーネント内部で呼び出すか、外部で呼び出す
かだけの違いかと思いますので、今回のように呼び出すタイミングが限定されている
のであれば、先のコメントのような対応でも十分実現可能だと思います。
質問の文章を読んでも,よく意味が理解できなかったのですが.
こういうことですか ?
http://mrxray.on.coocan.jp/Delphi/Others/006.htm
アドバイスを下さったみなさん、どうもありがとうございました。
結局、メインフォーム側を次のようにして解決しました。ご参考までに。
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, StrUtils,
Controls, Forms, Dialogs, Grids, StdCtrls, Buttons, ExtCtrls, Menus,
・・・
SearchDialog // 得意先名検索ダイアログ
type
TFrmMain = class(TForm)
:
:
// 顧客検索イベント
procedure FindCustomer(Sender: TObject; Customer: string);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
FrmMain: TFrmMain;
FrmSearch: TFrmSearch;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
:
:
// 得意先名検索ダイアログ
FrmSearch := TFrmSearch.Create(Self);
FrmSearch.OnCustomer := FindCustomer;
end;
procedure TFrmMain.FindCustomer(Sender: TObject; Customer: string);
begin
// 得意先名検索のロジックをコーディング
end;
↑この得意先名の検索ロジックが特殊な要件のため、時間がかかり過ぎ、返信が遅くなりました。
ツイート | ![]() |