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

📄 customunit.pas

📁 运行时设计控件的一个小例子
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit CustomUnit;

interface

Uses
  Windows, SysUtils, Classes, Forms, XMLIntf, ADODB, Controls, bsSkinBoxCtrls,
  bsSkinData, uDrag, StdCtrls, Messages, DB, bsdbctrls, bsDBGrids, XMLDoc, xmldom,
  Dialogs;

Type
  TAppIO = class
    private

    public
      constructor Create;
      destructor Destroy; override;
      Function LoadSetup(XMLPath : String;pNode : IXMLNode):Boolean;virtual;
      Function SaveSetup(XMLPath : String;pNode : IXMLNode):Boolean;virtual;
  End;

  //-------------- 声明一个自定义类 ------------------------------------------//
  TCustomClass = class
    private
      FComponentField : TStrings;    //显示控件的绑定数据字段
      FMathConstr     : TStrings;    //公式另列表
      FComponentName  : TList;       //保存所有动态控件的列表
      FComponentCount : Integer;     //控件的个数
      FCustomDrag     : Boolean;     //设置是否可以在运行期托动
      FParentControl  : TWinControl; //控件的父类
      FTemControl     : TWinControl;
      bsSkinEdit: TbsSkinDBEdit;
      bsSkinDBComboBox: TbsSkinDBComboBox;
      bsSkinDBMemo: TbsSkinDBMemo;
      dsLabel   : TLabel;
      FSkinData : TbsSkinData;
      CustomDragClass : TDragClass;  //声明可托动类
      FSelectControl  : TControl;    //得到当前选择得控件
      FSelectControlIndex : Integer; //得到当前选择得控件得索引
      FDataSet : TADODataSet;        //使用的数据集,其实只要ADOConnection1
      FConMouseup :TMouseEvent;       //未使用
      FOnClick    :TNotifyEvent;
      FOnChange   :TNotifyEvent;
      XMLDoc1: TXMLDocument;
      FCurrentNode, FParentNode : IXMLNode;
      FCurrentColumns : TbsColumn;
      FMathStr : String;
      //procedure OnClick(Sender : TObject);
    protected
      procedure CreateLabel(Name, Title:String;Parent:TWinControl;
          Top,Left,Width,Height:Integer;bsSkinData: TbsSkinData);    
      procedure CreateBSEdit(Name, Title, FieldName:String;Parent:TWinControl;
          Top,Left,Width,Height:Integer;bsSkinData: TbsSkinData);
      procedure CreateComboBox(Name, Title, FieldName:String;Parent:TWinControl;
          Top,Left,Width,Height:Integer;bsSkinData: TbsSkinData);
      procedure CreateMemo(Name, Title, FieldName:String;Parent:TWinControl;
          Top,Left,Width,Height:Integer;bsSkinData: TbsSkinData);          
      procedure SetCustomDrag(CanDrag : Boolean); //开启控件的拖动
      Function GetSelectControl : TControl;
      Function ExeStrMath(str: String):String;
      Function ReadMathStr():String;
      procedure WriteFMathStr(str: String);
    public
      constructor Create(AOwner : TComponent);
      destructor Destroy; override;
      //动态创建控件的主函数
      Function CreateComponentDynamic(DS_Component : TADODataSet;Parent : TWinControl;
          bsSkinData: TbsSkinData):Boolean;
      Function AddComponentDynamic(CoType:Integer;DesignParent:TWincontrol;ExecuteParent:String;DS_Component: TADODataSet;bsSkinData: TbsSkinData):Boolean;
      procedure DeleteSelectComponent;
      Function ShowFieldDataByDS(DS_table : TADODataSet;ExecuteParent:String):Boolean;
      Function ShowDataByXML(CurrentNode : IXMLNode;ExecuteParent:String):Boolean;      
      Function EditFieldDataByDS(DS_table : TADODataSet;Action : Integer;ParentCon:TWincontrol):Boolean;
      Function EditFieldDataByXML(CurrentNode : IXMLNode;ExecuteParent:String):Boolean;      
      property ComponentCount : Integer read FComponentCount;
      property CustomDrag : Boolean read FCustomDrag write SetCustomDrag default False;
      property SelectControl : TControl read GetSelectControl;
      //property SelectControlIndex : Integer read FSelectControlIndex;
      procedure SetPointVisible(Visibled:Boolean);
      Function PadingStr(str: String; Len: Integer): String; //--- 补零函数, len为补零位数
      Function SaveComponent():Boolean;
      procedure SetComponentField(FieldName:String;CNFieldName : String = '');
      //因为Combobox, Memo, Edit都有Text属性,暂时用一种"TbsSkinDBEdit"
      Function GetComponentByField(FieldName : String): TbsSkinDBEdit;
      Function GetComponentByName(ComponenName : String): TbsSkinDBEdit;
      procedure CleanComponentText;
      procedure ComponentReLoad;
      property OnClick : TNotifyEvent read FOnClick write FOnClick;
      property OnChange : TNotifyEvent read FOnChange write FOnChange;
      Function SplitString(Mark, Str:String):TStrings;
      property ComponentList : TList read FComponentName;
      procedure SetDbGridView(TableName:String;DBGrid : TbsSkinDBGrid);
      procedure LoadDbGridView(TableName:String;DBGrid : TbsSkinDBGrid);
      procedure SaveDbGridView(TableName: String;DBGrid : TbsSkinDBGrid);
      procedure ComponentChange(Sender: TObject);
      property MathStr : String read ReadMathStr write WriteFMathStr;
  End;

