1

ここにあるクラスにいくつかのログ機能を実装したいと考えています。基本的に、私の考えは、ログを含むクラス内に TStringList を作成することです。問題なくこれを行うことができますが、私の質問は、含まれているフォームが存在する場合にコントロール (TMemo または TListBox) がコンテンツを動的に表示できるように、クラスの外部に公開する方法です。クラス内のコントロールに直接関連付けることもできますが、クラスをフォーム コード自体から目立たないようにして、この関連付けを行うクラス内にプロシージャを作成したいと考えています。

基本的に、クラスにLogFile: TStringListがある場合、そこに行を追加すると、クラスとは別のフォームから TMemo に表示されるようにするにはどうすればよいですか?

4

1 に答える 1

1

フォームがクラスにコールバック イベントを登録できるようにします。

リストにアイテムを追加するときにこのイベントが割り当てられている場合は、コールバックを使用して文字列を送信します。

Type
  TMyCallback = procedure(const aLogStr: String) of object;

  TMyClass = Class
    private
      FCallback : TMyCallback;
      FLogFile : TStringList;
      procedure SetCallback(ACallback: TMyCallback);
    public
      property Callback : TMyCallback write SetCallback;
  end;

...
// Update FLogFile
FLogFile.Items.Add(SomeText);
if Assigned(FCallback) then
  FCallBack(SomeText);
...

あなたのフォームクラスで:

Type
  TMyForm = Class(TForm)
    private
      procedure IncomingLogString(const AStr: String);
  end;

procedure TMyForm.IncomingLogString(const AStr: String);
begin
  MyMemo.Lines.Add(AStr);
end;

...
// Register callback
FMyClass.Callback := Self.IncomingLogString;

これでTMyClass、フォームからの依存関係が切り離されました。

于 2013-10-07T22:20:47.663 に答える