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?
 
sftwengCommented:
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
Cloud Class® Course: Microsoft Office 2010

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

 
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
 
rbohacCommented:
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.