Jeremy Coulter asks:

> What I want it for is a properties page where the user sets up what they
> want the app to look like etc. so saving specific properties like
> IndexItem, Value, text etc. of the components based on their type, is
> the best way to go.

and later mentioned:

> Ok, but how do I access the values? i.e. How do I read say
> checkbox10...as an example to see if its checked or not?

so it looks like he is essentially trying to read and write component
properties to the registry.

There are two basic methods that you can use to achieve this sort of thing,
and the differencve lies in how you want to handle backwards compatibility
when component are updated over time.

The first mechanism is to simply overload the standard Delphi streaming code
and read and write the DFM stuff into a registry value. Code something like
this is a start:

  Mem := TMemoryStream.Create;
  Mem.WriteComponent(ACheckBox);    // Dumps propertes into stream
  with TRegistry.Create do
    try
      if not OpenKey('Software\MyApplication\Componentdata') then
          raise Exception.Create('Registry failure!');
      WriteBinaryData(ACheckBox.Name, PChar(Mem.Memory)^, Mem.Size);
    finally
      Destroy
    end

and do the reverse on the way back in, that is read the registry data into a
memory stream, reset the memory stream to the start and use ReadComponent to
read the properties back in again. For more on this sort of technique you
need to read around in Classes.pas to see how Borland wrote all teh Delphi
streaming code.

The only problem with this is that is you rename, delete or change the
allowable values of a property you have all sorts of problems reading the
old format values back in again, because Delphi has no mechamism to allow
for recovering from errors during property streaming. If you are never going
tio change your properties then you have no problem otherwise you need to
change the format of the saved vales from Delphi's DFM to your own scheme.

The basis of doing this is to do the above, but rather than using
WriteComponent you preform your own enumeration through the published
proporties and then write their values out in your format. I actually do
this for our custom report designer and write the values I need to out into
a sort of butchered CVS file and it works well. I have coded things so that
I can detect versions of file and as the format changes I can adapt the
reader to handle old versions cleanly.

Extra bonus marks would be to store all the enumerated property values into
an XML file, as this would be the perfect combination of readable output,
backwards compatibility and style, and have maximum sexyness.

Cheers, Max.


---------------------------------------------------------------------------
    New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
                  Website: http://www.delphi.org.nz
To UnSub, send email to: [EMAIL PROTECTED] 
with body of "unsubscribe delphi"
Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/

Reply via email to