テスト用に、フォームにボタンを貼り付け、そのボタンをクリックしてログイン用の自作ダイアログを表示しています。
うまく動作できたので、アプリケーション起動時に自動でログインダイアログを表示させたいと思っています。
そこで、TForm1.FormCreateの中で、btnLoginShow.clickとしてみました。
すると、読み込み違反の例外が発生してしまします。
他にも同様のボタンがあり、それは特にエラーはおきません。
btnLoginShow.clickの中で行っている、frmLogin.ShowModalの行に問題があるのでしょうか?
対策を、どこかで読んだような気がするのですが、見つけられずにおります。
自分でも探してみますが、探す糸口などありましたら教えてください。
よろしくお願いします。
FormCreateの中では上記のような処理はお勧めできません
多分frmLoginがまだ初期化されていないためだと思われます。
すべての初期化が終了したあとアプリがメッセージループに入った時に動作するように遅延実行してください。
参考は・・・
https://www.petitmonte.com/bbs/answers?question_id=3869
https://www.petitmonte.com/bbs/answers?question_id=3880
メッセージをポストしてメインで準備が出来た時に処理できるようにします。
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さん、こんな短期間で解決できるとは、ほんとうに夢のようです。
ありがとうございます。
ツイート | ![]() |