ダイアログBox等が表示される直前を察知するには?

解決


トマト  2005-03-04 03:40:03  No: 13535

PaintBox上にダイアログBox等が表示される時その直前(表示される前)を自動的に察知できますでしょうか?


Mr.XRAY  URL  2005-03-04 06:13:46  No: 13536

>ダイアログBox等

ってなんでしょか.以下の様なことですか.
新規プロジェクトのFormにTOpenDialogとTButtonを配置.
そのOnShowイベントを作成.

procedure TForm1.Button1Click(Sender: TObject);
begin
     if OpenDialog1.Execute then begin
     end;
end;

procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
     ShowMessage('開くよ!! ');
end;


トマト  2005-03-04 06:37:20  No: 13537

Mr.XRAY様
ありがとうございます。

>ダイアログBox等
とは、TOpenDialogや別フォームのことです。

自作コンポーネント(TPaintBox継承)で後書き線処理をするためにこれらが呼び出される直前を知りたいのです。


Mr.XRAY  URL  2005-03-04 09:54:44  No: 13538

よく状況がわからないのですが,OnShowが使えないというこですか.
TOpenDialogを継承したコンポーネントであれば,OnShowも自動的に
オブジェクトインスペクタに現れますから,使用可能です.

それともTOpenDialogを継承したコンポーネントを作成し,
その中でOnShowの前で何か処理をしたいということなんでか.
いづれにしても,掲示板を読んでいる方が,何をしたいか考えなければ
ならないのは.... ちょっとね〜.

後の仕様でしたら,DoShowをoverrideします.ヘルプのTOpenDialogのと
メソッドの一覧のところをお読み下さい.例えば以下の様に...
(コードは一部省略しています)

type
  TMyOpenDialog = class(TOpenDialog)
  private
  protected
    procedure DoShow; override;
  public
  published
  end;

implementation

procedure TMyOpenDialog.DoShow;
begin
     //表示前の処理
     inherited;
end;


トマト  2005-03-04 19:43:04  No: 13539

Mr.XRAY様
ありがとうございます。
自作コンポーネント内のコードに、TOpenDialogや別フォームが表示される直前(自作コンポーネントの前面に表示される直前)にある処理を記入したいのですが、、、


Mr.XRAY  URL  2005-03-04 21:27:03  No: 13540

先に提示したTMyOpenDialogのようなコードでは希望の動作ができなかった
ということでしょうか.


トマト  2005-03-04 22:32:09  No: 13541

Mr.XRAY様
なんどもすみません。
説明が悪くて。。。

Form1にファイルを開くTOpenDialog1を設置して、それが開く直前を自作コンポーネント(TPaintBox継承)で自動で察知できないのかなぁと思っています。

自作コンポーネントにTOpenDialog1が開いたときのためのプロパティを作成してTOpenDialog1を開く時にそれに書き込めば済むことなのですが、、、自動で察知したいのです。

今はこの方法で処理しています。
開く直前を察知できるAPI関数などないのでしょうか?


たかみちえ  URL  2005-03-05 00:05:25  No: 13542

ポイントは2つ
・自分が作ってるコンポーネントはグラフィックコントロール(TGraphicControl継承)である
・別フォームに移動したときや、ダイアログが表示されたときに特別な処理を行いたい
  ですね?

  でしたら、「グラフィックコントロールをおいてあるフォームが"非アクティブに"なったとき」としてまとめられませんか?
それでしたら、親フォームのOnActiveイベントで処理を行うとか、親フォームをサブクラス化してWM_ACTIVEを拾うなりして対処が可能です。


トマト  2005-03-05 01:56:57  No: 13543

たかみちえ様
アドバイスありがとうございます。

>親フォームをサブクラス化してWM_ACTIVEを拾うなりして

具体的にはどのように書けばよろしいでしょうか?
初心者のためサブクラス化のやり方もよくわからないありさまです。

また、この方法は私が先ほど書いた現在の対処方法にくらべてより簡素な書き方になりますか?


たかみちえ  URL  2005-03-05 03:16:50  No: 13544

