码迷,mamicode.com
首页 > Windows程序 > 详细

Delphi 实现Ini文件参数与TEdit和TCheckBox绑定(TSimpleParam)

时间:2016-04-08 13:18:14      阅读:372      评论:0      收藏:0      [点我收藏+]

标签:

本例程在 Delphi XE8 版本下运行

Delphi群:59129236

把Delphi做为工作的辅助技能,走向幸福人生!

晓不得2013 QQ:26562729


SimpleParamDemo 功能:

把ini文件的参数与控件绑定起来,以达到方便使用的目的。

本例程共有2个单元

uSimpleParam->TSimpleParam;//本功能

uSimpleList->TSimpleList;用泛型实现的TList,更实用一点

源码下载:http://files.cnblogs.com/files/lackey/SimpleParamDemo.zip

用法:

const

csEditSimpleParam = ‘EditSimpleParam‘;
csCheckBoxParam = ‘CheckBoxParam‘;


FIniFile := TIniFile.Create(‘.\SimpleParams.ini‘);
FSimpleParam := TSimpelParam.Create;

FSimpleParam.IniFile := FIniFile; // 指定 IniFile

// 绑定控件,并设置默认参数
FSimpleParam.Binding(edtSimpleParam, csEditSimpleParam).SetInteger(101);
FSimpleParam.Binding(chkSimpleParam, csCheckBoxParam).SetBoolean(true);

// 加载参数
FSimpleParam.LoadParams;

FSimpleParam.SaveParams; // 保存参数

//获取参数
nSimpleParam := FSimpleParam[csEditSimpleParam].AsInteger;
bSimleParam := FSimpleParam[csCheckBoxParam].AsBoolean;

//设置参数
FSimpleParam[csEditSimpleParam].SetInteger(105);
FSimpleParam[csCheckBoxParam].SetBoolean(false);

unit uSimpleParam;

interface

uses
  uSimpleList, Generics.Collections, Vcl.StdCtrls, Vcl.Controls, IniFiles;

type

  TDefaultType = (dtInteger, dtString, dtBoolean);

  TBaseParam<T: TWinControl> = class
  private
    FCtrl: T;
    FIndent: string;
    FDefaultType: TDefaultType;
    FDefaultInteger: integer;
    FDefaultString: string;
    FDefaultBoolean: boolean;

  public

    function AsInteger: integer; virtual;
    function AsString: string; virtual;
    function AsBoolean: boolean; virtual;

    procedure SetInteger(val: integer); virtual;
    procedure SetString(val: string); virtual;
    procedure SetBoolean(val: boolean); virtual;

    procedure SetDefaultInteger(val: integer);
    procedure SetDefaultString(val: string);
    procedure SetDefaultBoolean(val: boolean);

    procedure Binding(ACtrl: T; AIndent: string); virtual;

  end;

  TEditParam = class(TBaseParam<TEdit>)
  public
    function AsInteger: integer; override;
    function AsString: string; override;
    procedure SetInteger(val: integer); override;
    procedure SetString(val: string); override;
    procedure Binding(ACtrl: TEdit; AIndent: string); override;
  end;

  TCheckBoxParam = class(TBaseParam<TCheckBox>)
  public
    function AsBoolean: boolean; override;
    procedure SetBoolean(val: boolean); override;
    procedure Binding(ACtrl: TCheckBox; AIndent: string); override;
  end;

  TBaseParamList = class(TClassSimpleList < TBaseParam < TWinControl >> )
  public
    function Binding(ACtrl: TWinControl; AIndent: string): TBaseParam<TWinControl>;
  end;

  TSimpelParam = class
    FParamList: TBaseParamList;
  private
    FIniFile: TIniFile;
    FSectionIndent: String;

    procedure SetIniFile(val: TIniFile);
    procedure SetSectionIndent(val: String);
    function Get(AIndent: string): TBaseParam<TWinControl>;

  public

    constructor Create;
    destructor Destroy; override;

    property IniFile: TIniFile read FIniFile write SetIniFile;
    property SectionIndent: String read FSectionIndent write SetSectionIndent;
    property Items[AIndent: string]: TBaseParam<TWinControl> Read Get; default;

    function Binding(ACtrl: TWinControl; AIndent: string): TBaseParam<TWinControl>;

    procedure LoadParams;
    procedure SaveParams;

  end;

