Registry question

Anyone have a good idea on what the best way to save/load information from a record structure to the registry?

record structure:

Type
    TidList = packed record

      item1 : boolean;
      item2 : byte;
      itype  : string [255];
      iavail  : boolean;

end
mantra246Asked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
sftwengConnect With a Mentor Commented:
Using TRegistry or TRegistryIniFile, you are pretty much restricted to doing individual read and write operations for each element of the record structure. E.g.,

procedure WriteToRegistry (aTidList : TidList);
const
  RegistryName = 'MyRegistryTidList';
var
  fRegistryIniFile : TRegistryIniFile;
begin
  fRegistryIniFile                                              
    := TRegistryIniFile.Create(RegistryName);                    
  try
    fRegistryIniFile.WriteBool(RegistrySection,'item1',aTidList.item1);
    fRegistryIniFile.WriteInteger(RegistrySection,'item2',ord(aTidList.item2));
    fRegistryIniFile.WriteString(RegistrySection,'itype',aTidList.iType);
    fRegistryIniFile.WriteBool(RegistrySection,'iavail',aTidList.iavail);
  finally                                                        
    fRegistryIniFile.Free;                                      
  end {try};  
end {WriteToRegistry};

procedure ReadFromRegistry (aTidList : TidList);
const
  RegistryName = 'MyRegistryTidList';
var
  fRegistryIniFile : TRegistryIniFile;
begin
  fRegistryIniFile                                              
    := TRegistryIniFile.Create(RegistryName);                    
  try
    aTidList.item1 := fRegistryIniFile.ReadBool(RegistrySection,'item1',False);
    aTidList.item2 :=  fRegistryIniFile.Integer(RegistrySection,'item2',0) mod 256;
    aTidList.itype := fRegistryIniFile.ReadString(RegistrySection,'itype','');
    aTidList.iavail := fRegistryIniFile.ReadBool(RegistrySection,'iavail',Falsel);
  finally                                                        
    fRegistryIniFile.Free;                                      
  end {try};  
end {ReadFromRegistry};

You might also like to use ReadSection to get the list ok keys.
0
 
Ivanov_GCommented:
make it as a class and implement Load / Save methods...

type
  MyString = string[255];

  TidList = class
  private
  public
    item1   : boolean;
    item2   : byte;
    itype   : MyString;
    iavail  : boolean;
    procedure SetValues (it1 : Boolean; it2 : Byte; itype : MyString; iav : Boolean);
    procedure LoadFromRegistry;
    procedure SaveToRegistry;
  end;
0
 
LRHGuyCommented:
Here's an example, all-in-one, break out into separate routines...

procedure SaveOrLoad(aItem:tIDList);
const
  KeyName='SAVEME';
var
  R:tregistry;
begin
  R:=TRegistry.Create(KEY_READ);
  try
    R.RootKey = HKEY_LOCAL_MACHINE;

    // save
    R.OpenKey(KeyName,True); //create if doesn't exist
    with aItem do begin
      R.WriteBool('ITEM1');
      R.WriteString('ITYPE');
      R.WriteInteger('ITEM2');
      R.WriteBool('IAVAIL');
    end;

    // Load
    R.OpenKey(KeyName,False); //do not create if doesn't exist
    with aItem do begin
      item1:=R.ReadBool('ITEM1');
      itype:=R.ReadString('ITYPE');
      item2:=R.ReadInteger('ITEM2');
      iavail:=R.ReadBool('IAVAIL');
    end;
  finally
    R.Free;
  end;
end;
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LRHGuyCommented:
Oops...this is the SAVE part:

    with aItem do begin
      R.WriteBool('ITEM1',item1);
      R.WriteString('ITYPE',itype);
      R.WriteInteger('ITEM2',item2);
      R.WriteBool('IAVAIL',iavail);
    end;
0
 
rbohacConnect With a Mentor Commented:
You could also write the entire record as binary data:


var
  Form1: TForm1;
  reg : TRegistry;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Reg := TRegistry.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Reg.Free;
end;

procedure TForm1.btnWriteDataClick(Sender: TObject);
var
  Data : TidList;
begin
  if Reg.OpenKey('SOFTWARE\TEST',True) then
    begin
      Reg.WriteBinaryData('MyData',Data,SizeOf(TIdList));
      Reg.CloseKey;
    end;
end;

procedure TForm1.btnReadDataClick(Sender: TObject);
var
  Data : TidList;
begin
  if Reg.OpenKey('SOFTWARE\TEST',False) then
    begin
      if Reg.ValueExists('MyData') then
        Reg.ReadBinaryData('MyData',Data,SizeOf(TIdList));
      Reg.CloseKey;
    end;
end;
0
 
sftwengCommented:
rbohac, agreed that you CAN do that however I recommend against it; by writing the individual elements, you can survive a change of structure later on, e.g., allowing the use of registry entries from a prior release of the software even though the internal representation might have changed.
0
 
sftwengCommented:
Another consideration - Microsoft is moving away from a centralized registry in .NET, in favour of local INI files. Therefore I believe that TRegistryIniFile is a better choice since it supports both the registry and *.ini files, depending on the opearting system.
0
 
mantra246Author Commented:
sftweng - neat method you use, but what do you mean about ReadSection? (i've never really used the registry before other than to store the odd variable or two)
0
 
mantra246Author Commented:
> Microsoft is moving away from a centralized registry in .NET, in favour of local INI files

I wish Microsoft would make up their mind - can you say U-Turn.  It used to be that INI files were the expected way to go then the registry was the better option to be used - now ini files are to be used again!  Sheesh!
0
 
rbohacCommented:
I agree, but it is useful if you don't want the data to be <easily> editably by the end user
0
 
sftwengCommented:
mantra246, ReadSection from Delphi help:

Reads all the key names from a specified section of an INI file into a string list.

procedure ReadSection (const Section: String; Strings: TStrings); override;

Description

Call ReadSection to retrieve the names of all keys within a specified section of an INI file into a string list object.

Section identifies the section from which to retrieve a list of key names. Strings specifies the string object to hold the retrieved names. Strings can point to a TString object such as a string list, or to a component property, such as Items for a TListBox component, that is a TString object itself.
0
 
sftwengCommented:
rbohac, a good point. The usual tradeoff between ease of use and security. ;-)
0
 
mantra246Author Commented:
Thanks to both sftweng and rbohac for showing two very good methods.

I raised the points to give you both the original 250 points each.
0
 
sftwengCommented:
Thanks.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.