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