implementation

uses
  SysUtils;

function TEditParam.AsInteger: integer;
begin
  Result := StrToIntDef(FCtrl.Text, 0);
end;

function TEditParam.AsString: string;
begin
  Result := FCtrl.Text;
end;

procedure TEditParam.Binding(ACtrl: TEdit; AIndent: string);
begin
  inherited;
end;

procedure TEditParam.SetInteger(val: integer);
begin
  inherited;
  if Assigned(FCtrl) then
    FCtrl.Text := IntToStr(val);
end;

procedure TEditParam.SetString(val: string);
begin
  inherited;
  if Assigned(FCtrl) then
    FCtrl.Text := val;
end;

function TCheckBoxParam.AsBoolean: boolean;
begin
  Result := FCtrl.Checked;
end;

procedure TCheckBoxParam.Binding(ACtrl: TCheckBox; AIndent: string);
begin
  inherited;
end;

procedure TCheckBoxParam.SetBoolean(val: boolean);
begin
  inherited;
  if Assigned(FCtrl) then
    FCtrl.Checked := val;
end;

{ TBaseParam<T> }

function TBaseParam<T>.AsBoolean: boolean;
begin

end;

function TBaseParam<T>.AsInteger: integer;
begin

end;

function TBaseParam<T>.AsString: string;
begin

end;

procedure TBaseParam<T>.Binding(ACtrl: T; AIndent: string);
begin
  FCtrl := ACtrl;
  FIndent := AIndent;
end;

function TBaseParamList.Binding(ACtrl: TWinControl; AIndent: string): TBaseParam<TWinControl>;
begin

  Result := nil;

  if ACtrl is TEdit then
    Result := TBaseParam<TWinControl>(TEditParam.Create)
  else if ACtrl is TCheckBox then
    Result := TBaseParam<TWinControl>(TCheckBoxParam.Create);

  if Assigned(Result) then
  begin
    Result.Binding(ACtrl, AIndent);
    Add(Result)
  end;

end;

procedure TBaseParam<T>.SetBoolean(val: boolean);
begin

end;

procedure TBaseParam<T>.SetDefaultBoolean(val: boolean);
begin
  FDefaultBoolean := val;
  FDefaultType := dtBoolean;
end;

procedure TBaseParam<T>.SetDefaultInteger(val: integer);
begin
  FDefaultInteger := val;
  FDefaultType := dtInteger;
end;

procedure TBaseParam<T>.SetDefaultString(val: string);
begin
  FDefaultString := val;
  FDefaultType := dtString;
end;

procedure TBaseParam<T>.SetInteger(val: integer);
begin
end;

procedure TBaseParam<T>.SetString(val: string);
begin

end;

{ TSimpelParam }

function TSimpelParam.Binding(ACtrl: TWinControl; AIndent: string): TBaseParam<TWinControl>;
begin
  Result := FParamList.Binding(ACtrl, AIndent);
end;

constructor TSimpelParam.Create;
begin
  inherited;
  FParamList := TBaseParamList.Create;
  FSectionIndent := ‘Main‘;
end;

destructor TSimpelParam.Destroy;
begin
  FParamList.Free;
  inherited;
end;

function TSimpelParam.Get(AIndent: string): TBaseParam<TWinControl>;
var
  i: integer;
begin
  Result := nil;
  for i := 0 to FParamList.Count - 1 do
  begin
    if SameText(AIndent, FParamList[i].FIndent) then
    begin
      Result := FParamList[i];
      exit;
    end;
  end;
end;

procedure TSimpelParam.LoadParams;
var
  B: TBaseParam<TWinControl>;
begin
  if Assigned(FIniFile) then
  begin
    for B in FParamList do
    begin
      if B.ClassName = ‘TEditParam‘ then
      begin

        if B.FDefaultType = dtString then
        begin
          TEdit(B.FCtrl).Text := IniFile.ReadString(FSectionIndent, B.FIndent, B.FDefaultString);
        end
        else if B.FDefaultType = dtInteger then
        begin
          TEdit(B.FCtrl).Text := IntToStr(IniFile.ReadInteger(FSectionIndent, B.FIndent,
            B.FDefaultInteger));
        end;

      end
      else if B.ClassName = ‘TCheckBoxParam‘ then
      begin
        TCheckBox(B.FCtrl).Checked := IniFile.ReadBool(FSectionIndent, B.FIndent,
          B.FDefaultBoolean);
      end;

    end;
  end;
