Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - TRegistry exception wird nicht ausgelöst ?
avenger - Mi 01.04.09 04:35
Titel: TRegistry exception wird nicht ausgelöst ?
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 ??
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
Gausi: Delphi-Tags hinzugefügt
jaenicke - 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 - 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
http://www.delphi-treff.de/tutorials/vcl/registry/page/5/
Ich wusste nicht das Strings un Integer Werte hier so anders behandelt werden.
Delete - Mi 01.04.09 15:59
avenger hat folgendes geschrieben : |
| 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 - 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 - Mi 01.04.09 16:24
avenger hat folgendes geschrieben : |
| 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 - Mi 01.04.09 17:15
avenger hat folgendes geschrieben : |
| 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:
http://docs.codegear.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/DE/html/delphivclwin32/Registry_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:
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:
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. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!