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


クリエイト  2004-03-17 09:09:26  No: 7699  IP: [192.*.*.*]

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

編集    削除
おおさわ  URL  2004-03-17 09:59:38  No: 7700  IP: [192.*.*.*]

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

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

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

編集    削除
jok  2004-03-17 10:09:06  No: 7701  IP: [192.*.*.*]

>   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  IP: [192.*.*.*]

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

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

編集    削除
jok  2004-03-17 11:11:46  No: 7703  IP: [192.*.*.*]

> 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  IP: [192.*.*.*]

質問のタイトルと

>  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  IP: [192.*.*.*]

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

編集    削除
クラ  2004-03-24 08:21:41  No: 7706  IP: [192.*.*.*]

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

編集    削除