Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Luckie 21. Sep 2009 15:54

Re: Kapseln von Registryzugriffen
 
Keine Ahnung woran es gelegen hat. Aber das Konzept war sowieso nicht schön. Hier mal meine Version:
Delphi-Quellcode:
unit AdvoPlex_Object;

interface

uses
  Windows,
  Classes,
  SysUtils,
  Registry;

const
  ADVOPATH        = 'Software\AdvoSolutions\AdvoPlex';

type
  TAdvoPlex = class(TObject)
  private
    FUserSU: string;
    function CurrentUser: string;
    function GetUserSU: string;
    procedure SetUserSU(Value: string);
  public
    constructor Create;
    destructor Destroy; override;
  published
    property UserSU: string read GetUserSu write SetUserSU;
    procedure SaveUserSU;
    procedure LoadUserSU;
  end;

implementation

constructor TAdvoPlex.Create;
begin
  inherited Create;
end;

destructor TAdvoPlex.Destroy;
begin
  inherited Destroy;
end;

function TAdvoPlex.GetUserSU: string;
begin
  Result := FUserSU;
end;

procedure TAdvoPlex.LoadUserSU;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create(KEY_READ);
  try
    reg.RootKey := HKEY_CURRENT_USER;
    if reg.OpenKeyReadOnly(ADVOPATH) then
    begin
      FUserSU := reg.ReadString('User');
      reg.CloseKey;
    end
    else
      raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Lesen von UserSU', SysErrorMessage(GetLastError)]);
  finally
    reg.Free;
  end;
end;

procedure TAdvoPlex.SaveUserSU;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create(KEY_ALL_ACCESS);
  try
    reg.RootKey := HKEY_CURRENT_USER;
    if reg.OpenKey(ADVOPATH, True) then
    begin
      reg.WriteString('User', FUserSU);
      reg.CloseKey;
    end
    else
      raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Schreiben von UserSU', SysErrorMessage(GetLastError)]);
  finally
    reg.Free;
  end;
end;

procedure TAdvoPlex.SetUserSU(Value: string);
begin
  FUserSU := Value;
end;

function TAdvoPlex.CurrentUser: string;
var
  Buffer         : array[0..MAX_PATH] of Char;
  Size           : DWORD;
begin
  Size := SizeOf(Buffer);
  GetUserName(Buffer, Size);
  SetString(Result, Buffer, lstrlen(Buffer));
end;

end.
Und die Verwendung:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AdvoPlex := TAdvoPlex.Create;
  try
    try
      AdvoPlex.LoadUserSU;
      ShowMessage(AdvoPlex.UserSu);
      AdvoPlex.UserSU := 'Test01';
      AdvoPlex.SaveUserSU;
    except
      on E: Exception do
        ShowMessage(e.Message);
    end;
  finally
    AdvoPlex.Free;
  end;
end;

HeikoAdams 21. Sep 2009 16:31

Re: Kapseln von Registryzugriffen
 
Ich würde das ganz so realisieren:
Delphi-Quellcode:
unit AdvoPlex_Object;

interface

uses
  Windows,
  Classes,
  SysUtils,
  Registry;

const
  ADVOPATH        = 'Software\AdvoSolutions\AdvoPlex';

type
  TAdvoPlex = class(TObject)
  private
    FUserSU: string;
    function CurrentUser: string;
    function GetUserSU: string;
    procedure SetUserSU(Value: string);
    procedure SaveUserSU;
    procedure LoadUserSU;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property UserSU: string read GetUserSu write SetUserSU;
  end;

implementation

constructor TAdvoPlex.Create;
var
  reg: TRegistry;
begin
  inherited Create;
  reg := TRegistry.Create(KEY_ALL_ACCESS);
  reg.RootKey := HKEY_CURRENT_USER;
end;

destructor TAdvoPlex.Destroy;
begin
  FreeAndNil(reg);
  inherited Destroy;
end;

function TAdvoPlex.GetUserSU: string;
begin
  LoadUserSU;
  Result := FUserSU;
end;

