Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Registry lesen (https://www.delphipraxis.net/205387-registry-lesen.html)

oldmann 3. Sep 2020 16:36

Registry lesen
 
Hallo,

ich benutze Delphi Tokyo 10.2.2 mit Windows10.
Ich habe ein Problem beim Lesen der Registry.
Ich schreibe Werte aus dem Programm in die Registry.
Am Anfang jedoch, wenn das Programm neu installiert wird, sind diese Werte noch nicht vorhanden.
Beim lesen von Strings gibt es kein Problem.
Wenn ich jedoch Integer auslesen will, die noch nicht vorhanden sind, gibt es eine Fehlermeldung.
Wie kann ich die Werte abfragen ohne das eine Fehlermeldung ausgegeben wird ?
Für Eure Hilfe wäre ich dankbar.

Gruß Oldmann

Dalai 3. Sep 2020 17:22

AW: Registry lesen
 
Was für eine Fehlermeldung erscheint da? Wie sieht der zugehörige Code aus?

Grüße
Dalai

HolgerX 3. Sep 2020 17:47

AW: Registry lesen
 
Hmm..

wenn Du nur zum Lesen die Reg öffnest, dann sollte Dir OpenKey(<Pfad>, False) ein 'False' zurückgeben, wenn dein Registry-Pfad nicht vorhanden ist...

Somit gehe ich von aus (mangels SourceCode), dass Du den Rückgabewert ignorierst und trotzdem versuchst mit Readxxx Werte zu Lesen.. ;)

oldmann 4. Sep 2020 09:15

AW: Registry lesen
 
Hallo,

Hier der Code:

procedure Registry_lesen;
begin
with TRegistry.Create do
begin
try
Rootkey:=HKEY_CURRENT_USER;
if OpenKey('Software\Windaxlg',True) then
begin
test.str_1:=ReadString('Win1');
test.str_2:=ReadString('Win2');
aufrufe:=ReadInteger('Win3');
test.Tage:=ReadInteger('Win4');
test.str_4:=ReadString('Win4');
end;
finally
Free;
end;
end;
end;

Am Anfang ist der Code ja bei dem Anwender nicht vorhanden.
Er wird erst im laufe der Programmausführung gespeichert.
Daher bekomme ich bei den Integern eine Fehlermeldung.
Die Fehlermeldung lautet: „Fehler beim Holen der Daten von Win3“

Oldmann

oldmann 4. Sep 2020 09:16

AW: Registry lesen
 
Hallo,

Hier der Code:

[GOOGLE]
Delphi-Quellcode:
procedure Registry_lesen;
begin
with TRegistry.Create do
begin
try
Rootkey:=HKEY_CURRENT_USER;
if OpenKey('Software\Windaxlg',True) then
begin
test.str_1:=ReadString('Win1');
test.str_2:=ReadString('Win2');
aufrufe:=ReadInteger('Win3');
test.Tage:=ReadInteger('Win4');
test.str_4:=ReadString('Win4');
end;
finally
Free;
end;
end;
end;
[/GOOGLE]Am Anfang ist der Code ja bei dem Anwender nicht vorhanden.
Er wird erst im laufe der Programmausführung gespeichert.
Daher bekomme ich bei den Integern eine Fehlermeldung.
Die Fehlermeldung lautet: „Fehler beim Holen der Daten von Win3“

Oldmann

Dalai 4. Sep 2020 10:41

AW: Registry lesen
 
Fälschlicherweise war ich der Annahme, dass Delphi-Referenz durchsuchenTRegistry.ReadInteger keine Exception wirft. Die Doku sagt aber klar:
Zitat:

If the Registry entry does not contain an integer, an exception is raised.
Daher wird es wohl sinnvoll sein, vor jedem Read... mit TRegistry.ValueExists zu prüfen, ob der Wert vorhanden ist, und bei Nichtvorhandensein einen Standardwert zu setzen.

Unabhängig davon solltest du auf das
Delphi-Quellcode:
with
verzichten.

Grüße
Dalai

haentschman 4. Sep 2020 11:27

AW: Registry lesen
 
Zitat:

Unabhängig davon solltest du auf das with verzichten.
...er hat Jehova gesagt. :stupid:

oldmann 4. Sep 2020 11:58

AW: Registry lesen
 
Hallo,

wie wird das genau umgesetzt dein "TRegistry.ValueExists zu prüfen".
Ein bischen code wäre nett.
Wenn ich das "With" weglasse, funktioniert es nicht.

Oldmann

Delphi.Narium 4. Sep 2020 12:44

AW: Registry lesen
 
Delphi-Quellcode:
procedure Registry_lesen;
var
  reg : TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.Rootkey := HKEY_CURRENT_USER;
    if reg.OpenKey('Software\Windaxlg',True) then begin
      if reg.ValueExists('Win1') then test.str_1 := reg.ReadString('Win1') else test.str_1 := '';
      if reg.ValueExists('Win2') then test.str_2 := reg.ReadString('Win2') else test.str_2 := '';
      if reg.ValueExists('Win3') then aufrufe   := reg.ReadInteger('Win3') else aufrufe   := 0;
      if reg.ValueExists('Win4') then test.Tage := reg.ReadInteger('Win4') else test.Tage := 0;
      if reg.ValueExists('Win4') then test.str_4 := reg.ReadString('Win4') else test.str_4 := '';
    end;
  finally
    reg.Free;
  end;
end;
ungetestet hingedaddelt.

himitsu 4. Sep 2020 13:32

