FormSettings.pas
上传用户:llfxmlw
上传日期:2009-09-14
资源大小:335k
文件大小:9k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit FormSettings;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Registry, StdCtrls;
  6. type
  7.    TSaveValOpt = (svEdit, svMemo, svCheckBox, svRadioButton, svListBox,
  8.       svComboBox, svFontDialog);
  9.    TSaveValSet = set of TSaveValOpt;
  10.    TFormSettings = class(TComponent)
  11.    protected
  12.       FSavePos    : boolean;
  13.       FSaveVals   : boolean;
  14.       FLoadVals   : boolean;
  15.       FKeyName    : string;
  16.       FSaveOpt    : TSaveValSet;
  17.       FRootCon    : TWinControl;
  18.       DidLastSave : boolean;
  19.       procedure   Loaded; override;
  20.       function    StrToWS(const s: string): TWindowState;
  21.       function    WSToStr(ws: TWindowState): string;
  22.       function    GetKeyName: string;
  23.       procedure   Notification(AComponent: TComponent; Operation: TOperation); override;
  24.       procedure   DoLoadValues(reg: TRegIniFile);
  25.       procedure   DoSaveValues(reg: TRegIniFile);
  26.       procedure   ReadFont(Name: string; f: TFont; reg: TRegIniFile);
  27.       procedure   WriteFont(Name: string; f: TFont; reg: TRegIniFile);
  28.    public
  29.       constructor Create(AOwner: TComponent); override;
  30.       destructor  Destroy; override;
  31.       procedure   LoadSettings;
  32.       procedure   SaveSettings;
  33.    published
  34.       property    SavePosition: boolean read FSavePos write FSavePos;
  35.       property    SaveValues: boolean read FSaveVals write FSaveVals;
  36.       property    LoadValues: boolean read FLoadVals write FLoadVals;
  37.       property    SaveValueOptions: TSaveValSet read FSaveOpt write FSaveOpt;
  38.       property    KeyName: string read GetKeyName write FKeyName;
  39.       property    RootControl: TWinControl read FRootCon write FRootCon;
  40.    end;
  41. procedure Register;
  42. implementation
  43. const
  44.    WindowStr : array[1..3] of string = ('NORMAL', 'MAXIMIZED', 'MINIMIZED');
  45. constructor TFormSettings.Create(AOwner: TComponent);
  46. begin
  47.    inherited;
  48.    FreeNotification(AOwner);
  49.    FSavePos    := True;
  50.    FSaveVals   := False;
  51.    FLoadVals   := False;
  52.    DidLastSave := False;
  53.    FSaveOpt := [svEdit, svMemo, svCheckBox, svRadioButton, svListBox,
  54.       svComboBox, svFontDialog];
  55. end;
  56. destructor TFormSettings.Destroy;
  57. begin
  58.    inherited;
  59. end;
  60. procedure TFormSettings.Notification(AComponent: TComponent; Operation: TOperation);
  61. begin
  62.    inherited;
  63.    if (not DidLastSave) and (csDestroying in ComponentState) then begin
  64.       DidLastSave := True;
  65.       // This still doesn't work!  All the window handles are gone! -bpz
  66.       // SaveSettings;
  67.    end;
  68. end;
  69. procedure TFormSettings.Loaded;
  70. begin
  71.    inherited;
  72.    LoadSettings;
  73. end;
  74. function TFormSettings.StrToWS(const s: string): TWindowState;
  75. var
  76.    t : string;
  77. begin
  78.    t := UpperCase(s);
  79.    Result := wsNormal;
  80.    if t = WindowStr[1] then Result := wsNormal;
  81.    if t = WindowStr[2] then Result := wsMaximized;
  82.    if t = WindowStr[3] then Result := wsMinimized;
  83. end;
  84. function TFormSettings.WSToStr(ws: TWindowState): string;
  85. begin
  86.    case ws of
  87.       wsNormal    : Result := WindowStr[1];
  88.       wsMaximized : Result := WindowStr[2];
  89.       wsMinimized : Result := WIndowStr[3];
  90.    else
  91.       Result := WindowStr[1];
  92.    end;
  93. end;
  94. function TFormSettings.GetKeyName: string;
  95. begin
  96.    Result := FKeyName;
  97.    if (Result='') and (not (csDesigning in ComponentState))
  98.       and (Application<>nil) and (Owner<>nil) then
  99.       Result := 'Software' + Application.Title + '' + Owner.Name;
  100. end;
  101. procedure TFormSettings.LoadSettings;
  102. var
  103.    f   : TForm;
  104.    reg : TRegIniFile;
  105. begin
  106.    if (Owner = nil) or (not (Owner is TForm)) then exit;
  107.    if csDesigning in ComponentState then exit;
  108.    f := Owner as TForm;
  109.    f.Position := poDesigned;
  110.    reg := TRegIniFile.Create(KeyName);
  111.    if SavePosition then begin
  112.       f.Left        := reg.ReadInteger('Position', 'Left', f.Left);
  113.       f.Top         := reg.ReadInteger('Position', 'Top', f.Top);
  114.       f.Width       := reg.ReadInteger('Position', 'Width', f.Width);
  115.       f.Height      := reg.ReadInteger('Position', 'Height', f.Height);
  116.       f.WindowState := StrToWS(reg.ReadString('Position', 'WindowState', 'Normal'));
  117.    end;
  118.    if LoadValues then
  119.       DoLoadValues(reg);
  120.    reg.Free;
  121. end;
  122. procedure TFormSettings.SaveSettings;
  123. var
  124.    f   : TForm;
  125.    reg : TRegIniFile;
  126. begin
  127.    if (Owner = nil) or (not (Owner is TForm)) then exit;
  128.    if csDesigning in ComponentState then exit;
  129.    f := Owner as TForm;
  130.    f.Position := poDesigned;
  131.    reg := TRegIniFile.Create(KeyName);
  132.    if SavePosition then begin
  133.       if f.WindowState = wsNormal then begin
  134.          reg.WriteInteger('Position', 'Left', f.Left);
  135.          reg.WriteInteger('Position', 'Top', f.Top);
  136.          reg.WriteInteger('Position', 'Width', f.Width);
  137.          reg.WriteInteger('Position', 'Height', f.Height);
  138.       end;
  139.       reg.WriteString('Position', 'WindowState', WSToStr(f.WindowState));
  140.    end;
  141.    if SaveValues then
  142.       DoSaveValues(reg);
  143.    reg.Free;
  144. end;
  145. procedure TFormSettings.DoLoadValues(reg: TRegIniFile);
  146. var
  147.    i     : integer;
  148.    con   : TWinControl;
  149.    c     : TControl;
  150.    cp    : TComponent;
  151. begin
  152.    con := RootControl;
  153.    if con=nil then con := Owner as TForm;
  154.    Assert(con<>nil);
  155.    for i := 0 to con.ComponentCount-1 do begin
  156.       cp := con.Components[i];
  157.       if not (cp is TControl) then continue;
  158.       c := cp as TControl;
  159.       if c is TEdit then
  160.          TEdit(c).Text := reg.ReadString('Values', c.Name, TEdit(c).Text);
  161.       if c is TMemo then
  162.          TMemo(c).Text := reg.ReadString('Values', c.Name, TMemo(c).Text);
  163.       if c is TCheckBox then
  164.          TCheckBox(c).Checked := reg.ReadBool('Values', c.Name, TCheckBox(c).Checked);
  165.       if c is TRadioButton then
  166.          TRadioButton(c).Checked := reg.ReadBool('Values', c.Name, TRadioButton(c).Checked);
  167.       if c is TListBox then
  168.          TListBox(c).ItemIndex := reg.ReadInteger('Values', c.Name, TListBox(c).ItemIndex);
  169.       if c is TComboBox then
  170.          TComboBox(c).ItemIndex := reg.ReadInteger('Values', c.Name, TComboBox(c).ItemIndex);
  171.    end;
  172.    for i := 0 to con.ComponentCount-1 do begin
  173.       cp := con.Components[i];
  174.       if cp is TFontDialog then
  175.          ReadFont(cp.Name, TFontDialog(cp).Font, reg);
  176.    end;
  177. end;
  178. procedure TFormSettings.DoSaveValues(reg: TRegIniFile);
  179. var
  180.    i     : integer;
  181.    con   : TWinControl;
  182.    c     : TControl;
  183.    cp    : TComponent;
  184. begin
  185.    con := RootControl;
  186.    if con=nil then con := Owner as TForm;
  187.    Assert(con<>nil);
  188.    for i := 0 to con.ComponentCount-1 do begin
  189.       cp := con.Components[i];
  190.       if not (cp is TControl) then continue;
  191.       c := cp as TControl;
  192.       if c is TEdit then
  193.          reg.WriteString('Values', c.Name, TEdit(c).Text);
  194.       if c is TMemo then
  195.          reg.WriteString('Values', c.Name, TMemo(c).Text);
  196.       if c is TCheckBox then
  197.          reg.WriteBool('Values', c.Name, TCheckBox(c).Checked);
  198.       if c is TRadioButton then
  199.          reg.WriteBool('Values', c.Name, TRadioButton(c).Checked);
  200.       if c is TListBox then
  201.          reg.WriteInteger('Values', c.Name, TListBox(c).ItemIndex);
  202.       if c is TComboBox then
  203.          reg.WriteInteger('Values', c.Name, TComboBox(c).ItemIndex);
  204.    end;
  205.    for i := 0 to con.ComponentCount-1 do begin
  206.       cp := con.Components[i];
  207.       if cp is TFontDialog then
  208.          WriteFont(cp.Name, TFontDialog(cp).Font, reg);
  209.    end;
  210. end;
  211. procedure TFormSettings.ReadFont(Name: string; f: TFont; reg: TRegIniFile);
  212. var
  213.    b : boolean;
  214. begin
  215.    f.Name  := reg.ReadString('Values', Name + '_Name', f.Name);
  216.    f.Size  := reg.ReadInteger('Values', Name + '_Size', f.Size);
  217.    f.Color := reg.ReadInteger('Values', Name + '_Color', f.Color);
  218.    b := reg.ReadBool('Values', Name + '_Bold', fsBold in f.Style);
  219.    if b then f.Style := f.Style + [fsBold]
  220.       else f.Style := f.Style - [fsBold];
  221.    b := reg.ReadBool('Values', Name + '_Italic', fsItalic in f.Style);
  222.    if b then f.Style := f.Style + [fsItalic]
  223.       else f.Style := f.Style - [fsItalic];
  224.    b := reg.ReadBool('Values', Name + '_Underline', fsUnderline in f.Style);
  225.    if b then f.Style := f.Style + [fsUnderline]
  226.       else f.Style := f.Style - [fsUnderline];
  227.    b := reg.ReadBool('Values', Name + '_StrikeOut', fsStrikeOut in f.Style);
  228.    if b then f.Style := f.Style + [fsStrikeOut]
  229.       else f.Style := f.Style - [fsStrikeOut];
  230. end;
  231. procedure TFormSettings.WriteFont(Name: string; f: TFont; reg: TRegIniFile);
  232. begin
  233.    reg.WriteString('Values', Name + '_Name', f.Name);
  234.    reg.WriteInteger('Values', Name + '_Size', f.Size);
  235.    reg.WriteInteger('Values', Name + '_Color', f.Color);
  236.    reg.WriteBool('Values', Name + '_Bold', fsBold in f.Style);
  237.    reg.WriteBool('Values', Name + '_Italic', fsItalic in f.Style);
  238.    reg.WriteBool('Values', Name + '_Underline', fsUnderline in f.Style);
  239.    reg.WriteBool('Values', Name + '_StrikeOut', fsStrikeOut in f.Style);
  240. end;
  241. procedure Register;
  242. begin
  243.   RegisterComponents('BenTools', [TFormSettings]);
  244. end;
  245. end.