Plugin Question: Saving Registry options to HKEY_LOCAL_MACHINE?
I am using Delphi 5.0 with RB 6.02.
I am trying to save the ReportBuilder registry keys to the
HKEY_LOCAL_MACHINE instead of HKEY_CURRENT_USER. We have this as a
command like option for our application.
I am trying create a plug in for the TppRegistry class in the
ppIniStorage unit. I followed the Tech Tip but still is will not accept
it. I warn you this is the first time I have tried to write a plug in so
bare with me.
Here is what I have in my new plug in unit. I think the code should work
providing I can get the plug in to be accepted. I can put a breakpoint
in the create and it never gets executed.
Any comments or suggestions would be great.
--------------- start of code
unit UnitDevRWIniStorage;
interface
uses inifiles, ppIniStorage, proreg, registry;
type
TppdevRegistry = class(TppCustomIniFileStorage)
protected
function CreateCustomIniFile(aStorageName: String):
TCustomIniFile; override;
public
constructor Create(aStorageName: String); override;
class function ClassDescription: String; override;
class function DefaultStorageName: String; override;
end; {class, TppdevRegistry}
implementation
constructor TppdevRegistry.Create(aStorageName: String);
begin
inherited Create(aStorageName);
TRegistryIniFile(CustomIniFile).RegIniFile.RootKey :=
SystemRegistryKey;
end; {function, Create}
{------------------------------------------------------------------------------}
{ TppdevRegistry.CreateCustomIniFile }
function TppdevRegistry.CreateCustomIniFile(aStorageName: String):
TCustomIniFile;
begin
Result := TRegistryIniFile.Create(aStorageName)
end; {function, CreateCustomIniFile}
{------------------------------------------------------------------------------}
{ TppdevRegistry.Description }
class function TppdevRegistry.ClassDescription: String;
begin
Result := 'Registry';
end; {class function, Description}
{------------------------------------------------------------------------------}
{ TppdevRegistry.DefaultStorageName }
class function TppdevRegistry.DefaultStorageName: String;
begin
Result := 'RBuilder';
end; {class function, DefaultStorageName}
initialization
TppIniStoragePlugIns.Register(TppdevRegistry);
finalization
TppIniStoragePlugIns.UnRegister(TppdevRegistry);
end.
---------- end of code
I am trying to save the ReportBuilder registry keys to the
HKEY_LOCAL_MACHINE instead of HKEY_CURRENT_USER. We have this as a
command like option for our application.
I am trying create a plug in for the TppRegistry class in the
ppIniStorage unit. I followed the Tech Tip but still is will not accept
it. I warn you this is the first time I have tried to write a plug in so
bare with me.
Here is what I have in my new plug in unit. I think the code should work
providing I can get the plug in to be accepted. I can put a breakpoint
in the create and it never gets executed.
Any comments or suggestions would be great.
--------------- start of code
unit UnitDevRWIniStorage;
interface
uses inifiles, ppIniStorage, proreg, registry;
type
TppdevRegistry = class(TppCustomIniFileStorage)
protected
function CreateCustomIniFile(aStorageName: String):
TCustomIniFile; override;
public
constructor Create(aStorageName: String); override;
class function ClassDescription: String; override;
class function DefaultStorageName: String; override;
end; {class, TppdevRegistry}
implementation
constructor TppdevRegistry.Create(aStorageName: String);
begin
inherited Create(aStorageName);
TRegistryIniFile(CustomIniFile).RegIniFile.RootKey :=
SystemRegistryKey;
end; {function, Create}
{------------------------------------------------------------------------------}
{ TppdevRegistry.CreateCustomIniFile }
function TppdevRegistry.CreateCustomIniFile(aStorageName: String):
TCustomIniFile;
begin
Result := TRegistryIniFile.Create(aStorageName)
end; {function, CreateCustomIniFile}
{------------------------------------------------------------------------------}
{ TppdevRegistry.Description }
class function TppdevRegistry.ClassDescription: String;
begin
Result := 'Registry';
end; {class function, Description}
{------------------------------------------------------------------------------}
{ TppdevRegistry.DefaultStorageName }
class function TppdevRegistry.DefaultStorageName: String;
begin
Result := 'RBuilder';
end; {class function, DefaultStorageName}
initialization
TppIniStoragePlugIns.Register(TppdevRegistry);
finalization
TppIniStoragePlugIns.UnRegister(TppdevRegistry);
end.
---------- end of code
This discussion has been closed.
Comments
1. Simplest way to create this would be to descend from the ppRegistry
class and override 2 methods:
TppdevRegistry = class(TppRegistry)
protected
function CreateCustomIniFile(aStorageName: String): TCustomIniFile;
override;
public
class function ClassDescription: String; override;
end;
function TppdevRegistry.CreateCustomIniFile(aStorageName: String):
TCustomIniFile;
var
lRegistryFile: TRegistrFile;
begin
lRegistryFile := TRegistryIniFile.Create(aStorageName)
lRegistryFile.RegIniFile.RootKey := SystemRegistryKey;
Result := lRegistryFile;
end;
class function TppdevRegistry.ClassDescription: String;
begin
Result := 'DevRegistry';
end; {class function, Description}
2. Set TppDesigner.IniStorageType to 'DevRegistry'. I think the problem
with your plug-in is that you the ClassDescription you used is Registry,
which is one that is already registered by RB.
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
settings are still saved in HKEY_CURRENT_USER while our other application settings are
in HKEY_LOCAL_MACHINE. I tried the breakpoint again but the CreateCustomIniFile is not
being executed.
Here is the updated unit.
----- START OF CODE
unit UnitDevRWIniStorage;
interface
uses inifiles, ppIniStorage, proreg, registry;
type
TppdevRegistry = class(TppRegistry)
protected
function CreateCustomIniFile(aStorageName: String): TCustomIniFile; override;
public
class function ClassDescription: String; override;
end; {class, TppdevRegistry}
implementation
{------------------------------------------------------------------------------}
{ TppdevRegistry.CreateCustomIniFile }
function TppdevRegistry.CreateCustomIniFile(aStorageName: String): TCustomIniFile;
var
TempRegFile: TRegistryIniFile;
begin
TempRegFile := TRegistryIniFile.Create(aStorageName);
TempRegFile.RegIniFile.RootKey := SystemRegistryKey;
Result := TempRegFile;
end; {function, CreateCustomIniFile}
{------------------------------------------------------------------------------}
{ TppdevRegistry.Description }
class function TppdevRegistry.ClassDescription: String;
begin
Result := 'DevRegistry';
end; {class function, Description}
initialization
TppIniStoragePlugIns.Register(TppdevRegistry);
finalization
TppIniStoragePlugIns.UnRegister(TppdevRegistry);
end.
--------- END OF CODE
Works fine when I try it here - although I do not seem to have write key
access to HKEY_LOCAL_MACHINE.
Make sure that you setting the TppDesigner.IniStorageType to
'DevRegistry' and including the UnitDevRWIniStorage in the 'uses' clause
of your application.
In your application you need something like this:
uses
UnitDevRWIniStorage;
begin
myDesigner.IniStorageType := TppdevRegistry .ClassDescription;
myDesigner.IniStorageName := 'RBuilder'; {or whatever name you want to
use}
myDesigner.ShowModal;
end;
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com
have tried this before. Or suggested an additional property of the Designer to state the
RootKey.
Setting TppDesigner.IniStorageType to DevRegistry made my plugin get executed. Unfortunately
it does not save the registry into the correct area. The TRegistryIniFile.Create method
creates an empty registry key in HKEY_CURRENT_USER before I get a change to tell the
TRegisitryIniFile to point to HKEY_LOCAL_MACHINE. I would be ok with that but the same
registry key is not created in HKEY_LOCAL_MACHINE. Instead it saves all of the designer
properties into keys directly under HKEY_LOCAL_MACHINE instead of in the desired path.
Here is the code changed I made to the form create of the form that has the Designer on it.
ppDesigner.IniStorageType := TppdevRegistry.ClassDescription;
ppDesigner.IniStorageName := 'Software\Dev\App\ReportWriter\Settings';
The properties I have set by default in the object inspector are:
ppDesigner.IniStorageType := 'Registry';
ppDesigner.IniStorageName := 'Software\Dev\App\ReportWriter\Settings';
Any thoughts?
I really need to find an answer to this one. Thanks.
Sorry for the delay did not see this post.
1. I am not an expert on TRegistryIniFile so I am not really qualified
to answer the question.
2. I do know that TppIniStorage is constructed such a way as to support
ANY type of storage. The internal implementation details are left to the
developer.
3. I would think the RegistryIniFile would have a way to work. But you
can always use another approach. I would spend some time playing around
with TRegistryIniFile outside of ReportBuilder. Just try creating a
TRegistryIniFile instance and try storing keys to the location you want.
4. I do not know why in the ObjectInspector for Designer you have
ppDesigner.IniStorageType := 'Registry';
That is incorrect. That Registry value is used for the RB TppRegistry
class.
Your custom class should have its own description - I think you need
something like
ppDesigner.IniStorageType := 'DevRegistry';
Try modifying the libarary path from RBuilder\Lib to RBuilder\Source and
then trace the source code.
Best regards,
Nard Moseley
Digital Metaphors
www.digital-metaphors.com