⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 set_color.pas

📁 在SQLSERVER数据库查找任一表中的任意数据
💻 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 + -