独自イベントを作成するには?

解決


イベント野郎  2014-12-10 03:50:32  No: 46912

言語: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;


  2014-12-10 07:16:05  No: 46913

イベントが起こる前提条件として、検索ダイアログで検索ボタンが必ず押されることになると思いますが、そこのイベント(OnClick)を利用することはできないのでしょうか。


通りすがり  2014-12-10 07:31:01  No: 46914

type
  TForm1 = class(TForm)
    ...
  private
    procedure CustomerFound(Sender: TObject; Costomer: String);
  end;
というようにメインフォーム側に呼び出されるメソッドを用意し、適切な
タイミングで
FrmSearch.OnCustomer := CustomerFound;
とすればいいのでは?外したらすいません。


イベント野郎  2014-12-10 17:47:12  No: 46915

あさん、レスありがとうございます。
>イベントが起こる前提条件として、検索ダイアログで検索ボタンが必ず押されることになると思いますが、

その部分が上述のコードの

procedure TFrmSearch.BtnSerchClick(Sender: TObject);
begin
  FCustomer := EdtSearch.Text;
  Customer;
end;

に相当します。
要するにエディットボックスで入力された文字列を引数にして、「検索」ボタンがクリックされたときに独自イベントをメインフォーム(親画面)に通知したいのですが。


take  2014-12-10 20:47:28  No: 46916

メインフォーム側で検索フォームのユニットを参照するのはもちろんとして
メインフォームから検索フォームを

FrmSearch.Show;
とかして表示できるのですよね?
それであれば

メインフォームの定義に
type
  TFrmMain = class(TForm)
  private
  procedure OnCustomer(Sender: TObject; Customer: string);

を追加定義して

メインフォーム側の生成イベントか何かで
FrmSearch.OnCustomer = OnCustomer;

ってすればイベントを受け取れるのでは?


  2014-12-11 03:44:24  No: 46917

イベントを定義したいとのことですが、このようなページは参考になりますか?
(大まかなイメージはつかんでもらえると思います。)

http://www.geocities.co.jp/SiliconValley-SanJose/2560/delphi4/compo/CustomEvent.htm

  この場合、必要となる手続きをコンポーネント内部で呼び出すか、外部で呼び出す
かだけの違いかと思いますので、今回のように呼び出すタイミングが限定されている
のであれば、先のコメントのような対応でも十分実現可能だと思います。


Mr.XRAY  2014-12-11 19:18:25  No: 46918

質問の文章を読んでも,よく意味が理解できなかったのですが.
こういうことですか ?

http://mrxray.on.coocan.jp/Delphi/Others/006.htm


イベント野郎  2014-12-13 01:35:31  No: 46919

アドバイスを下さったみなさん、どうもありがとうございました。
結局、メインフォーム側を次のようにして解決しました。ご参考までに。

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;

↑この得意先名の検索ロジックが特殊な要件のため、時間がかかり過ぎ、返信が遅くなりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加