AW: Registry lesen
 
Delphi-Quellcode:
StrToIntDef(reg.ReadString('Win3'), 0)




Exists hilft hier nicht unbedingt, da es zwei Fehlerstellen gibt.
Einmal den Value gibt es nicht und bei ReadInteger auch noch wenn es kein Integer (DWORD) ist.

Man könnte hier vielleicht mit "einfach" mit TRegIniFile rumspielen.
In den IniFile-Klassen wird bei fehlende oder falschen Werten der Default genommen.

Sherlock 4. Sep 2020 13:36

AW: Registry lesen
 
Zitat:

Zitat von oldmann (Beitrag 1473013)
Hallo,

Wenn ich das "With" weglasse, funktioniert es nicht.

Oldmann

Dann solltest Du es erst Recht weg lassen und versuchen zu vertehen, was du da überhaupt abgeschrieben hast.

Sherlock

oldmann 4. Sep 2020 15:23

AW: Registry lesen
 
Hallo,

ich habe das dargestellte Beispiellisting probiert und es gab keine Fehlermeldung.
Vielen Dank an alle Beteiligten.
Damit ist das Thema erledigt.

Gruß Olmann

HolgerX 4. Sep 2020 16:45

AW: Registry lesen
 
Hmm..


Zitat:

Zitat von Delphi.Narium (Beitrag 1473016)
Delphi-Quellcode:
procedure Registry_lesen;
var
  reg : TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.Rootkey := HKEY_CURRENT_USER;
    if reg.OpenKey('Software\Windaxlg',True) then begin
      if reg.ValueExists('Win1') then test.str_1 := reg.ReadString('Win1') else test.str_1 := '';
      if reg.ValueExists('Win2') then test.str_2 := reg.ReadString('Win2') else test.str_2 := '';
      if reg.ValueExists('Win3') then aufrufe   := reg.ReadInteger('Win3') else aufrufe   := 0;
      if reg.ValueExists('Win4') then test.Tage := reg.ReadInteger('Win4') else test.Tage := 0;
      if reg.ValueExists('Win4') then test.str_4 := reg.ReadString('Win4') else test.str_4 := '';
    end;
  finally
    reg.Free;
  end;
end;
ungetestet hingedaddelt.

Wieso nicht

Delphi-Quellcode:
if reg.OpenKey('Software\Windaxlg',False) then begin


Bei Verwendung von false wird dann von OpenKey auch ein false zurück geliefert wenn dein Verzeichnis noch nicht da ist, statt ein neues (leeres) 'Windaxlg' anzulegen...

Das 'True' sollte nur zum 'schreiben' verwendet werden ... ;)

Beim 'Lesen' wird so nicht versucht Werte aus einem leeren Verzeichnis zu lesen..

Delphi.Narium 4. Sep 2020 17:06

AW: Registry lesen
 
Beim Programmende wird der Zweig sowieso angelegt, da kommt es auf ein paar Minuten früher nicht an.

Und für die anderen Werte muss ja auch was geliefert werden. Man könnte das Ganze natürlich auch so machen:
Delphi-Quellcode:
procedure Registry_lesen;
var
  reg : TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.Rootkey := HKEY_CURRENT_USER;
    if reg.OpenKey('Software\Windaxlg',False) then begin
      if reg.ValueExists('Win1') then test.str_1 := reg.ReadString('Win1') else test.str_1 := '';
      if reg.ValueExists('Win2') then test.str_2 := reg.ReadString('Win2') else test.str_2 := '';
      if reg.ValueExists('Win3') then aufrufe := reg.ReadInteger('Win3') else aufrufe := 0;
      if reg.ValueExists('Win4') then test.Tage := reg.ReadInteger('Win4') else test.Tage := 0;
      if reg.ValueExists('Win4') then test.str_4 := reg.ReadString('Win4') else test.str_4 := '';
    end else begin
      test.str_1 := '';
      test.str_2 := '';
      aufrufe := 0;
      test.Tage := 0;
      test.str_4 := '';
    end;
  finally
    reg.Free;
  end;
end;
Verschiebt das Erstellen der Verzeichnisses eben auf's Programmende und man hat beim Programmstart ein paar mehr Zeilen Code, um auf die Nichtexistenz des Verzeichnisses und die damit verbundene Vergabe der Defaultwerte zu reagieren.

Oder so ginge auch:
Delphi-Quellcode:
procedure Registry_lesen;
var
  reg : TRegistry;
begin
  test.str_1 := '';
  test.str_2 := '';
  aufrufe := 0;
  test.Tage := 0;
  test.str_4 := '';
  reg := TRegistry.Create;
  try
    reg.Rootkey := HKEY_CURRENT_USER;
    if reg.OpenKey('Software\Windaxlg',False) then begin
      if reg.ValueExists('Win1') then test.str_1 := reg.ReadString('Win1');
      if reg.ValueExists('Win2') then test.str_2 := reg.ReadString('Win2');
      if reg.ValueExists('Win3') then aufrufe := reg.ReadInteger('Win3');
      if reg.ValueExists('Win4') then test.Tage := reg.ReadInteger('Win4');
      if reg.ValueExists('Win4') then test.str_4 := reg.ReadString('Win4');
    end;
  finally
    reg.Free;
  end;
end;
Hat wer weiter Varianten zu bieten ;-)

Letztlich jedet ja nur dadrum, beim ersten Programm die Fehler beim Nochnichtvorhandensein der Werte abzufangen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 Uhr.

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-2025 by Thomas Breitkreuz