end;

procedure TSimpelParam.SaveParams;
var
  B: TBaseParam<TWinControl>;
begin
  if Assigned(FIniFile) then
  begin
    for B in FParamList do
    begin
      if B.ClassName = ‘TEditParam‘ then
      begin
        FIniFile.WriteString(FSectionIndent, B.FIndent, TEdit(B.FCtrl).Text);
      end
      else if B.ClassName = ‘TCheckBoxParam‘ then
      begin
        FIniFile.WriteBool(FSectionIndent, B.FIndent, TCheckBox(B.FCtrl).Checked);
      end;
    end;
  end;
end;

procedure TSimpelParam.SetIniFile(val: TIniFile);
begin
  FIniFile := val;
end;

procedure TSimpelParam.SetSectionIndent(val: String);
begin
  FSectionIndent := val;
end;

end.

  

unit uSimpleList;

interface

uses
  Generics.Collections;

type

  TSimpleList<T> = class(TList<T>)
  private
    FCurIndexPos: integer;
    function DoPopByIndex(Index: integer): T;
    procedure FreeAllItems;
    procedure SetCurIndexPos(const Value: integer);
  protected
    FNeedFreeItem: boolean;
    procedure FreeItem(Item: T); virtual;
  public

    constructor Create;
    destructor Destroy; override;

    procedure Lock;
    procedure Unlock;

    function PopFirst: T;
    function PopLast: T;
    function PopByIndex(Index: integer): T;

    procedure ClearAndFreeAllItems;
    property CurIndexPos: integer read FCurIndexPos write SetCurIndexPos;

  end;

  TClassSimpleList<T: Class, Constructor> = class(TSimpleList<T>)
  protected
    procedure FreeItem(Item: T); override;
    function AddNewOne: T;
  end;

implementation

procedure TSimpleList<T>.ClearAndFreeAllItems;
begin
  FreeAllItems;
  clear;
end;

constructor TSimpleList<T>.Create;
begin
  inherited;
  FNeedFreeItem := true;
  FCurIndexPos := -1;
end;

destructor TSimpleList<T>.Destroy;
begin
  FreeAllItems;
  inherited;
end;

function TSimpleList<T>.DoPopByIndex(Index: integer): T;
begin
  if (index >= 0) and (index <= count - 1) then
  begin
    result := items[index];
    Delete(index);
    Exit;
  end;
  result := T(nil);
end;

procedure TSimpleList<T>.FreeAllItems;
var
  Item: T;
begin
  if FNeedFreeItem then
  begin
    FCurIndexPos := -1;
    for Item in self do
      FreeItem(Item);
  end;
end;

procedure TSimpleList<T>.FreeItem(Item: T);
begin
  // 假设 T 是 PMyRec =^TMyRec  TMyRec=record;
  // 这个写法对吗?
  // if GetTypeKind(T) = tkPointer then
  // begin
  // Dispose(Pointer(Pointer(@Item)^));
  // end;
end;

procedure TSimpleList<T>.Lock;
begin
  system.TMonitor.Enter(self);
end;

procedure TSimpleList<T>.Unlock;
begin
  system.TMonitor.Exit(self);
end;

function TSimpleList<T>.PopByIndex(Index: integer): T;
begin
  result := DoPopByIndex(index);
end;

function TSimpleList<T>.PopFirst: T;
begin
  result := DoPopByIndex(0);
end;

function TSimpleList<T>.PopLast: T;
begin
  result := DoPopByIndex(count - 1);
end;

procedure TSimpleList<T>.SetCurIndexPos(const Value: integer);
begin
  FCurIndexPos := Value;
end;

{ TThreadClassList<T> }

function TClassSimpleList<T>.AddNewOne: T;
begin
  result := T.Create();
  Add(result);
end;

procedure TClassSimpleList<T>.FreeItem(Item: T);
begin
  Item.Free;
end;

end.

  

 

Delphi 实现Ini文件参数与TEdit和TCheckBox绑定(TSimpleParam)

标签:

原文地址:http://www.cnblogs.com/lackey/p/5367617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!