プログラムが、起動したと同時に処理をスタートするプログラムを
作成したいと思い、FormCreateイベントに処理の開始を記述しました。
ところが、実際動かしてみると、FormCreateイベントというのは、
Formの生成の開始をつかむイベントのようで、Formが表示される前に
処理が終了してしまいます。
そこで、OnActivateイベントに処理を記述しましたが、多少改善された
ものの、大差ありません。
Formが完全に表示されてから、処理をスタートするには、どんなコ
ーディングをすれば宜しいのでしょうか?
どなたか、ご教授ください。
こんにちは。
少し(かなり?)邪道な方法になると思いますが、OnResize イベントはどうでしょうか?
次のような流れで組むと良いと思います。
1. 何かしらフラグを定義しておき、OnCreate イベントが発生したらこれを立てる。
2. フォーム表示後、OnResize イベントが発生するので、もしフラグが立っていたら、ここで実行したい処理を実行して、フラグを下ろす。
これなら、そのあとにフォームのサイズを変更しても(フラグが下りているので)処理が実行されることもありません。
> Formが完全に表示されてから、処理をスタートするには、どんなコ
> ーディングをすれば宜しいのでしょうか?
なにをなさりたいのかによると思いますが、起動してフォームが表示さ
れるまでのイベントハンドラの呼び出し順序は、試したところでは
OnCreate
OnShow
OnActivate
OnResize
OnPaint
です。OnPaint の後のタイミングをつかみ、かつ、起動時の一回だけよば
れるようにするには、以下のようにします。
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormPaint(Sender: TObject);
private
{ Private 宣言 }
public
procedure WMApp111(var Msg:TMessage);message WM_APP+111;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMApp111(var Msg: TMessage);
begin
// ここにコードを書く
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
OnPaint := nil;
PostMessage(Handle,WM_APP+111,0,0);
end;
>Formが完全に表示されてから、処理をスタートするには、どんなコーディングをすれば宜しいのでしょうか?
プログラムが完全に表示されるとアイドル状態になるので、
IsFirstフラグなどを使って、OnIdleイベントで一回だけ処理する方法も
良いかと…。
> OnIdleイベントで一回だけ処理する方法
おっ、そうですね。試してみました。たしかに OnPaint のあとになります。
これはいいですね。
procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
ApplicationEvents1.OnIdle := nil; // 一回だけ!
Memo1.Lines.Add('First Idle');
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Memo1.Lines.Add('Paint');
end;
質問のタイトルと
> Formが完全に表示されてから、処理をスタートするには、どんなコ
>ーディングをすれば宜しいのでしょうか?
処理の内容にもよりますが,以下の様に,Formの表示終了イベント内で,
という考え方もあるかも知れません.
処理をスタートさせるというわけではなく,単に表示終了の時期に何か
をするコードですが.
# ちょっと意味が違うかもしれませんね...
type
TForm1 = class(TForm)
private
procedure CMShowingChanged(var Msg:TMessage);Message
CM_SHOWINGCHANGED;
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.CMShowingChanged(var Msg: TMessage);
begin
inherited;
Update; //必要に応じて...
if Visible then ShowMessage('Formが表示されたよ');
end;
多くの方から、詳細な解説ありがとうございます。
早速、自分のコードに組み入れて試してみます。
かなり的はずれなことかもしれませんが、OnCreateでフォームのVisibleをtrueにしてやるだけじゃいけないんでしょうか・・・?
ツイート | ![]() |