📄 set_color.pas
字号:
Unit Set_Color;
Interface
Uses
Windows, TypInfo, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls ;
Function PropertyExist(Instance: TPersistent; Const PropName: String): Boolean; //返回控件是否包含属性
Function GetPropKind(Instance: TPersistent; Const PropName: String): TTypeKind; //获取属性的类型
Procedure SetColor(Control: TControl; CanModi: Boolean;OnlyTag:Integer=-1);
Implementation
Function PropertyExist(Instance: TPersistent; Const PropName: String): Boolean; //返回控件是否包含属性
Var
PropInfo: PPropInfo;
Begin
PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, PropName);
Result := (PropInfo <> Nil) And (PropInfo^.PropType^.Kind <> tkUnknown);
End;
Function GetPropKind(Instance: TPersistent; Const PropName: String): TTypeKind; //获取属性的类型
Var
PropInfo: PPropInfo;
Begin
Result := tkUnknown;
PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, PropName);
If (PropInfo <> Nil) Then
Result := PropInfo^.PropType^.Kind;
End;
Procedure SetColor(Control: TControl; CanModi: Boolean;OnlyTag:Integer=-1);
Var
Win: TWinControl;
Kind: TTypeKind; //获取属性的类型
NewColor: TColor;
CanReadOnly: Boolean;
Procedure SetAcceptControl(AccObj: TWinControl);
Var
K: Integer;
Begin
If (csAcceptsControls In AccObj.ControlStyle) Or (csOpaque In Control.ControlStyle) Then Begin
Kind := GetPropKind(AccObj, 'ReadOnLy');
If (Kind = tkEnumeration) Then Begin
SetPropValue(AccObj, 'ReadOnLy', Not CanModi);
Kind := GetPropKind(AccObj, 'Color');
If Kind = tkInteger Then
SetPropValue(AccObj, 'Color', NewColor);
End;
For k := 0 To AccObj.ControlCount - 1 Do Begin
SetColor(AccObj.Controls[k], CanModi, OnlyTag );
End;
End;
End;
Begin
If CanModi Then
NewColor := ClWhite
Else
NewColor := ClBtnFace;
If (csAcceptsControls In Control.ControlStyle) Or (csOpaque In Control.ControlStyle) Then Begin
If Control Is TWinControl Then Begin
Win := Control As TWinControl;
SetAcceptControl(Win);
End;
End
Else Begin
If (csAcceptsControls In Control.ControlStyle) Or (csOpaque In Control.ControlStyle) Then Begin
If Control Is TWinControl Then Begin
Win := Control As TWinControl;
SetAcceptControl(Win);
End;
End
Else Begin
If Control.Tag In [99..199] Then Exit;
If OnlyTag<>-1 Then
If Control.Tag<>OnLyTag Then Exit;
Kind := GetPropKind(Control, 'Color');
If Kind = tkInteger Then Begin
SetPropValue(Control, 'Color', NewColor);
End;
Kind := GetPropKind(Control, 'KeyItems');
CanReadOnly := Kind = tkUnknown;
Kind := GetPropKind(Control, 'ReadOnLy');
If (Kind = tkEnumeration) And CanReadOnly Then Begin
SetPropValue(Control, 'ReadOnLy', Not CanModi);
End
Else Begin
Kind := GetPropKind(Control, 'Enabled');
If Kind = tkEnumeration Then
SetPropValue(Control, 'Enabled', CanModi);
End;
End;
End;
End;
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -