Autor Beitrag
avenger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: Mi 01.04.09 04:35 
Hallo,
Wenn die Registry Keys noch nicht angelegt sind soll die Exception ausgelöst werden und mit default werten beschrieben werden. Was mache ich hier falsch ??


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
var regist: TRegistry;
begin
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    try
      regist.OpenKey('Software\ProcessData\1.0', true);
      ST10.IPAddress := regist.ReadString('IP_10');;
      ST20.IPAddress := regist.ReadString('IP_20');
      ST30.IPAddress := regist.ReadString('IP_30');

      ////////////////////////////
      edit1.Text:= ST10.IPAddress;

    except
      ST10.IPAddress := '192.168.0.10';
      ST20.IPAddress := '192.168.0.20';
      ST30.IPAddress := '192.168.0.30';


      edit1.Text:= ST10.IPAddress;

    end;
  finally
    regist.free;
  end;
end;


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.04.09 05:03 
Warum sollte eine Exception ausgelöst werden? Du gibst die Anweisung einen Registryschlüssel (Software\ProcessData\1.0) zu öffnen und anzulegen, wenn dieser noch nicht existiert.
Danach liest du einen Wert in diesem Schlüssel aus, wobei ReadString laut Hilfe einen leeren String zurückgibt, wenn der Wert noch nicht existiert.

Eine Exception würde laut Hilfe nur augelöst, wenn der Wert existiert, aber kein String ist.

Also wo erwartest du eine Exception? :gruebel:

Wenn du wissen willst, ob der Schlüssel existiert, warum ignorierst du dann den Rückgabewert von OpenKey und warum sagst du bei OpenKey, dass der Schlüssel angelegt werden soll, wenn er noch nicht existiert?

Außerdem reicht ein Blick in die Hilfe (oder in die Liste der Möglichkeiten bei der Syntaxergänzung) um festzustellen, dass es die Funktionen KeyExists und ValueExists gibt. Was die machen, sollte der Name ja sagen...
avenger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: Mi 01.04.09 15:27 
Entschuldige das ich gefragt habe. Wenn meine verdammte Hilfe funktionieren würde, würde ich mich gerne öfters an der F1 Taste vergreifen, aber das ist ja ein anderer ungelöster Tread.

Den Code hatte ich von der folgenden Hilfe seite

www.delphi-treff.de/...vcl/registry/page/5/

Ich wusste nicht das Strings un Integer Werte hier so anders behandelt werden.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 01.04.09 15:59 
user profile iconavenger hat folgendes geschrieben Zum zitierten Posting springen:
Ich wusste nicht das Strings un Integer Werte hier so anders behandelt werden.

Was heißt "hier"? Wo kommst du denn eher? Das sind zwei gänzlich unterschiedliche Typen und delphi ist eben eine typisierte Sprache.
avenger Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 90



BeitragVerfasst: Mi 01.04.09 16:07 
Ich weiss das das unterschiedliche Datentypen sind. Dachte aber das wenn ein Wert nicht vorhanden ist eine exception ausgelöst wird. Beim String wie auch bei einem Integer. Wie ich jetzt herausgefunden haben ist der String auch der einzige Datentyp der die Exception NICHT ausgelöst wird.

"Hier" bedeutet in diesem zusammenhang mit dem Rückgabewert der Funktion.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 01.04.09 16:24 
user profile iconavenger hat folgendes geschrieben Zum zitierten Posting springen:
Wie ich jetzt herausgefunden haben ist der String auch der einzige Datentyp der die Exception NICHT ausgelöst wird.
DOH:
[ReadInteger:]Mit ReadInteger wird ein Integer aus einem bestimmten Datenwert gelesen, der dem aktuellen Schlüssel zugeordnet ist. Der Parameter Name bezeichnet den Namen des Datenwertes.

Wenn der Registrierungseintrag keinen Integer-Wert enthält, wird eine Exception ausgelöst.

[ReadString:]Wenn kein Registrierungseintrag mit dem angegebenen Namen vorhanden ist, gibt ReadString einen leeren String zurück. Enthält der Registrierungseintrag keinen String, wird eine Exception ausgelöst.

[ReadBool:]Mit ReadBool wird ein boolescher Wert aus einem bestimmten Datenwert gelesen, der dem aktuellen Schlüssel zugeordnet ist. Der Parameter Name bezeichnet den Namen des Datenwertes.

Nach erfolgreicher Ausführung liefert ReadBool den angeforderten booleschen Wert. Wenn der Registrierungseintrag keinen booleschen oder Integer-Wert enthält, wird eine Exception ausgelöst.

[ReadDate:]Wenn der Registrierungseintrag keinen Datums- oder Zeitwert enthält, wird eine Exception ausgelöst.
Keine von den oben genannten Funktionen löst eine Exception aus, wenn der Schlüssel nicht existiert :nixweiss:
Wenn du wissen willst, ob ein Key existiert, nutze die Methode KeyExists.

Edit: Korrektur: "Fehler beim holen der Daten"-Exception wird ausgelöst :oops: Nun gut, das ändert aber nichts daran, dass man KeyExists nutzen soll, um eine Exception zu verhindern, da der Ablauf des Programmes nur unnötig verlangsamt wird ;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.04.09 17:15 
user profile iconavenger hat folgendes geschrieben Zum zitierten Posting springen:
Entschuldige das ich gefragt habe. Wenn meine verdammte Hilfe funktionieren würde, würde ich mich gerne öfters an der F1 Taste vergreifen, aber das ist ja ein anderer ungelöster Tread.

Nimm doch die Online-Hilfe:
docs.codegear.com/pr...istry_TRegistry.html
Was ich meinte war vor allem, dass der Code nicht wirklich durchdacht war, denn beim Lesen den Schlüssel anzulegen, wenn er nicht existiert und den Rückgabewert von OpenKey einfach wegschmeißen...

Aber:
user profile iconavenger hat folgendes geschrieben Zum zitierten Posting springen:
Den Code hatte ich von der folgenden Hilfe seite

www.delphi-treff.de/...vcl/registry/page/5/

Ich wusste nicht das Strings un Integer Werte hier so anders behandelt werden.
Das hat nix mit String oder Integer zu tun. Der Quelltext ist Schwachsinn. Da das da steht, Entschuldigung, denn der ist nicht auf deinem Mist gewachsen...

Ich korrigiere einmal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var
  regist: TRegistry;
begin
  ST10.IPAddress := '192.168.0.10';
  ST20.IPAddress := '192.168.0.20';
  ST30.IPAddress := '192.168.0.30';
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    if regist.OpenKey('Software\ProcessData\1.0', false) then
    begin
      if regist.ValueExists('IP_10'then
        ST10.IPAddress := regist.ReadString('IP_10');;
      if regist.ValueExists('IP_20'then
        ST20.IPAddress := regist.ReadString('IP_20');
      if regist.ValueExists('IP_30'then
        ST30.IPAddress := regist.ReadString('IP_30');
    end;
  finally
    regist.Free;
  end;
  edit1.Text:= ST10.IPAddress;
end;
Bei dem if OpenKey könnte natürlich auch ein else folgen, da aber auch die einzelnen Werte nicht existieren könnten bringt das vermutlich nicht so viel.

Ich selbst packe sowas meistens in eine Funktion, die dann zurückgibt, ob die Werte erfolgreich gelesen wurden.

// EDIT:
Ich habe vorhin übrigens auch dieses Problem in dem entsprechenden Thread für Verbesserungsvorschläge im DT gepostet. ;-)