0

イベントが割り当てられているかどうかを確認し、割り当てられている場合はそれを起動するコードを探しています。

イベントを管理するコードは何ですか?

提案?

AdoQueryに接続され、 を保持するカスタム コンポーネントがありますTField。私のコンポーネントは の を起動しませんがOnSetTextTField他のコンポーネントは の起動を許可しOnSetTextます。理由を見つけようとしています。

わかりました、ここにソースコードがあります:

procedure TForm1.ADOQuery1MydateSetText(Sender: TField; const Text: string);
var
  Garbage:TDateTime;
begin
  if TryStrToDate(text,Garbage) then
    Sender.AsString := Text
  else ShowMessage('so now what?');
end;

Delphi 内で、このコードを呼び出すコードをトレースする方法は?

4

1 に答える 1

7

通常、イベントハンドラーは、次のように宣言されたプロパティで宣言されます。

property OnMyEvent: TMyEvent read FOnMyEvent write FOnMyEvent;

したがって、それを起動するには、コードが実行されるため、コンポーネントのソースコードでへの参照または場合によってFOnMyEventはを検索する必要があります。通常、次のようなものが見つかります。FOnMyEventOnMyEvent

procedure TMyComponent.DoMyEvent;
begin
  if Assigned(FOnMyEvent) then
    FOnMyEvent(Self);
end;

DoMyEvent最後に、と呼ばれる場所を探す必要があります。


実例として、のOnSetTextイベントを使用できますTField。これは次のように宣言されます:

property OnSetText: TFieldSetTextEvent read FOnSetText write FOnSetText;

それがへの唯一の参照OnSetTextです。FOnSetTextしたがって、これにつながるものを探します。

procedure TField.SetEditText(const Value: string);
begin
  if Assigned(FOnSetText) then FOnSetText(Self, Value) else SetText(Value);
end;

現在、SetEditTextはプライベートメソッドであるため、宣言されているユニットの外を見る必要はありません。そして、それが使用される唯一の場所は、:のプロパティセッターとしてですTField.Text

property Text: string read GetEditText write SetEditText;

次に、続行してそのプロパティが割り当てられている場所を探すことができますが、それが発生する場所はたくさんあります。したがって、これらすべてをデバッグする場合は、デバッグDCUを有効にして、内部にブレークポイントを設定する必要がありますTField.SetEditText。ブレークポイントが頻繁に発生することがわかった場合は、コンテンツにブレークポイント条件を設定することをValueお勧めします。

于 2013-03-12T11:47:39.693 に答える