FormActivateの使い方

解決


デルデル  2006-08-09 10:01:44  No: 22867  IP: 192.*.*.*

新米DELPHIプログラマーのものです。
FormActivateの使い方を教えて欲しいのですが、フォームが
Activateになった時にこの処理に飛んでくると思うのですが、
例えばフォームが何画面もあった場合、メインのFormActivateに
記述すると、他のフォームにいって帰って来た時、また、FormActivate
に処理が飛んでいくと思うのですが、そう考えるとFormActivateは初期化
の役割かなとも思うのですが、どうなのでしょうか?
FormActivateの一般的な使い方を
教えて欲しいのですが、どなたかご教授願います。

編集 削除
HOta  2006-08-09 13:20:21  No: 22868  IP: 192.*.*.*

初期化は、OnCreateでしょう。
OnActivateは、そのフォームにフォーカスが来た時点ですね。
試してみましたか?
「ご教授願います」は嫌いです。

編集 削除
デルデル  2006-08-09 14:40:26  No: 22869  IP: 192.*.*.*

HOtaさん、ありがとうございます。
>試してみましたか?

試してみました。OnCreateの初期化プログラムが起動して1回のみ実行しますよね?
他の人が作ったソースを解析していてOnActivateに記述されてい
るのですが、得にフォームにフォーカスが来た時点で行う処理が必要ない
のでは?と思いむしろ、バグになる要因ではないかと思うのですが、
必要がなければOnActivateは記述する事はないのですか?
形にこだわる必要はないのでしょうか?

「ご教授願います」は失礼しました。

編集 削除
もにゃ  2006-08-09 22:35:24  No: 22870  IP: 192.*.*.*

IP非表示記念、
仕事場から遊びで書きこんでるので、非表示助かります。

OnActivateはTApplication、TCustomFormの二つがあります。
Form1.OnActivareはTCustomFormの方です。
これは同一アプリ間でのフォームのActivate時に発生します。
そのため単一フォームでは始めの一回しか起こりません。
TApplicationは別アプリ間でのActivateイベントですので同一アプリのフォームのactivateには対応していません。

サンプルん
//Unit1
  private
  procedure AppActivate(Sender: TObject);

procedure TForm1.FormActivate(Sender: TObject);
begin
ListBox1.Items.Add('Form1 ' + inttostr(GetTickCount));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //TApplicationのOnActiveイベント
  Application.OnActivate :=AppActivate;
end;

procedure TForm1.AppActivate(Sender: TObject);
begin
ListBox1.Items.Add('App ' + inttostr(GetTickCount));
end;

procedure TForm1.Button2Click(Sender: TObject);
Begin
  //ダイアログではActiveイベントは発生しない
  ShowMessage('test');
end;

//Unit2
procedure TForm2.FormActivate(Sender: TObject);
begin
  ListBox1.Items.Add('Form2 ' + inttostr(GetTickCount));
end;

編集 削除
Hello World  2006-08-10 09:03:13  No: 22871  IP: 192.*.*.*

> FormActivateの一般的な使い方を
> 教えて欲しいのですが、どなたかご教授願います。

「一般的な使い方を」って言ってるのに、「ご教授願います」が嫌だっていうレスもいかがなもんかと。

あと、何をもって一般的というのかわかりませんが、タイマーを貼り付けたフォームがあり、
アクティブになっているときのみ、タイマーを動作させたいとか、抽象的な答えしかない気がする。

> 他の人が作ったソースを解析していてOnActivateに記述されてい
> るのですが、
もにゃ さんのおっしゃる通り、単一のフォームであれば、一回しか発生しません。
初期化をどのタイミングで行いたいかにもよりますので、デルデルさんの言う「他の人」には、
OnActivateが最適だったか、(単一フォームであれば、一回しか発生しないので)たまたまそこに記述しただけか。

自分は、OnActivateやOnCreateのイベントを使わず、constructor Create を
新しく定義しちゃうクチですが。

constructor THogeForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  //初期化
end;

OnCreateより、タイミング遅らせて実行できます。
たいした差ではありませんが、フォームを継承させている場合、役に立つ<かも>しれません。

編集 削除
でるでる  2006-08-11 07:19:19  No: 22872  IP: 192.*.*.*

もにゃさん、Hello World さん、ありがとうございます。
もう少し、勉強してみます。
きっかけみたいなものはわかりました。

編集 削除
HOta  2006-08-11 16:43:45  No: 22873  IP: 192.*.*.*

「ご教授願います」について、「教授する」という言葉がありますが、本来「教授」とは、学問や技芸などをきっちりと体系立てて教える場面に使われる言葉で「教える」を丁寧にしただけとは違う、「重い」言葉となります。ですから、そんな大それた事などできるわけもなく、こんな言葉を使われるとおかしいと思ってしまうのです。単に「教えて下さい」で十分に丁寧だと思うのです。

編集 削除