WM_ACTIVEじゃなくて、WM_ACTIVATEですね(^^ゞ失礼しました。

> 具体的にはどのように書けばよろしいでしょうか?
  ヘルプのWindowProc のページをご覧ください、"例"に簡単なサブクラス化のやりかたが載っています。
ただ、WM_ACTIVATEは、例にあるようなWM_STYLEMESSAGEとは違いユーザー定義のメッセージではないので、必ず元のWndProcに渡されるようにします。
------
if Message.Msg = WM_ACTIVATE then
  処理
else
  WndProc(Message);
------
ではなく
------
if Message.Msg = WM_ACTIVATE then
  処理;
WndProc(Message);
------
ということです。

> また、この方法は私が先ほど書いた現在の対処方法にくらべてより簡素な書き方になりますか?
  あくまでコンポーネントにまとめたいんですよね?でしたら簡素以前に、この方が汎用的かと思いますが。


Mr.XRAY  URL  2005-03-05 04:49:12  No: 13545

> また、この方法は私が先ほど書いた現在の対処方法にくらべてより簡素な書き方になりますか?

たかみちえさんがレスしていますが,動作仕様を満たすためには,コードが
長くなったり,またまだ自分が知らないことを取り入りたりすることも必要
でしょう.そうして,コーディングの知識を増やしていくわけです.

ところで,どうも勘違いしてたようです.TOpenDialogの方と...
これは目的の仕様に沿うかどうかはわかりませんが,
もし,必ずOpenDialogを使うのであれば,その自作のPaintBoxにダイアログ
を組込んでしまう手もあります.例えばこんなコンポーネントです.

unit MyPaintBox;

interface

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

type

  TMyPaintBox = class(TPaintBox)
  private
    { Private 宣言 }
    FOpenDialog : TOpenDialog;
    FReadDir     : String;
    procedure MyOpenDialogOnShow(Sender: TObject);
  protected
    { Protected 宣言 }
  public
    { Public 宣言 }
    constructor Create(AOwner: TComponent);override;
    destructor Destroy; override;
    property OpenDilalog : TOpenDialog read FOpenDialog;
  published
    { Published 宣言 }
    property ReadDir : String read FReadDir write FReadDir;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('plXRAY', [TMyPaintBox]);
end;

{ TMyPaintBox }

constructor TMyPaintBox.Create(AOwner: TComponent);
begin
     inherited Create(AOwner);
     FOpenDialog:=TOpenDialog.Create(Self);
     FOpenDialog.OnShow:=MyOpenDialogOnShow;
     FReadDir := 'C:\';
     FOpenDialog.InitialDir:=ReadDir;
end;

destructor TMyPaintBox.Destroy;
begin
     FOpenDialog.Free;
     inherited;
end;

procedure TMyPaintBox.MyOpenDialogOnShow(Sender: TObject);
begin
     ShowMessage('BBB');
end;

end.

説明は省略します.使い方は,

procedure TForm1.Button1Click(Sender: TObject);
begin
     if MyPaintBox1.OpenDilalog.Execute then begin
     end;
end;


Mr.XRAY  URL  2005-03-06 05:04:31  No: 13546

何故先程のコードのようにOpenDialogをTPaintBoxを継承したコンポに
組込んだのかということですが,

開発したコンポーネンで,特定の,今回の例で言えば,
OpenDialog1,Form1などの名前のものが表示されたことを検出する方法
は,コンポーネントの汎用性がなくなると思ったからです.

もし,そのコンポでOpenDialogや他のFormを使用するのであれば,
それらをプロパティにすれば,そのプロパティの設定で処理が可能
です.また使用しないこともできます.

常に使用するのであれば,先程のように組込んだ方がいいのではない
でしょうか.これは,

>TOpenDialog1が開いたときのためのプロパティを作成してTOpenDialog1を開く時にそれに書き込めば

と考え方は同じです.この方法の方が汎用性があると私は思います.


トマト  2005-03-06 07:52:37  No: 13547

Mr.XRAY 様
何度もすみません。
後書き線処理はOpenDialogに限らず自作コンポーネント(TPaintBox継承)の
前面に表示されるものすべてが対象です。そのフォームなりダイアログBOX
が表示される直前に線を消す処理をしたいのです。ご親切にソースまでいただいていながら利用できないでいます。
しかしながら、
>TOpenDialog1が開いたときのためのプロパティを作成してTOpenDialog1を
>開く時にそれに書き込めば
で一様うまくいっていますので私の力量からしてこれで我慢です。

ありがとうございました。


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

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






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