home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 March / Chip_1999-03_cd.bin / zkuste / delphi / D234C13 / RALIB.ZIP / RALib / Lib / RARegAuto.pas < prev    next >
Pascal/Delphi Source File  |  1998-10-20  |  27KB  |  920 lines

  1. {***********************************************************
  2.                 R&A Library
  3.        Copyright (C) 1996-98 R&A
  4.        Portion copyright (C) Sergey Orlik
  5.  
  6.        component   : RARegAuto
  7.        description : registry and ini-file storage
  8.                      for other components properties
  9.  
  10.        programer   : black
  11.        e-mail      : blacknbs@chat.ru
  12.        www         : www.chat.ru\~blacknbs\ralib
  13. ************************************************************}
  14.  
  15. {$INCLUDE RA.INC}
  16.  
  17. unit RARegAuto;
  18.                 
  19. interface
  20.  
  21. uses
  22.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  23.   TypInfo, ToolIntf, ExptIntf, Registry, IniFiles
  24.   {$IFDEF RA_D3H} , RegStr{$ENDIF RA_D3H} ;
  25.  
  26. type
  27.  
  28.   TIniStrings = class;
  29.   TMyIniFile = class;
  30.   TRegAutoOperation = (roBeforeLoad, roAfterLoad, roBeforeSave, roAfterSave);
  31.   TRegAutoEvent = procedure (Sender : TObject; Operation : TRegAutoOperation) of object;
  32.  
  33.   TRegAuto = class(TComponent)
  34.   private
  35.     ObjProp : string;
  36.     TypeInf : PTypeInfo;
  37.     PropInf : PPropInfo;
  38.     PropTyp : TTypeKind;
  39.     Obj : TObject;
  40.     ComponentName, PropertyName : string;
  41.     FLoaded : boolean;
  42.     FProps : TStrings;
  43.     FAutoMode : boolean;
  44.     FSaveWindowPlace : boolean;
  45.  
  46.     FUseIni : boolean;
  47.     FUseReg : boolean;
  48.     FUseStr : boolean;
  49.  
  50.     FRegPath : string;
  51.     FIniFile : string;
  52.     FIniStrings : TStrings;
  53.     FGlobalSettings : boolean;
  54.  
  55.     FormOnCreate    : TNotifyEvent;
  56.     FormOnDestroy   : TNotifyEvent;
  57.  
  58.     FNotifiers : TList;
  59.  
  60.     FBeforeLoad : TNotifyEvent;
  61.     FBeforeSave : TNotifyEvent;
  62.     FAfterLoad  : TNotifyEvent;
  63.     FAfterSave  : TNotifyEvent;
  64.  
  65.     OldIniFile : string;
  66.     OldRegPath : string;
  67.  
  68.     procedure LoadPropInf(lObjProp : string);
  69.     function GetOrdPrp : longint;
  70.     procedure SetOrdPrp(Value : longint);
  71.     function GetStrPrp : string;
  72.     procedure SetStrPrp(Value : string);
  73.     function GetFloatPrp : extended;
  74.     procedure SetFloatPrp(Value : extended);
  75.     {************ ─δ  Property ************}
  76.     procedure SetFProps(lProps : TStrings);
  77.     procedure SetSaveWindowPlace(F : boolean);
  78.     procedure SetIniStrings(AIniStrings : TStrings);
  79.     {############ ─δ  Property ############}
  80.     procedure NewFormOnCreate(Sender : TObject);
  81.     procedure NewFormOnDestroy(Sender : TObject);
  82.     procedure GenerateRegistryName;
  83.   protected
  84.     Reg : TRegIniFile;
  85.     Ini : TMyIniFile;
  86.     Str : TIniStrings;
  87.     procedure CreateFile;
  88.     procedure DestroyFile;
  89.   public
  90.     constructor Create(AOwner: TComponent); override;
  91.     destructor Destroy; override;
  92.     procedure Save;
  93.     procedure Load;
  94.     procedure SaveWindowPlacement;
  95.     procedure LoadWindowPlacement;
  96.  
  97.     function ReadRootString(const Section, Ident, Default: string): string;
  98.     function ReadRootInteger(const Section, Ident: string; Default: Longint): Longint;
  99.     procedure WriteRootString(const Section, Ident, Value: string);
  100.     procedure WriteRootInteger(const Section, Ident: string; Value: Longint);
  101.  
  102.     function ReadString(const Section, Ident, Default: string): string;
  103.     procedure WriteString(const Section, Ident, Value: String);
  104.     function ReadInteger(const Section, Ident: string; Default: Longint): Longint;
  105.     procedure WriteInteger(const Section, Ident: string; Value: Longint);
  106.     function ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
  107.     procedure WriteBool(const Section, Ident: string; Value: Boolean);
  108.     function ReadFloat(const Section, Ident: string; Default: Double): Double;
  109.     procedure WriteFloat(const Section, Ident: string; Value: Double);
  110.     procedure ReadStrings(const Section, Ident : string; Strings : TStrings);
  111.     procedure WriteStrings(const Section, Ident: string; Value: TStrings);
  112.     procedure ReadSection(const Section : string; Ss : TStrings);
  113.     procedure ReadSections(Ss : TStrings);
  114.     procedure EraseSection(const Section: string);
  115.     procedure DeleteKey(const Section, Ident: string);
  116.  
  117.     procedure AddNotify(ANotify : TRegAutoEvent);
  118.     procedure RemoveNotify(ANotify : TRegAutoEvent);
  119.   published
  120.     // ╧≤≥ⁿ Γ ≡σσ±≥≡σ
  121.     property RegPath : string read FRegPath write FRegPath;
  122.     // ╚∞  ini-⌠αΘδα
  123.     property IniFile : string read FIniFile write FIniFile;
  124.     //
  125.     property IniStrings : TStrings read FIniStrings write SetIniStrings;
  126.  
  127.     // ╤∩Φ±εΩ ±ε⌡≡αφ σ∞√⌡ ±ΓεΘ±≥Γ
  128.     property Props : TStrings read FProps write SetFProps;
  129.     property AutoMode : boolean read FAutoMode write FAutoMode default true;
  130.     // ╤ε⌡≡αφ ≥ⁿ ≡ατ∞σ≡ Φ ∩εδεµσφΦσ εΩφα
  131.     property SaveWindowPlace : boolean read FSaveWindowPlace write SetSaveWindowPlace;
  132.     property BeforeLoad : TNotifyEvent read FBeforeLoad write FBeforeLoad;
  133.     property AfterLoad  : TNotifyEvent read FAfterLoad  write FAfterLoad;
  134.     property BeforeSave : TNotifyEvent read FBeforeSave write FBeforeSave;
  135.     property AfterSave  : TNotifyEvent read FAfterSave  write FAfterSave;
  136.     property UseIni : boolean read FUseIni write FUseIni default false;
  137.     property UseReg : boolean read FUseReg write FUseReg default true;
  138.     property UseStr : boolean read FUseStr write FUseStr default false;
  139.     property GlobalSettings : boolean read FGlobalSettings write FGlobalSettings default true;
  140.   end;
  141.  
  142.   TIniStrings = class
  143.   private
  144.     FStrings : TStrings;
  145.   public
  146.     constructor Create(AStrings : TStrings);
  147.  
  148.     function ReadString(const Section, Ident, Default: string): string;
  149.     procedure WriteString(const Section, Ident, Value: String);
  150.     function ReadInteger(const Section, Ident: string; Default: Longint): Longint;
  151.     procedure WriteInteger(const Section, Ident: string; Value: Longint);
  152.     function ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
  153.     procedure WriteBool(const Section, Ident: string; Value: Boolean);
  154.     function ReadFloat(const Section, Ident: string; Default: Double): Double;
  155.     procedure WriteFloat(const Section, Ident: string; Value: Double);
  156.     function ReadSection(const Section : string; Ss : TStrings) : boolean;
  157.     procedure ReadSections(Ss : TStrings);
  158.   end;
  159.  
  160.   TMyIniFile = class(TIniFile)
  161.   public
  162.     function ReadSection1(const Section : string; Ss : TStrings) : boolean;
  163.    {$IFNDEF RA_D35H}
  164.     function ReadFloat(const Section, Ident: string; Default: Double): Double;
  165.     procedure WriteFloat(const Section, Ident: string; Value: Double);
  166.    {$ENDIF RA_D35H}
  167.   end;
  168.  
  169.   ERegAutoError = class(Exception);
  170.  
  171. var
  172.   GlobalIniFile : string = ''; {if <> '', used by all RegAutos}
  173.   GlobalRegPath : string = ''; {if <> '', used by all RegAutos}
  174.  
  175. implementation
  176.  
  177. uses RAUtils;
  178.  
  179. {$IFDEF RA_D2}
  180. const
  181.   REGSTR_PATH_SETUP           = 'Software\Microsoft\Windows\CurrentVersion';
  182.   REGSTR_VAL_REGORGANIZATION  = 'RegisteredOrganization'; 
  183. {$ENDIF RA_D2}
  184.  
  185. constructor TRegAuto.Create(AOwner: TComponent);
  186. var
  187.   ProjName : string;
  188. begin
  189.   inherited Create(AOwner);
  190.   FNotifiers := TList.Create;
  191.   UseReg := true;
  192.   FGlobalSettings := true;
  193.   FProps := TStringList.Create;
  194.   FIniStrings := TStringList.Create;
  195.   ProjName := '';
  196.   if csDesigning in ComponentState then begin
  197.     ProjName := ToolServices.GetProjectName;
  198.     ProjName := ExtractFileName(ProjName);
  199.     ProjName := Copy(ProjName, 1, Length(ProjName)-4);
  200.     if ProjName = '' then ProjName := '╧≡εßα';
  201.     with TRegIniFile.Create('') do
  202.       try
  203.         RootKey := HKEY_LOCAL_MACHINE;
  204.         FRegPath := 'Software\' + ReadString(REGSTR_PATH_SETUP, REGSTR_VAL_REGORGANIZATION, '') +'\'+ ProjName;
  205.       finally
  206.         Reg.Free;
  207.       end;
  208.   end else
  209.     FRegPath := 'Software\Unknown Delphi Application';
  210.   FAutoMode := true;
  211.   FSaveWindowPlace := false;
  212.   if not (csDesigning in ComponentState) and FAutoMode then
  213.     if Owner is TForm then begin
  214.       FormOnCreate := (Owner as TForm).OnCreate;
  215.       (Owner as TForm).OnCreate := NewFormOnCreate;
  216.       FormOnDestroy := (Owner as TForm).OnDestroy;
  217.       (Owner as TForm).OnDestroy := NewFormOnDestroy;
  218.     end else if Owner is TDataModule then begin
  219.       FormOnCreate := (Owner as TDataModule).OnCreate;
  220.       (Owner as TDataModule).OnCreate := NewFormOnCreate;
  221.       FormOnDestroy := (Owner as TDataModule).OnDestroy;
  222.       (Owner as TDataModule).OnDestroy := NewFormOnDestroy;
  223.     end;
  224. end;
  225.  
  226. destructor TRegAuto.Destroy;
  227. begin
  228.   FProps.Free;
  229.   FIniStrings.Free;
  230.   FNotifiers.Free;
  231.   inherited Destroy;
  232. end;
  233.  
  234. procedure TRegAuto.NewFormOnCreate(Sender : TObject);
  235. begin
  236.   if Assigned(FormOnCreate) then FormOnCreate(Self);
  237.   if AutoMode then Load;
  238. end;
  239.  
  240. procedure TRegAuto.NewFormOnDestroy(Sender : TObject);
  241. begin
  242.   if AutoMode then Save;
  243.   if Assigned(FormOnDestroy) then FormOnDestroy(Self);
  244. end;
  245.  
  246. procedure TRegAuto.LoadPropInf(lObjProp : string);
  247. var
  248.   PropName : string;
  249.   i        : integer;
  250.   Last     : boolean;
  251. begin
  252.   FLoaded := false;
  253.   ObjProp := lObjProp;
  254.   if Length(ObjProp) < 2 then exit;
  255.   ComponentName := Copy(ObjProp, 1, Pos('.', ObjProp)-1);
  256.   PropertyName  := Copy(ObjProp, Pos('.', ObjProp)+1, 255);
  257.   if ComponentName = Owner.Name then begin
  258.     ComponentName := '';
  259.     ObjProp := Copy(ObjProp, Pos('.', ObjProp), 255);
  260.   end;
  261.   if ComponentName = '' then Obj := Owner
  262.   else Obj := Owner.FindComponent(ComponentName);
  263.   if Obj = nil then exit;
  264.   
  265.   // ╚∙σ∞ Γδεµσφφ√σ ±ΓεΘ±≥Γα
  266.   i := Pos('.', ObjProp);
  267.   Last := false;
  268.   while not Last do begin
  269.     PropName := '';
  270.     inc(i);
  271.     while i <= Length(ObjProp) do begin
  272.       if ObjProp[i] = '.' then break;
  273.       PropName := PropName + ObjProp[i];
  274.       inc(i);
  275.     end;
  276.     Last := not ((Length(ObjProp) >= i) and (ObjProp[i] = '.'));
  277.     TypeInf := Obj.ClassInfo;
  278.     PropInf := GetPropInfo(TypeInf, PropName);
  279.     if PropInf = nil then exit;
  280.     PropTyp := PropInf^.PropType^.Kind;
  281.     if Obj = nil then exit;
  282.     if PropTyp = tkClass then begin
  283.       FLoaded := true;
  284.       Obj := TObject(GetOrdPrp);
  285.       FLoaded := false;
  286.     end
  287.     else break; // Loop End
  288.   end;
  289.   FLoaded := true;
  290. end;
  291.  
  292. procedure TRegAuto.GenerateRegistryName;
  293. begin
  294.   ComponentName := Owner.Name;
  295.   PropertyName  := ObjProp;
  296. end;
  297.  
  298. function TRegAuto.GetOrdPrp : longint;
  299. begin
  300.   Result := 0;
  301.   case PropTyp of
  302.     tkInteger,
  303.     tkChar,
  304.     tkWChar,
  305.     tkClass,
  306.     tkEnumeration :
  307.       if FLoaded then Result:= GetOrdProp(Obj, PropInf);
  308.   end;
  309. end;
  310.  
  311. procedure TRegAuto.SetOrdPrp(Value : longint);
  312. begin
  313.   case PropTyp of
  314.     tkInteger,
  315.     tkChar,
  316.     tkWChar,
  317.     tkEnumeration :
  318.       if FLoaded then SetOrdProp(Obj, PropInf, Value);
  319.   end;
  320. end;
  321.  
  322. function TRegAuto.GetStrPrp : string;
  323. begin
  324.   Result := '';
  325.   case PropTyp of
  326.     tkString,
  327.     tkLString{$IFDEF RA_D3H},
  328.     tkWString{$ENDIF RA_D3H} :
  329.       if FLoaded then Result:= GetStrProp(Obj, PropInf);
  330.   end;
  331. end;
  332.  
  333. procedure TRegAuto.SetStrPrp(Value : string);
  334. begin
  335.   case PropTyp of
  336.     tkString,
  337.     tkLString{$IFDEF RA_D3H},
  338.     tkWString{$ENDIF RA_D3H} :
  339.       if FLoaded then SetStrProp(Obj, PropInf, Value);
  340.   end;
  341. end;
  342.  
  343. function TRegAuto.GetFloatPrp : extended;
  344. begin
  345.   Result := 0;
  346.   case PropTyp of
  347.     tkFloat :
  348.       if FLoaded then Result:= GetFloatProp(Obj, PropInf);
  349.   end;
  350. end;
  351.  
  352. procedure TRegAuto.SetFloatPrp(Value : extended);
  353. begin
  354.   case PropTyp of
  355.     tkFloat :
  356.       if FLoaded then SetFloatProp(Obj, PropInf, Value);
  357.   end;
  358. end;
  359.  
  360. procedure TRegAuto.Save;
  361.  
  362.   procedure SaveOrdPrp;
  363.   var
  364.     Value : longint;
  365.   begin
  366.     Value := GetOrdPrp;
  367.     WriteInteger(ComponentName, PropertyName, Value);
  368.   end;
  369.   procedure SaveFloatPrp;
  370.   var
  371.     Value : extended;
  372.   begin
  373.     Value := GetFloatPrp;
  374.     WriteFloat(ComponentName, PropertyName, Value);
  375.   end;
  376.   procedure SaveStrPrp;
  377.   var
  378.     Value : string;
  379.   begin
  380.     Value := GetStrPrp;
  381.     WriteString(ComponentName, PropertyName, Value);
  382.   end;
  383.  
  384. var
  385.   i : integer;
  386. begin
  387.   for i := 0 to FNotifiers.Count - 1 do
  388.     TRegAutoEvent(FNotifiers[i]^)(Self, roBeforeSave);
  389.   if Assigned(FBeforeSave) then FBeforeSave(Self);
  390.  try
  391.   for i:= 0 to FProps.Count - 1 do begin
  392.     LoadPropInf(FProps[i]);
  393.     if not FLoaded then continue;
  394.     GenerateRegistryName;
  395.     case PropTyp of
  396.       tkInteger,
  397.       tkChar,
  398.       tkWChar,
  399.       tkEnumeration : SaveOrdPrp;
  400.       tkFloat       : SaveFloatPrp;
  401.       tkString,
  402.       tkLString{$IFDEF RA_D3H},
  403.       tkWString{$ENDIF RA_D3H}    : SaveStrPrp;
  404.     end;
  405.   end;
  406.   if SaveWindowPlace then SaveWindowPlacement;
  407.  except
  408.    Application.MessageBox(PChar('TRegAuto: ∩≡εßδσ∞√ c ' + ObjProp)
  409.      , PChar(Application.Title), MB_OK + MB_ICONERROR);
  410.  end;
  411.   if Assigned(FAfterSave) then FAfterSave(Self);
  412.   for i := 0 to FNotifiers.Count - 1 do
  413.     TRegAutoEvent(FNotifiers[i]^)(Self, roAfterSave);
  414. end;
  415.  
  416. procedure TRegAuto.Load;
  417.  
  418.   procedure LoadOrdPrp;
  419.   var
  420.     Value : longint;
  421.   begin
  422.     Value := GetOrdPrp;
  423.     Value := ReadInteger(ComponentName, PropertyName, Value);
  424.     SetOrdPrp(Value);
  425.   end;
  426.   procedure LoadFloatPrp;
  427.   var
  428.     Value : extended;
  429.   begin
  430.     Value := GetFloatPrp;
  431.     Value := ReadFloat(ComponentName, PropertyName, Value);
  432.     SetFloatPrp(Value);
  433.   end;
  434.   procedure LoadStrPrp;
  435.   var
  436.     Value : string;
  437.   begin
  438.     Value := GetStrPrp;
  439.     Value := ReadString(ComponentName, PropertyName, Value);
  440.     SetStrPrp(Value);
  441.   end;
  442.  
  443. var
  444.   i : integer;
  445. begin
  446.   for i := 0 to FNotifiers.Count - 1 do
  447.     TRegAutoEvent(FNotifiers[i]^)(Self, roBeforeLoad);
  448.   if Assigned(FBeforeLoad) then FBeforeLoad(Self);
  449.  try
  450.   if SaveWindowPlace then LoadWindowPlacement;
  451.   for i:= 0 to FProps.Count - 1 do begin
  452.     LoadPropInf(FProps[i]);
  453.     if not FLoaded then continue;
  454.     GenerateRegistryName;
  455.     case PropTyp of
  456.       tkInteger,
  457.       tkChar,
  458.       tkWChar,
  459.       tkEnumeration : LoadOrdPrp;
  460.       tkFloat       : LoadFloatPrp;
  461.       tkString,
  462.       tkLString{$IFDEF RA_D3H},
  463.       tkWString{$ENDIF RA_D3H}     : LoadStrPrp;
  464.     end;
  465.   end;
  466.  except
  467.    on E : Exception do begin
  468.      E.Message := '╧≡εßδσ∞√ c TRegAuto' + E.Message;
  469.      raise ERegAutoError.Create(E.Message);
  470.    end;
  471. //   Application.MessageBox('╧≡εßδσ∞√ c TRegAuto', PChar(Application.Title), MB_OK + MB_ICONERROR);
  472.  end;
  473.   if Assigned(FAfterLoad) then FAfterLoad(Self);
  474.   for i := 0 to FNotifiers.Count - 1 do
  475.     TRegAutoEvent(FNotifiers[i]^)(Self, roAfterLoad);
  476. end;
  477.  
  478. procedure TRegAuto.LoadWindowPlacement;
  479. var
  480.   W : TWINDOWPLACEMENT;
  481.   Form : TForm;
  482. const
  483.   Vis : array[boolean] of integer = (SW_HIDE, SW_SHOW);
  484. begin
  485.   Form := Owner as TForm;
  486.   W.length := sizeof(TWINDOWPLACEMENT);
  487.   GetWindowPlacement(Form.Handle, @W);
  488.   W.showCmd := Vis[Form.Visible];
  489.   with W.rcNormalPosition do begin
  490.     Left   := ReadInteger(Form.Name, '.Left', Left);
  491.     Top    := ReadInteger(Form.Name, '.Top', Top);
  492.     if Form.BorderStyle in [bsSizeable, bsSizeToolWin] then
  493.     begin
  494.       Right  := ReadInteger(Form.Name, '.Right', Right);
  495.       Bottom := ReadInteger(Form.Name, '.Bottom', Bottom);
  496.     end;  
  497.   end;
  498.   SetWindowPlacement(Form.Handle, @W);
  499.   Form.WindowState := TWindowState(ReadInteger(Form.Name, '.WindowState', integer(Form.WindowState)));
  500. end;
  501.  
  502. procedure TRegAuto.SaveWindowPlacement;
  503. var
  504.   W : TWINDOWPLACEMENT;
  505.   Form : TForm;
  506. begin
  507.   Form := Owner as TForm;
  508.   W.length := sizeof(TWINDOWPLACEMENT);
  509.   GetWindowPlacement(Form.Handle, @W);
  510.   with W.rcNormalPosition do begin
  511.     WriteInteger(Form.Name, '.Left', Left);
  512.     WriteInteger(Form.Name, '.Top', Top);
  513.     WriteInteger(Form.Name, '.Right', Right);
  514.     WriteInteger(Form.Name, '.Bottom', Bottom);
  515.   end;
  516.   WriteInteger(Form.Name, '.WindowState', integer(Form.WindowState));
  517. end;
  518.  
  519. procedure TRegAuto.SetFProps(lProps : TStrings);
  520. begin
  521.   FProps.Assign(lProps);
  522. end;
  523.  
  524. function TRegAuto.ReadRootString(const Section, Ident, Default: string): string;
  525. var
  526.   RegIni1 : TRegIniFile;
  527. begin
  528.   RegIni1 := TRegIniFile.Create('');
  529.   Result := RegIni1.ReadString(Section, Ident, Default);
  530.   RegIni1.Free;
  531. end;
  532.  
  533. function TRegAuto.ReadRootInteger(const Section, Ident: string; Default: Longint): Longint;
  534. var
  535.   RegIni1 : TRegIniFile;
  536. begin
  537.   RegIni1 := TRegIniFile.Create('');
  538.   Result := RegIni1.ReadInteger(Section, Ident, Default);
  539.   RegIni1.Free;
  540. end;
  541.  
  542. procedure TRegAuto.WriteRootString(const Section, Ident, Value: string);
  543. var
  544.   RegIni1 : TRegIniFile;
  545. begin
  546.   RegIni1 := TRegIniFile.Create('');
  547.   RegIni1.WriteString(Section, Ident, Value);
  548.   RegIni1.Free;
  549. end;
  550.  
  551. procedure TRegAuto.WriteRootInteger(const Section, Ident: string; Value: Longint);
  552. var
  553.   RegIni1 : TRegIniFile;
  554. begin
  555.   RegIni1 := TRegIniFile.Create('');
  556.   RegIni1.WriteInteger(Section, Ident, Value);
  557.   RegIni1.Free;
  558. end;
  559.  
  560. procedure TRegAuto.SetSaveWindowPlace(F : boolean);
  561. begin
  562.   if Owner is TWinControl then FSaveWindowPlace := F;
  563. end;
  564.  
  565. procedure TRegAuto.SetIniStrings(AIniStrings : TStrings);
  566. begin
  567.   IniStrings.Assign(AIniStrings);
  568. end;
  569.  
  570. {**************************************************}
  571. procedure TRegAuto.CreateFile;
  572. begin
  573.   OldIniFile := FIniFile;
  574.   OldRegPath := FRegPath;
  575.   if FGlobalSettings then begin
  576.     if GlobalIniFile <> '' then FIniFile := GlobalIniFile;
  577.     if GlobalRegPath <> '' then FRegPath := GlobalRegPath;
  578.   end;
  579.   if FUseIni then Ini := TMyIniFile.Create(FIniFile);
  580.   if FUseReg then Reg := TRegIniFile.Create(FRegPath);
  581.   if FUseStr then Str := TIniStrings.Create(FIniStrings);
  582. end;
  583.  
  584. procedure TRegAuto.DestroyFile;
  585. begin
  586.   Reg.Free; Reg := nil;
  587.   Ini.Free; Ini := nil;
  588.   Str.Free; Str := nil;
  589.   if FGlobalSettings then begin
  590.     FIniFile := OldIniFile;
  591.     FRegPath := OldRegPath;
  592.   end;  
  593. end;
  594.  
  595. procedure TRegAuto.EraseSection(const Section: string);
  596. begin
  597.   CreateFile;
  598.   if FUseIni then Ini.EraseSection(Section);
  599.   if FUseReg then Reg.EraseSection(Section);
  600.   DestroyFile;
  601. end;
  602.  
  603. procedure TRegAuto.DeleteKey(const Section, Ident: String);
  604. begin
  605.   CreateFile;
  606.   if FUseIni then Ini.DeleteKey(Section, Ident);
  607.   if FUseReg then Reg.DeleteKey(Section, Ident);
  608.   DestroyFile;
  609. end;
  610.  
  611. function TRegAuto.ReadString(const Section, Ident, Default: string): string;
  612. begin
  613.   Result := Default;
  614.   CreateFile;
  615.   if FUseIni then Result := Ini.ReadString(Section, Ident, Default);
  616.   if FUseReg then Result := Reg.ReadString(Section, Ident, Default);
  617.   if FUseStr then Result := Str.ReadString(Section, Ident, Default);
  618.   DestroyFile;
  619. end;
  620.  
  621. procedure TRegAuto.WriteString(const Section, Ident, Value: string);
  622. begin
  623.   CreateFile;
  624.   if FUseIni then Ini.WriteString(Section, Ident, Value);
  625.   if FUseReg then Reg.WriteString(Section, Ident, Value);
  626.   if FUseStr then Str.WriteString(Section, Ident, Value);
  627.   DestroyFile;
  628. end;
  629.  
  630. function TRegAuto.ReadInteger(const Section, Ident: string;
  631.   Default: Longint): Longint;
  632. begin
  633.   Result := Default;
  634.   CreateFile;
  635.   if FUseIni then Result := Ini.ReadInteger(Section, Ident, Default);
  636.   if FUseReg then Result := Reg.ReadInteger(Section, Ident, Default);
  637.   if FUseStr then Result := Str.ReadInteger(Section, Ident, Default);
  638.   DestroyFile;
  639. end;
  640.  
  641. procedure TRegAuto.WriteInteger(const Section, Ident: string; Value: Longint);
  642. begin
  643.   CreateFile;
  644.   if FUseIni then Ini.WriteInteger(Section, Ident, Value);
  645.   if FUseReg then Reg.WriteInteger(Section, Ident, Value);
  646.   if FUseStr then Str.WriteInteger(Section, Ident, Value);
  647.   DestroyFile;
  648. end;
  649.  
  650. function TRegAuto.ReadBool(const Section, Ident: string;
  651.   Default: Boolean): Boolean;
  652. begin
  653.   Result := Default;
  654.   CreateFile;
  655.   if FUseIni then Result := Ini.ReadBool(Section, Ident, Default);
  656.   if FUseReg then Result := Reg.ReadBool(Section, Ident, Default);
  657.   if FUseStr then Result := Str.ReadBool(Section, Ident, Default);
  658.   DestroyFile;
  659. end;
  660.  
  661. procedure TRegAuto.WriteBool(const Section, Ident: string; Value: Boolean);
  662. begin
  663.   CreateFile;
  664.   if FUseIni then Ini.WriteBool(Section, Ident, Value);
  665.   if FUseReg then Reg.WriteBool(Section, Ident, Value);
  666.   if FUseStr then Str.WriteBool(Section, Ident, Value);
  667.   DestroyFile;
  668. end;
  669.  
  670. function TRegAuto.ReadFloat(const Section, Ident: string; Default: Double): Double;
  671. begin
  672.   Result := Default;
  673.   CreateFile;
  674.   if FUseIni then Result := Ini.ReadFloat(Section, Ident, Default);
  675.   if FUseReg then Result := StrToFloat(Reg.ReadString(Section, Ident, FloatToStr(Default)));
  676.   if FUseStr then Result := Str.ReadFloat(Section, Ident, Default);
  677.   DestroyFile;
  678. end;
  679.  
  680. procedure TRegAuto.WriteFloat(const Section, Ident: string; Value: Double);
  681. begin
  682.   CreateFile;
  683.   if FUseIni then Ini.WriteFloat(Section, Ident, Value);
  684.   if FUseReg then Reg.WriteString(Section, Ident, FloatToStr(Value));
  685.   if FUseStr then Str.WriteFloat(Section, Ident, Value);
  686.   DestroyFile;
  687. end;
  688.  
  689. procedure TRegAuto.ReadStrings(const Section, Ident : string; Strings : TStrings);
  690. var
  691.   S : string;
  692. begin
  693.   S := Strings.Text;
  694.   S := ReplaceSokr1(S, #13#10, '|');
  695.   S := ReadString(Section, Ident, S);
  696.   S := ReplaceSokr1(S, '|', #13#10);
  697.   Strings.Text := S;
  698. end;
  699.  
  700. procedure TRegAuto.WriteStrings(const Section, Ident: string; Value: TStrings);
  701. var
  702.   S : string;
  703. begin
  704.   S := Value.Text;
  705.   S := ReplaceSokr1(S, #13#10, '|');
  706.   WriteString(Section, Ident, S);
  707. end;
  708.  
  709. procedure TRegAuto.ReadSection(const Section : string; Ss : TStrings);
  710. begin
  711.   CreateFile;
  712.   if FUseIni then Ini.ReadSection1(Section, Ss);
  713.   if FUseReg then Reg.ReadSection(Section, Ss);
  714.   if FUseStr then Str.ReadSection(Section, Ss);
  715.   DestroyFile;
  716. end;
  717.  
  718. procedure TRegAuto.ReadSections(Ss : TStrings);
  719. begin
  720.   CreateFile;
  721.   if FUseIni then Ini.ReadSections(Ss);
  722.   if FUseReg then Reg.ReadSections(Ss);
  723.   if FUseStr then Str.ReadSections(Ss);
  724.   DestroyFile;
  725. end;
  726.  
  727. procedure TRegAuto.AddNotify(ANotify : TRegAutoEvent);
  728. var
  729.   Notify : ^TRegAutoEvent;
  730. begin
  731.   New(Notify);
  732.   Notify^ := ANotify;
  733.   FNotifiers.Add(Notify);
  734. end;
  735.  
  736. procedure TRegAuto.RemoveNotify(ANotify : TRegAutoEvent);
  737. var
  738.   i : Integer;
  739.   Notify : ^TRegAutoEvent;
  740. begin
  741.   for i := 0 to FNotifiers.Count - 1 do
  742.   begin
  743.     Notify := FNotifiers[i];
  744.     if (TMethod(Notify^).Code = TMethod(ANotify).Code) and
  745.       (TMethod(Notify^).Data = TMethod(ANotify).Data) then
  746.     begin
  747.       Dispose(Notify);
  748.       FNotifiers.Delete(i);
  749.       break;
  750.     end;
  751.   end;
  752. end;
  753.  
  754.  
  755. {********************* TMyIniFile **********************}
  756. function TMyIniFile.ReadSection1(const Section : string; Ss : TStrings) : boolean;
  757. var
  758.   F : integer;
  759.   S : string;
  760. begin
  761.   with TStringList.Create do
  762.   try
  763.     LoadFromFile(FileName);
  764.     F := IndexOf('['+Section+']');
  765.     Result := F > -1;
  766.     if Result then begin
  767.       Ss.BeginUpdate;
  768.       try
  769.         Ss.Clear;
  770.         inc(F);
  771.         while F < Count do begin
  772.           S := Strings[F];
  773.           if (Length(S) > 0) and (Trim(S[1])= '[') then break;
  774.           Ss.Add(S);
  775.           inc(F);
  776.         end;
  777.       finally
  778.         Ss.EndUpdate;
  779.       end;
  780.     end;
  781.   finally
  782.     Free;
  783.   end;
  784. end;
  785.  
  786. {$IFNDEF RA_D35H}
  787. function TMyIniFile.ReadFloat(const Section, Ident: string; Default: Double): Double;
  788. begin
  789.   Result := StrToFloat(ReadString(Section, Ident, FloatToStr(Default)));
  790. end;
  791.  
  792. procedure TMyIniFile.WriteFloat(const Section, Ident: string; Value: Double);
  793. begin
  794.   WriteString(Section, Ident, FloatToStr(Value));
  795. end;
  796. {$ENDIF RA_D35H}
  797.  
  798. {##################### TMyIniFile #####################}
  799.  
  800. {********************* TIniStrings **********************}
  801. constructor TIniStrings.Create(AStrings : TStrings);
  802. begin
  803.   inherited Create;
  804.   FStrings := AStrings;
  805. end;
  806.  
  807. function TIniStrings.ReadString(const Section, Ident, Default: string): string;
  808. var
  809.   i : integer;
  810.   S : string;
  811.   P : integer;
  812. begin
  813.   Result := Default;
  814.   i := FStrings.IndexOf('['+Section+']');
  815.   if i = -1 then exit;
  816.   inc(i);
  817.   while i < FStrings.Count do begin
  818.     S := FStrings[i];
  819.     inc(i);
  820.     if Length(S) = 0 then continue;
  821.     if S[1] = '[' then exit;
  822.     if ANSIStrLIComp(PChar(Ident), PChar(S), Length(Ident)) = 0 then begin
  823.       P := Pos('=', S);
  824.       if P <> 0 then
  825.         Result := Copy(S, P+1, Length(S));
  826.       exit;
  827.     end;
  828.   end;
  829. end;
  830.  
  831. procedure TIniStrings.WriteString(const Section, Ident, Value: string);
  832. begin
  833.   raise ERegAutoError.Create('TIniStrings.WriteString not supported in current version');
  834. end;
  835.  
  836. function TIniStrings.ReadInteger(const Section, Ident: string;
  837.   Default: Longint): Longint;
  838. begin
  839.   try
  840.     Result := StrToInt(ReadString(Section, Ident, IntToStr(Default)));
  841.   except
  842.     Result := Default;
  843.   end;
  844. end;
  845.  
  846. procedure TIniStrings.WriteInteger(const Section, Ident: string; Value: Longint);
  847. begin
  848.   WriteString(Section, Ident, IntToStr(Value));
  849. end;
  850.  
  851. function TIniStrings.ReadBool(const Section, Ident: string;
  852.   Default: Boolean): Boolean;
  853. var
  854.   S : string;
  855. begin
  856.   S := Trim(ReadString(Section, Ident, IntToStr(integer(Default))));
  857.   Result := (S = '1') or (ANSICompareText(S, 'on') = 0)  or (ANSICompareText(S, 'yes') = 0);
  858. end;
  859.  
  860. procedure TIniStrings.WriteBool(const Section, Ident: string; Value: Boolean);
  861. begin
  862.   WriteString(Section, Ident, IntToStr(integer(Value)));
  863. end;
  864.  
  865. function TIniStrings.ReadFloat(const Section, Ident: string; Default: Double): Double;
  866. begin
  867.   try
  868.     Result := StrToFloat(ReadString(Section, Ident, FloatToStr(Default)));
  869.   except
  870.     Result := Default;
  871.   end;
  872. end;
  873.  
  874. procedure TIniStrings.WriteFloat(const Section, Ident: string; Value: Double);
  875. begin
  876.   WriteString(Section, Ident, FloatToStr(Value));
  877. end;
  878.  
  879. function TIniStrings.ReadSection(const Section : string; Ss : TStrings) : boolean;
  880. var
  881.   F : integer;
  882.   S : string;
  883. begin
  884.   F := FStrings.IndexOf('['+Section+']');
  885.   Result := F > -1;
  886.   if Result then
  887.   begin
  888.     Ss.BeginUpdate;
  889.     try
  890.       Ss.Clear;
  891.       inc(F);
  892.       while F < FStrings.Count do begin
  893.         S := FStrings[F];
  894.         if (Length(S) > 0) and (Trim(S[1])= '[') then break;
  895.         Ss.Add(S);
  896.         inc(F);
  897.       end;
  898.     finally
  899.       Ss.EndUpdate;
  900.     end;
  901.   end;
  902. end;
  903.  
  904. procedure TIniStrings.ReadSections(Ss : TStrings);
  905. var
  906.   i : integer;
  907.   S : string;
  908. begin
  909.   Ss.Clear;
  910.   for i := 0 to FStrings.Count - 1 do
  911.   begin
  912.     S := Trim(FStrings[i]);
  913.     if (Length(S) > 0) and (S[1]= '[') and (S[Length(S)]= ']') then
  914.       Ss.Add(Copy(S, 2, Length(S) - 2));
  915.   end;
  916. end;
  917.  
  918. end.
  919.  
  920.