procedure TAdvoPlex.LoadUserSU;
begin
  if reg.OpenKeyReadOnly(ADVOPATH) then
  begin
    FUserSU := reg.ReadString('User');
    reg.CloseKey;
  end
  else
    raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Lesen von UserSU', SysErrorMessage(GetLastError)]);
end;

procedure TAdvoPlex.SaveUserSU;
begin
  if reg.OpenKey(ADVOPATH, True) then
  begin
    reg.WriteString('User', FUserSU);
    reg.CloseKey;
  end
  else
    raise Exception.CreateFmt('%s'+#13#10+'%s', ['Fehler beim Schreiben von UserSU', SysErrorMessage(GetLastError)]);
end;

procedure TAdvoPlex.SetUserSU(Value: string);
begin
  FUserSU := Value;
  SaveUserSU;
end;

function TAdvoPlex.CurrentUser: string;
var
  Buffer         : array[0..MAX_PATH] of Char;
  Size           : DWORD;
begin
  Size := SizeOf(Buffer);
  GetUserName(Buffer, Size);
  SetString(Result, Buffer, lstrlen(Buffer));
end;

end.
Dadurch ersparst Du Dir zumindest das ständige Anlegen und Löschen der Registry-Instanzen.

Edit: Warum rufst Du LoadUserSU und SaveUserSU von Hand und nicht in SetUserSU und GetUserSU auf?

nahpets 21. Sep 2009 16:37

Re: Kapseln von Registryzugriffen
 
Zitat:

Zitat von HeikoAdams
Dadurch ersparst Du Dir zumindest das ständige Anlegen und Löschen der Registry-Instanzen.

und genau das dürfte die Intention des Threaderstellers gewesen sein.

Schwedenbitter 21. Sep 2009 17:22

Re: Kapseln von Registryzugriffen
 
Zuerst mal Danke für die vielen Code-Vorschläge. Ich kann mich garnicht entscheiden, was ich nehmen soll :mrgreen:

Zitat:

Zitat von nahpets
Hallo,
anliegend das ganze Projekt mit Exe zum Probieren.

@nahpets
Danke für die Mühen.
Also wenn die exe bei Dir funktioniert - wovon ich ausgehe - dann liegt es an meinem System (XP Prof. SP3). Wenn ich die bei mir aufrufe, bekomme ich denselben Fehler. Und das gleich auf 2 Rechnern :gruebel:

@HeikoAdams
Das mit der globalen TRegistry-Variable hatte ich ja zuerste probiert. Ich wollte das in eine ganz stinknormale Unit packen. Aber da kamen auch die Fehler und da dachte ich mir, mache ich es richtig(er). Leider bislang ohne Erfolg.

Zitat:

Zitat von Luckie
Keine Ahnung woran es gelegen hat. Aber das Konzept war sowieso nicht schön...

@Luckie
Was bedeutet "gelegen hat"? Kam der Fehler bei Dir auch?

Gruß, Alex

DeddyH 21. Sep 2009 17:25

Re: Kapseln von Registryzugriffen
 
Zitat:

Zitat von HeikoAdams
Delphi-Quellcode:
constructor TAdvoPlex.Create;
var
  reg: TRegistry; //lokale Variable
begin
  inherited Create;
  reg := TRegistry.Create(KEY_ALL_ACCESS); //Erzeugt und nie benutzt
  reg.RootKey := HKEY_CURRENT_USER;
end;

destructor TAdvoPlex.Destroy;
begin
  FreeAndNil(reg); //welches reg?
  inherited Destroy;
end;

Das dürfte so wohl nicht funktionieren.

nahpets 21. Sep 2009 18:35

Re: Kapseln von Registryzugriffen
 
Hallo,
Zitat:

Zitat von Schwedenbitter
Also wenn die exe bei Dir funktioniert - wovon ich ausgehe - dann liegt es an meinem System (XP Prof. SP3). Wenn ich die bei mir aufrufe, bekomme ich denselben Fehler. Und das gleich auf 2 Rechnern :gruebel:

dann können es eigentlich nur noch Rechteprobleme sein.

Schwedenbitter 21. Sep 2009 20:26

Re: Kapseln von Registryzugriffen
 
Zitat:

Zitat von nahpets
Hallo,
Zitat:

Zitat von Schwedenbitter
Also wenn die exe bei Dir funktioniert - wovon ich ausgehe - dann liegt es an meinem System (XP Prof. SP3). Wenn ich die bei mir aufrufe, bekomme ich denselben Fehler. Und das gleich auf 2 Rechnern :gruebel:

dann können es eigentlich nur noch Rechteprobleme sein.

Leider ausgeschlossen:
(1) Ich mache das, was man nicht tun sollte: Bin stets als Admin angemeldet.
(2) Ich habe jetzt mangels Geduld angefangen, die Set-/Get-Procedures so zu schreiben, dass in jeder einzelnen TRegistry angelegt, bearbeitet etc. wird und es klappt.
(3) Wenn es Rechteprobleme wären, sähe die Fehlermeldung anders aus.

Ich danke trotzdem für Eure sehr ausführliche Hilfe.

Gruß, Alex

Luckie 21. Sep 2009 21:19

Re: Kapseln von Registryzugriffen
 
Ich bekam immer eine Exception beim Lesen aus der Registry. Deswegen habe ich aus dem globalen Registry Objekt ein lokales gemacht, dann ging es auf einmal. Das hat auch noch den Vorteil, dass die Registry auch nur lesend geöffnet wird, wenn ich auch nur lesen will. Bei Heiko ist die Registry jetzt die ganze Zeit über mit vollen Rechten geöffnet. Bei HKCU kein Problem, aber bei anderen Schlüsseln eventuell.

Und ich rufe SaveUserSU und LoadUserSU nicht im Getter und Setter auf, damit der Benutzer der Klasse entscheiden kann, wann geschrieben und wann gelesen werden soll. Desweiteren gehört so was in einen Getter und Setter nicht rein. Diese Methoden sind dazu da Attribute der Klasse zusetzen und auszulesen. Wenn ich einen Setter aufrufe, rechne ich nicht damit, dass der irgendwas in meinem System rumschreibt.

Ich hatte also schon meine Gründe für meine Lösung. ;)

