プログラムスタートと同時に処理をさせるには?


クリエイト  2004-03-17 09:09:26  No: 7699

プログラムが、起動したと同時に処理をスタートするプログラムを
作成したいと思い、FormCreateイベントに処理の開始を記述しました。
  ところが、実際動かしてみると、FormCreateイベントというのは、
Formの生成の開始をつかむイベントのようで、Formが表示される前に
処理が終了してしまいます。
  そこで、OnActivateイベントに処理を記述しましたが、多少改善された
ものの、大差ありません。
  Formが完全に表示されてから、処理をスタートするには、どんなコ
ーディングをすれば宜しいのでしょうか?
  どなたか、ご教授ください。


おおさわ  URL  2004-03-17 09:59:38  No: 7700

こんにちは。
少し(かなり?)邪道な方法になると思いますが、OnResize イベントはどうでしょうか?
次のような流れで組むと良いと思います。

1. 何かしらフラグを定義しておき、OnCreate イベントが発生したらこれを立てる。
2. フォーム表示後、OnResize イベントが発生するので、もしフラグが立っていたら、ここで実行したい処理を実行して、フラグを下ろす。

これなら、そのあとにフォームのサイズを変更しても(フラグが下りているので)処理が実行されることもありません。


jok  2004-03-17 10:09:06  No: 7701

>   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;


アイドル大好き  2004-03-17 10:30:08  No: 7702

>Formが完全に表示されてから、処理をスタートするには、どんなコーディングをすれば宜しいのでしょうか?

プログラムが完全に表示されるとアイドル状態になるので、
IsFirstフラグなどを使って、OnIdleイベントで一回だけ処理する方法も
良いかと…。


jok  2004-03-17 11:11:46  No: 7703

> 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;


Mr.XRAY  URL  2004-03-18 03:31:27  No: 7704

質問のタイトルと

>  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;


クリエイト  2004-03-18 07:23:54  No: 7705

多くの方から、詳細な解説ありがとうございます。
早速、自分のコードに組み入れて試してみます。


クラ  2004-03-24 08:21:41  No: 7706

かなり的はずれなことかもしれませんが、OnCreateでフォームのVisibleをtrueにしてやるだけじゃいけないんでしょうか・・・?


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

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






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