Const
  Label_Control  : integer = 1;
  BSEdit_Control : integer = 2;
  Memo_Control   : integer = 3;
Var
  AJ : String;

implementation

Uses DataMoudle;

{ TAppIO }

//------------------------------------------------- Writen By : AJ -----------//
constructor TAppIO.Create;
begin

end;

//------------------------------------------------- Writen By : AJ -----------//
destructor TAppIO.Destroy;
begin

  inherited;
end;

//------------------------------------------------- Writen By : AJ -----------//
function TAppIO.LoadSetup(XMLPath: String; pNode: IXMLNode): Boolean;
begin
  {$Message hint 'LoadSetup'}
end;

//------------------------------------------------- Writen By : AJ -----------//
function TAppIO.SaveSetup(XMLPath: String; pNode: IXMLNode): Boolean;
begin

end;


{ TCustomClass }
//------------------------------------------------- Writen By : AJ -----------//
constructor TCustomClass.Create(AOwner : TComponent);
begin
  FComponentField:= TStringList.Create;
  FMathConstr  := TStringList.Create;
  FComponentName:= TList.Create;
  FDataSet := TADODataSet.Create(Nil);
  //FOnClick:= OnClick;
  FOnChange:= ComponentChange;
  FComponentCount:= 0;
  XMLDoc1:= TXMLDocument.Create(AOwner);
end;

//------------------------------------------------- Writen By : AJ -----------//
destructor TCustomClass.Destroy;
begin
  FComponentField.Free;
  FMathConstr.Free;
  FComponentName.Free;
  FDataSet.Free;
  XMLDoc1.Free;
  inherited;
end;

//------------------------------------------------- Writen By : AJ -----------//
procedure TCustomClass.CreateLabel(Name, Title: String;
  Parent: TWinControl; Top, Left, Width, Height: Integer;
  bsSkinData: TbsSkinData);
Var
  DLabel : TLabel;
begin
  DLabel:= TLabel.Create(Parent);
  DLabel.Parent:= Parent;
  DLabel.Top:= Parent.Top + Top;
  DLabel.Left:= Parent.Left + Left;
  DLabel.Width:= Width;
  DLabel.Height:= Height;
  //bsSkinEdit.SkinData:= bsSkinData;
  DLabel.Name:= Name;
  DLabel.Tag:= 1;
  DLabel.Caption:= Title;
  DLabel.AutoSize:= False;
  DLabel.Transparent:= True;
  DLabel.Font.Name:= 'Arial';
  DLabel.Font.Height:= 14;
  DLabel.OnClick:= FOnClick;
  FComponentName.Add(DLabel);
end;

//------------------------------------------------- Writen By : AJ -----------//
procedure TCustomClass.CreateBSEdit(Name, Title, FieldName: String;Parent: TWinControl;
   Top, Left, Width, Height: Integer;bsSkinData: TbsSkinData);
Var
  bsEdit : TbsSkinDBEdit;
begin
  bsEdit:= TbsSkinDBEdit.Create(Parent);
  bsEdit.Parent:= Parent;
  bsEdit.Top:= Parent.Top + Top;
  bsEdit.Left:= Parent.Left + Left;
  bsEdit.Width:= Width;
  bsEdit.Height:= Height;
  bsEdit.TabOrder:= Top;
  bsEdit.SkinData:= bsSkinData;
  bsEdit.Name:= Name;
  bsEdit.Text:= Title;
  bsEdit.DataField:= FieldName;
  bsEdit.Tag:= 2;
  bsEdit.OnClick:= FOnClick;
  bsEdit.OnChange:= FOnChange;
  FComponentName.Add(bsEdit);
end;

