PaintBox上にダイアログBox等が表示される時その直前(表示される前)を自動的に察知できますでしょうか?
>ダイアログ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;
Mr.XRAY様
ありがとうございます。
>ダイアログBox等
とは、TOpenDialogや別フォームのことです。
自作コンポーネント(TPaintBox継承)で後書き線処理をするためにこれらが呼び出される直前を知りたいのです。
よく状況がわからないのですが,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;
Mr.XRAY様
ありがとうございます。
自作コンポーネント内のコードに、TOpenDialogや別フォームが表示される直前(自作コンポーネントの前面に表示される直前)にある処理を記入したいのですが、、、
先に提示したTMyOpenDialogのようなコードでは希望の動作ができなかった
ということでしょうか.
Mr.XRAY様
なんどもすみません。
説明が悪くて。。。
Form1にファイルを開くTOpenDialog1を設置して、それが開く直前を自作コンポーネント(TPaintBox継承)で自動で察知できないのかなぁと思っています。
自作コンポーネントにTOpenDialog1が開いたときのためのプロパティを作成してTOpenDialog1を開く時にそれに書き込めば済むことなのですが、、、自動で察知したいのです。
今はこの方法で処理しています。
開く直前を察知できるAPI関数などないのでしょうか?
ポイントは2つ
・自分が作ってるコンポーネントはグラフィックコントロール(TGraphicControl継承)である
・別フォームに移動したときや、ダイアログが表示されたときに特別な処理を行いたい
ですね?
でしたら、「グラフィックコントロールをおいてあるフォームが"非アクティブに"なったとき」としてまとめられませんか?
それでしたら、親フォームのOnActiveイベントで処理を行うとか、親フォームをサブクラス化してWM_ACTIVEを拾うなりして対処が可能です。
たかみちえ様
アドバイスありがとうございます。
>親フォームをサブクラス化してWM_ACTIVEを拾うなりして
具体的にはどのように書けばよろしいでしょうか?
初心者のためサブクラス化のやり方もよくわからないありさまです。
また、この方法は私が先ほど書いた現在の対処方法にくらべてより簡素な書き方になりますか?
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);
------
ということです。
> また、この方法は私が先ほど書いた現在の対処方法にくらべてより簡素な書き方になりますか?
あくまでコンポーネントにまとめたいんですよね?でしたら簡素以前に、この方が汎用的かと思いますが。
> また、この方法は私が先ほど書いた現在の対処方法にくらべてより簡素な書き方になりますか?
たかみちえさんがレスしていますが,動作仕様を満たすためには,コードが
長くなったり,またまだ自分が知らないことを取り入りたりすることも必要
でしょう.そうして,コーディングの知識を増やしていくわけです.
ところで,どうも勘違いしてたようです.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;
何故先程のコードのようにOpenDialogをTPaintBoxを継承したコンポに
組込んだのかということですが,
開発したコンポーネンで,特定の,今回の例で言えば,
OpenDialog1,Form1などの名前のものが表示されたことを検出する方法
は,コンポーネントの汎用性がなくなると思ったからです.
もし,そのコンポでOpenDialogや他のFormを使用するのであれば,
それらをプロパティにすれば,そのプロパティの設定で処理が可能
です.また使用しないこともできます.
常に使用するのであれば,先程のように組込んだ方がいいのではない
でしょうか.これは,
>TOpenDialog1が開いたときのためのプロパティを作成してTOpenDialog1を開く時にそれに書き込めば
と考え方は同じです.この方法の方が汎用性があると私は思います.
Mr.XRAY 様
何度もすみません。
後書き線処理はOpenDialogに限らず自作コンポーネント(TPaintBox継承)の
前面に表示されるものすべてが対象です。そのフォームなりダイアログBOX
が表示される直前に線を消す処理をしたいのです。ご親切にソースまでいただいていながら利用できないでいます。
しかしながら、
>TOpenDialog1が開いたときのためのプロパティを作成してTOpenDialog1を
>開く時にそれに書き込めば
で一様うまくいっていますので私の力量からしてこれで我慢です。
ありがとうございました。
ツイート | ![]() |