1

Delphi がメイン フォームの子コンポーネントを作成するタイミングがわかりません。

私の中で私は とTMainForm.FormCreate()を呼び出しTIdTCPClient.Connect()ていTIdTCPClient.SendCmd()ます。プログラムは Windows タスク マネージャーに表示されますが、GUI が表示されません。ただし、イーサネット ケーブルを外してプログラムを起動すると、GUI が表示されます。

これは、メイン フォームのFormCraete()メソッドでメイン フォームの子コンポーネントのメソッドを呼び出そうとしているためだと推測しています。

おっと、言い忘れました - はTIdTCPClient設計時にフォームに配置され、実行時に動的に作成されるわけではありません。

任意のコメント?前もって感謝します

4

1 に答える 1

3

The problem is that Indy is blocking, and therefore stops the Create from continuing until the connection is made or times out.

You can fix this by using a custom message that you post to your form in the OnCreate event, that will delay it until the form has been displayed:

const
  UM_DOCONNECTION = WM_USER + 1;

type
  TForm1=class(TForm)
     ...
  private
    procedure UmDoConnection(var Msg: TMessage); message UM_DOCONNECTION;
    ...
  end;

  implementation

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    PostMessage(Handle, UM_DOCONNECTION, 0, 0);
    // Other stuff
  end;

  procedure TForm1.UmDoConnection(var Msg: TMessage);
  begin
    IdTCPClient.Connect;
    IdTCPClient.SendCmd(...);
  end;

The best way, of course, would be to move your Indy stuff into it's own thread so it has no connection to the main thread.

于 2012-08-14T14:31:01.817 に答える