0

の値を変更するモソドを呼び出すことによって、OnChangeのイベントを介してスレッドから応答を取得するのは正しい方法ですか?EditboxsynchronizeEditbox

このようなもの :

//Extra Thread
procedure HThread.Execute;
begin
    Synchronize(CallGUI);
end;

procedure HThread.CallGUI;
begin
  Edit.Text = 'Hello';
end;


//Main Thread
procedure Main;
begin
  Tr := HThread.Create(true);
  Tr.Edit := Form1.Edit1;
  Tr.Resume;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  ShowMessage('Response from extra thread :' + Edit1.text);
end;
4

3 に答える 3

3

TEditいくつかの理由から、の使用は面倒です。

  • スレッドからのデータ転送の場所としてを使用しているようですTEdit(イベントハンドラーに依存しているため、単純な「出力領域」としては使用されないためOnChange、さらに処理が必要であると思われます)。TEditパフォーマンスからOOPカプセル化に至るまで、また制御できないアルゴリズムに依存するなど、さまざまな理由から、GUI要素をデータストレージに使用しないでください。
  • OnChangeプログラムでテキストを変更したときに発生するイベントハンドラーに依存するのは、の実装の詳細に依存することですTEditOnChange変更がプログラムで行われた場合、Microsoftがイベントを発生させないことを決定した場合はどうなりますか?または、Embarcaderoは、プログラマーがその値を変更したことを通知する必要がないため、条件付きでそれを表示しないことにしましたか?

それ以外の場合は、Syncronize()おそらく「使用できます」という使用は機能しますが、それは良い考えではないと思います。より良い解決策を提案したいのですが、あなたが何をしようとしているのか正確にはわからないため、それはできません。強制的OnChangeに解雇するだけの場合は、コードを保持します。

于 2011-04-20T11:50:41.213 に答える
2

スレッドから経由で呼び出されたプロシージャでEditBoxテキスト値を変更するとSynchronize()、割り当てられOnChangeたイベントはGUIスレッドで実行されます。これは問題なく機能しますが、イベントが処理されるとスレッドが停止します。

于 2011-04-20T10:55:08.727 に答える
0

あなたがそれを意味するならば、経由でUIで何かを変更することSynchronize()は正しい方法です。しかし、あなたの質問の残りの部分を理解したかどうかはわかりません。

于 2011-04-20T10:40:06.630 に答える