Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kapseln von Registryzugriffen (https://www.delphipraxis.net/140571-kapseln-von-registryzugriffen.html)

Schwedenbitter 21. Sep 2009 10:39


Kapseln von Registryzugriffen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe eine Programm geschrieben, in dem häufig auf die Registry zugegriffen wird. Leider muss ich das irgendwann eines Tages auch mal warten. Und da die Werte (Schlüsseleinträge) immer mehr wurden und noch werden, dachte ich mir das ganze in ein Object zu kapseln. So könnte ich dann sehr komfortabel einfach auf die Eigenschaften dieses Objects zugreifen und müsste nicht immer umständlich mit TRegistry arbeiten.

Den allerersten Anfang habe ich gemacht. Nur leider funktioniert das Schreiben des Wertes nicht. Denn Quellcode habe ich mal angefügt.

Kann mir jemand sagen, warum es nicht geht und wie ich es hinbekomme?

Gruß und Dank, Alex

Luckie 21. Sep 2009 10:44

Re: Kapseln von Registryzugriffen
 
Bitte poste doch den relevanten Quellcode. Ich denke, die wenigsten haben Lust erst ein Archiv runterzuladen, es zu entpacken und dann noch einen Editor zum Betrachten deines Quellcodes zu öffnen.

nahpets 21. Sep 2009 11:03

Re: Kapseln von Registryzugriffen
 
Hallo,

ausgehend vom Quelltext ist für mich nicht erkennbar, warum das Schreiben nicht funktionieren sollte.

Schwedenbitter 21. Sep 2009 11:07

Re: Kapseln von Registryzugriffen
 
Zitat:

Zitat von Luckie
Was willst du noch einfacher machen?

Ich möchte das hier
Delphi-Quellcode:
Function Holewert: String;
Var
   RINI         : TRegistry;
Begin
   Result:='';
   RINI:=TRegistry.Create;
   Try
      RINI.RootKey:=HKEY_CURRENT_USER;
      If RINI.OpenKeyReadOnly('Irgendwas') Then
      Begin
         Result:=RINI.ReadString('Irgendwas');
         RINI.CloseKey;
      End;
   Finally
      RINI.Free;
   End;
End;
für jede einzelne Abfrage der Registry vermeiden. Es kommt hinzu, dass ich häufig zwischen den RootKeys HKEY_CURRENT_USER und HKEY_LOCAL_MACHINE wechseln muss. Es soll daher mindestens das Anlegen von RINI und das Freigeben nicht jedesmal gemacht werden müssen.

Zitat:

Zitat von Luckie
Und bitte poste doch den relevanten Quellcode.

Hier kommt er:
Delphi-Quellcode:
Unit AdvoPlex_Object;

Interface

Uses
   Windows,
   Classes,
   Registry;

Const
   {$EXTERNALSYM HKEY_CURRENT_USER}
   HKEY_CURRENT_USER   = ($80000001);
   {$EXTERNALSYM HKEY_LOCAL_MACHINE}
   HKEY_LOCAL_MACHINE= ($80000002);
   AdvoPfad            ='Software\AdvoSolutions\AdvoPlex';

Type
   TAdvoPlex   = Class(TComponent)
                     Private
                        RINI         : TRegistry;
                        FUserSU      : String;
                     Protected
                        Function GetUser: String;
                        Function GetUserSU: String;
                        Procedure SetUserSU(Value: String);
                     Public
                        Constructor Create(AOwner:Tcomponent);Override;
                        Destructor Destroy; Override;
                     Published
                        Property   User      : String   Read   GetUser;
                        Property UserSU   : String   Read   GetUserSU   Write SetUserSU;
                 End;

Implementation

Constructor TAdvoPlex.Create(AOwner: TComponent);
Begin
   Inherited Create(AOwner);
   RINI:=TRegistry.Create;
End;

Destructor TAdvoPlex.Destroy;
Begin
   RINI.Free;
   Inherited Destroy;
End;

Function TAdvoPlex.GetUser;
   Function WhoAmI: String;
   Var
      Buffer      : Array [0..MAX_PATH] Of Char;
      Size         : DWORD;
   Begin
      Size:=SizeOf(Buffer);
      GetUserName(Buffer,Size);
      SetString(Result,Buffer,lstrlen(Buffer));
   End;
Begin
   Result:=WhoAmI;
End;

Function TAdvoPlex.GetUserSU;
Begin
   RINI.RootKey:=HKEY_CURRENT_USER;
   If RINI.OpenKeyReadOnly(AdvoPfad) Then
   Begin
      Result:=RINI.ReadString('User');
      RINI.CloseKey;
   End;
End;

Procedure TAdvoPlex.SetUserSU(Value: string);
Begin
   RINI.RootKey:=HKEY_CURRENT_USER;
   If RINI.OpenKey(AdvoPfad, True) Then
   Begin
      RINI.WriteString('User', Value);
      RINI.CloseKey;
   End;
End;

End.
Zitat:

Zitat von Luckie
Ich denke, die wenigsten haben Lust erst ein Archiv runterzuladen, es zu entpacken und dann noch einen Editor zum Betrachten deines Quellcodes zu öffnen.

Dann wird es aber vermutlich auch schwieriger, den Fehler zu finden.

Gruß, Alex

Schwedenbitter 21. Sep 2009 11:09

Re: Kapseln von Registryzugriffen
 
Zitat:

Zitat von nahpets
Hallo,
ausgehend vom Quelltext ist für mich nicht erkennbar, warum das Schreiben nicht funktionieren sollte.

Eben.
Ich verstehe es ja auch nicht :wall: Ich bekomme immer die Meldung: "Im Projekt ist eine Exception der Klasse ERegistryException mit der Meldung 'Fehler beim Setzen der Daten für 'User'' aufgetreten.

Achso: Ich habe TurboDelphi 2006.

Gruß, Alex

Luckie 21. Sep 2009 11:13

Re: Kapseln von Registryzugriffen
 
Das was du als Datei angehangen hast, ist auch nicht mher, als das was du jetzt gepostet hast. Warum sollte man den Fehler also besser finden?

Hast du deinen Code schon mal debuggt? Wie benutzt du die Klasse?

nahpets 21. Sep 2009 11:22

Re: Kapseln von Registryzugriffen
 
Hallo @Schwedenbitter,

mit Deinem unveränderten Quelltext (D7 Prof.) tritt der Fehler nicht auf. Der Eintrag wird in die Registrierung geschrieben.

Schwedenbitter 21. Sep 2009 13:59

Re: Kapseln von Registryzugriffen
 
Zitat:

Zitat von nahpets
mit Deinem unveränderten Quelltext (D7 Prof.) tritt der Fehler nicht auf. Der Eintrag wird in die Registrierung geschrieben.

Danke fürs Testen. Auf einem Rechner habe ich noch ein in die Jahre gekommenes Delphi 6. Dort kommt der Fehler leider auch.

@nahpets
Könntest Du mir bitte mal einen Gefallen tun? Ich gehe davon aus, dass D7 Prof beim Öffnen und/oder Schließen eine .cfg-Datei schreibt. Ich vermute anhand des Erfolges bei Dir, dass es evtl. an irgend welchen Compiler-Einstellungen liegen könnte.
Kann ich bitte mal die .cfg-Datei (ggf. auch als PM) bekommen, mit der Du das kompiliert hast?

Ich suche insofern auch mal BETA-Tester :lol:, denen ich das mal als exe zukommen lassen könnte, um auszuschließen, dass es an meinem/meinen System(en) liegt. Ich weiß nicht, ob die Forenregeln das Anhängen von exe-Dateien zulassen und bin zu beschäftigt, um das auf die Schnelle nachzusehen.

Gruß, Alex

HeikoAdams 21. Sep 2009 14:05

Re: Kapseln von Registryzugriffen
 
Also Du könntest Dir einiges an Code sparen, wenn Du eine globale Variable von Typ TRegistry nutzt, die Du beim Programmstart initialisierst und beim Programmende wieder auflöst. So mache ich das zumindest in meinen Projekten. Alternativ könntest Du auch die JclRegistry Unit aus den Jedis nutzen ;)

nahpets 21. Sep 2009 14:06

Re: Kapseln von Registryzugriffen
 
Hallo,

anliegend das ganze Projekt mit Exe zum Probieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz