6

タイトルにあるように、コンポーネント(たとえば、 )が(たとえば、)を受け取り、フォーカスを失ったlabelときに通知を受け取りたいのですが。を使用することを期待して、Delphiソースを少しさまよいましたが、これは、フォントや色などのプロパティの変更を子コントロールに通知するためにのみ使用されます。助言がありますか?panelTControl.Notify

4

1 に答える 1

8

アプリケーションのアクティブなコントロールが変更されるたびに、CM_FOCUSCHANGEDメッセージがすべてのコントロールにブロードキャストされます。単にそれを傍受し、それに応じて行動します。

また、親(たとえば、パネル)がフォーカスを受け取って失うときまでに、その親/パネルの(ネストされた)子コントロールがフォーカスを受け取ったり失ったりするときはいつでも意味すると仮定しました。

type
  TLabel = class(StdCtrls.TLabel)
  private
    function HasCommonParent(AControl: TWinControl): Boolean;
    procedure CMFocusChanged(var Message: TCMFocusChanged);
      message CM_FOCUSCHANGED;
  end;

procedure TLabel.CMFocusChanged(var Message: TCMFocusChanged);
const
  FontStyles: array[Boolean] of TFontStyles = ([], [fsBold]);
begin
  inherited;
  Font.Style := FontStyles[HasCommonParent(Message.Sender)];
end;

function TLabel.HasCommonParent(AControl: TWinControl): Boolean;
begin
  Result := False;
  while AControl <> nil do
  begin
    if AControl = Parent then
    begin
      Result := True;
      Break;
    end;
    AControl := AControl.Parent;
  end;
end;

サブクラス化したくない場合は、以下TJvGradientHeaderを使用してこれを一般的に設計することができますScreen.OnActiveControlChange

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FHeaders: TList;
    procedure ActiveControlChanged(Sender: TObject);
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FHeaders := TList.Create;
  FHeaders.Add(Label1);
  FHeaders.Add(Label2);
  Screen.OnActiveControlChange := ActiveControlChanged;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FHeaders.Free;
end;

function HasCommonParent(AControl: TWinControl; AMatch: TControl): Boolean;
begin
  Result := False;
  while AControl <> nil do
  begin
    if AControl = AMatch.Parent then
    begin
      Result := True;
      Break;
    end;
    AControl := AControl.Parent;
  end;
end;

procedure TForm1.ActiveControlChanged(Sender: TObject);
const
  FontStyles: array[Boolean] of TFontStyles = ([], [fsBold]);
var
  I: Integer;
begin
  for I := 0 to FHeaders.Count - 1 do
    TLabel(FHeaders[I]).Font.Style :=
      FontStyles[HasCommonParent(Screen.ActiveControl, TLabel(FHeaders[I]))];
end;

これがデリバティブTLabelに対しても機能することを示すことを選択したことに注意してください。TControl

于 2012-09-16T10:20:10.527 に答える