フォーム生成時にコードでボタンを押して自作ダイアログを表示するには?

解決


デル太  2006-04-30 11:31:11  No: 21259

テスト用に、フォームにボタンを貼り付け、そのボタンをクリックしてログイン用の自作ダイアログを表示しています。
うまく動作できたので、アプリケーション起動時に自動でログインダイアログを表示させたいと思っています。
そこで、TForm1.FormCreateの中で、btnLoginShow.clickとしてみました。
すると、読み込み違反の例外が発生してしまします。

他にも同様のボタンがあり、それは特にエラーはおきません。

btnLoginShow.clickの中で行っている、frmLogin.ShowModalの行に問題があるのでしょうか?

対策を、どこかで読んだような気がするのですが、見つけられずにおります。
自分でも探してみますが、探す糸口などありましたら教えてください。
よろしくお願いします。


kkk  2006-04-30 11:55:07  No: 21260

FormCreateの中では上記のような処理はお勧めできません
多分frmLoginがまだ初期化されていないためだと思われます。
すべての初期化が終了したあとアプリがメッセージループに入った時に動作するように遅延実行してください。
参考は・・・
https://www.petitmonte.com/bbs/answers?question_id=3869
https://www.petitmonte.com/bbs/answers?question_id=3880
メッセージをポストしてメインで準備が出来た時に処理できるようにします。


デル太  2006-04-30 12:41:30  No: 21261

kkkさん、できました!!
ボタンを押せば必要な処理が連続で進んで行くように作りこんでいたので、
起動して、フト気づいたらログインメッセージが表示されていました。
なんか、自分の作っていたものとは別物の感じさえしました。

紹介くださった2件のスレッドをじっくり読んで、何とか構造を把握して、細かいところはわからぬままに、コードを打ち込みました。

結果として、次のようになりました。

interface

uses

const
  WM_DELAYEDSTART = WM_APP+100; //適当な値

type
  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

  protected
    procedure WmDelayedStart(var Msg:TMessage); message WM_DELAYEDSTART;

  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  //メッセージループに入ったときに処理を呼び出すため
  PostMessage(Handle, WM_DELAYEDSTART, 0, 0);
end;

//遅延処理:アプリ起動直後最初に実行する処理
procedure TForm1.WmDelayedStart(var Msg: TMessage);
begin
  btnLoginShow.Click; //ログインダイアログを表示
end;

メッセージを使えると、なんとなくですが、無理の少ない作り方ができそうですね。
kkkさん、こんな短期間で解決できるとは、ほんとうに夢のようです。
ありがとうございます。


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

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






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