加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在其父级接收并失去Delphi焦点时通知控件?

发布时间:2020-12-15 09:18:11 所属栏目:大数据 来源:网络整理
导读:正如标题所说,我希望当一个组件(例如,一个小组)收到并失去焦点时,会通知一个组件(比如一个标签).我在Delphi源代码中漫游了一下,希望使用TControl.Notify,但它只用于通知子控件一些属性更改,如字体和颜色.有什么建议? 解决方法 只要应用程序中的活动控件发生
正如标题所说,我希望当一个组件(例如,一个小组)收到并失去焦点时,会通知一个组件(比如一个标签).我在Delphi源代码中漫游了一下,希望使用TControl.Notify,但它只用于通知子控件一些属性更改,如字体和颜色.有什么建议?

解决方法

只要应用程序中的活动控件发生更改,就会向所有控件广播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衍生物.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读