Schwedenbitter 21. Sep 2009 21:49

Re: Kapseln von Registryzugriffen
 
Zitat:

Zitat von Luckie
Ich hatte also schon meine Gründe für meine Lösung. ;)

Die stimmen natürlich.

Nur ist TAdvoPlex ausschließlich für mich. Es gibt 5 Programmmodule, die alle Ihre Daten aus der Registry von denselben Schlüsseln holen und dorthin schreiben. Bislang eine wahnsinns Durcheinander. Der Suffix bei z.B. UserSU kommt als Anlehung aus Linux (=SuperUser). Nur der Admin kann mit einem Setup-Programm in HKEY_LOCAL_MACHINE schreiben. Die anderen dürfen nur lesen. Sie sollen aber diese Werte geringfügig abändern und eben unter HKEY_CURRENT_USER abspeichern dürfen. Sie haben nur ein Mini-Setup, in dem aber die Werte beider Schlüssel verglichen werden. Dort gibt es auch für jeden Eintrag ein Button "Default", wobei Default die Werte von HKEY_LOCAL_MACHINE sind.

Wenn ich nun z.B. nur bei User auf Default klicke, macht es daher - vielleicht auch nur bei mir - Sinn, es gleich in die Registry zu schreiben. Es macht mir sonst einfach zuviel Aufwand mit entsprechenden Variablen in den jeweiligen Programmmodulen auf Änderungen zu prüfen etc. pp. Ich hoffe, das versteht jemand einigermaßen :pale:
Was ich damit nur sagen wollte: Somit hatte ich für meine Lösung auch Gründe :mrgreen: Es kommt hinzu, dass ich ja - meistens - weiß, was ich tue (in die Registry schreiben).

Gruß, Alex

Luckie 21. Sep 2009 21:54

Re: Kapseln von Registryzugriffen
 
Ich finde es einfach nur nicht sauber, wenn Routinen nicht das machen, wofür sie gedacht sind. Und ein Setter macht für mich nun mal nichts anderes als das zugehörige Attribut setzen.

Aber OK, ist deine Entscheidung. Allerdings sollte Faulheit nie dazu führen deswegen schlechten Code zu schreiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 Uhr.
Seite 2 von 3     12 3      

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