//------------------------------------------------- Writen By : AJ -----------//
procedure TCustomClass.CreateComboBox(Name, Title, FieldName: String;
  Parent: TWinControl; Top, Left, Width, Height: Integer;
  bsSkinData: TbsSkinData);
Var
  bsDBComboBox : TbsSkinDBComboBox;
begin
  bsDBComboBox:= TbsSkinDBComboBox.Create(Parent);
  bsDBComboBox.Parent:= Parent;
  bsDBComboBox.Top:= Parent.Top + Top;
  bsDBComboBox.Left:= Parent.Left + Left;
  bsDBComboBox.Width:= Width;
  bsDBComboBox.Height:= Height;
  bsDBComboBox.TabOrder:= Top;
  bsDBComboBox.SkinData:= bsSkinData;
  bsDBComboBox.Name:= Name;
  bsDBComboBox.Tag:= 3;
  bsDBComboBox.Text:= FieldName;
  bsDBComboBox.Items.Assign(SplitString(',', Title));
  bsDBComboBox.DataField:= FieldName;
  bsDBComboBox.Style:= bscbEditStyle;
  bsDBComboBox.OnClick:= FOnClick;
  bsDBComboBox.OnChange:= FOnChange;
  FComponentName.Add(bsDBComboBox);
end;

//------------------------------------------------- Writen By : AJ -----------//
procedure TCustomClass.CreateMemo(Name, Title, FieldName: String;
  Parent: TWinControl; Top, Left, Width, Height: Integer;
  bsSkinData: TbsSkinData);
Var
  bsSkinDBMemo: TbsSkinDBMemo;
begin
  bsSkinDBMemo:= TbsSkinDBMemo.Create(Parent);
  bsSkinDBMemo.Parent:= Parent;
  bsSkinDBMemo.Top:= Parent.Top + Top;
  bsSkinDBMemo.Left:= Parent.Left + Left;
  bsSkinDBMemo.Width:= Width;
  bsSkinDBMemo.Height:= Height;
  bsSkinDBMemo.TabOrder:= Top;
  bsSkinDBMemo.SkinData:= bsSkinData;
  bsSkinDBMemo.Name:= Name;
  bsSkinDBMemo.Tag:= 4;
  bsSkinDBMemo.Text:= FieldName;
  bsSkinDBMemo.Lines.Assign(SplitString(',', Title));
  bsSkinDBMemo.DataField:= FieldName;
  bsSkinDBMemo.OnClick:= FOnClick;
  bsSkinDBMemo.OnChange:= FOnChange;
  FComponentName.Add(bsSkinDBMemo);
end;

//------------------------------------------------- Writen By : AJ -----------//
//------------------ Main Function here --------------------------------------//
function TCustomClass.CreateComponentDynamic(DS_Component: TADODataSet;
  Parent : TWinControl;bsSkinData: TbsSkinData): Boolean;
Var
  Top, Left, Width, Height, iType : Integer;
  coName, FieldName, Titles, sMath : String;
  Sql : String;
begin
  FDataSet.Connection:= DS_Component.Connection;
  Sql:= 'Select * From Component_tbl Where ExecuteParent = '''+Parent.Name+'''';
  Sql:= Sql+' Or DesignParent = '''+Parent.Name+''' order by Ptop';
  With FDataSet do begin
    Active:= False;
    CommandText:= Sql;
    Active:= True;
    While not Eof do begin
      iType := FieldByName('Type').AsInteger;
      Top   := FieldByName('PTop').AsInteger;
      Left  := FieldByName('PLeft').AsInteger;
      Width := FieldByName('PWidth').AsInteger;
      Height:= FieldByName('PHeight').AsInteger;
      coName:= FieldByName('ComponentName').AsString;
      FieldName:= FieldByName('Fields').AsString;
      Titles:= FieldByName('Title').AsString;
      sMath:= FieldByName('Math').AsString;
      //--------------------------------------------------//
      Case iType of
        1:CreateLabel(coName, Titles, Parent, Top, Left, Width, Height, bsSkinData);
        2:CreateBSEdit(coName, FieldName, FieldName, Parent, Top, Left, Width, Height, bsSkinData);
        3:CreateComboBox(coName, Titles, FieldName,Parent, Top, Left, Width, Height, bsSkinData);
        4:CreateMemo(coName, Titles, FieldName,Parent, Top, Left, Width, Height, bsSkinData);        
      End;
      if sMath <> '' then FMathConstr.Add(sMath);//-----------------------------
      FComponentField.Add(FieldByName('Fields').AsString);
      Next;
      Inc(FComponentCount);
    end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -