![]() |
Wie kann ich das Registry mit API lesen und schreiben?
Hi leute,
sehr gut hab ihr hier. zuers aber danke an Luckie fuer den link in deiner page. ich habe eine "dumme" frage. wie kann ich einen string aus der registry lesen und in einem Edit-Text anzeigen und aus einer ComboBox denn string rein schreiben? ich weiss dass wenn ich luckies tutis noch mal durch arbeite und sehr viel denke das ich es dann auch hinkriege, aber ich hoffe das es hier schneller geht. mir der VCL ist das lesen und schreiben kein thema, aber ich weiss leider nich wie ich den string aus der registry dem Edit-Tex zuweisen und den string aus der ComboBox in die registry schreiben kann. wenn ihr mir weiter helfen koennt waehre net. danke |
Hallo toppDog ---> :cat:
fachlich kann ich Dir leider nicht weiterhelfen - aber ich kann Dir versichern, dass Deine Frage keineswegs "dumm" ist. Schliesslich ist ein Forum zum Fragen da! Grüße aus Hamburg, Daniel Delphi-PRAXiS Administrator |
Zitat:
|
@DanielB:
Schön, dass wir uns einig sind. Aber toppDog weiss immer noch nicht weiter :mrgreen: Grüße, Daniel |
Bevor ich mir jetzt das Leben schwer mache, wollte ich erst einmal fragen was das Problem genau ist.
:cat: |
Zieh dir mal das rein
![]() |
Hier ist mal meine Prozedur um Daten aus der Reg zu Lesen. Ich lade sie aber in eine Stringlist und weise sie dann der einen Combo zu. Du musst es halt noch anpassen. Vielleicht bringts dir ja was.
Code:
procedure TEinstellungen.FormShow(Sender: TObject);
//ComPorts ermitteln und in ComboBox Anzeigen var reg: TRegistry; st: TStrings; i: integer; ini: TIniFile; s: string; begin ShowMessage('Bei änderungen, kann gleich mit den neuen Werten weiter gearbeitet' + #13 + 'werden. Das Programm muss nicht neu gestartet werden!'); reg := TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('hardware\devicemap\serialcomm', False); st := TStringList.Create; reg.GetValueNames(st); ComboBoxPort.Items.Clear; for i := 0 to st.Count -1 do begin ComboBoxPort.Items.Add(reg.ReadString(st.Strings[i])); end; st.Free; reg.CloseKey; reg.free; if MainFormMC2004.ComPort.Port = 'COM1' then begin ComboBoxPort.ItemIndex := 0; end else if MainFormMC2004.ComPort.Port = 'COM2' then begin ComboBoxPort.ItemIndex := 1; end else if MainFormMC2004.ComPort.Port = 'COM3' then begin ComboBoxPort.ItemIndex := 2; end else if MainFormMC2004.ComPort.Port = 'COM4' then begin ComboBoxPort.ItemIndex := 3; end else if MainFormMC2004.ComPort.Port = 'COM5' then begin ComboBoxPort.ItemIndex := 4; end else if MainFormMC2004.ComPort.Port = 'COM6' then begin ComboBoxPort.ItemIndex := 5; end else if MainFormMC2004.ComPort.Port = 'COM7' then begin ComboBoxPort.ItemIndex := 6; end else if MainFormMC2004.ComPort.Port = 'COM8' then begin ComboBoxPort.ItemIndex := 7; end; ini:=TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); try s := ini.ReadString('Einstellungen', 'Baud', ''); finally ini.Free; end; if s = '2400' then begin ComboBoxBaud.ItemIndex := 0; end else if s = '4800' then begin ComboBoxBaud.ItemIndex := 1; end else if s = '9600' then begin ComboBoxBaud.ItemIndex := 2; end else if s = '14400' then begin ComboBoxBaud.ItemIndex := 3; end else if s = '19200' then begin ComboBoxBaud.ItemIndex := 4; end else if s = '28800' then begin ComboBoxBaud.ItemIndex := 5; end else if s = '38400' then begin ComboBoxBaud.ItemIndex := 6; end; end; |
Moin ToppDog,
hier hab' ich mal ein kleines Beispiel wie's gehen könnte. Bislang nur mit gültigen Werten getestet, aber eigentlich sollten auch fehlerhafte Werte nur für entsprechende Rückgabewerte der Funktionen sorgen.
Code:
Kommst Du damit klar?
function WriteStringToRegAPI(const p_sSubKey : string;const p_sValueName : string;const p_sValue : string) : integer;
var hResult : HKEY; begin // Es ginge auch RegOpenKeyEx, so wird ein nicht existenter Key aber angelegt. // Existiert der SubKey, wird er geöffnet Result := RegCreateKeyEx(HKEY_CURRENT_USER,PChar(p_sSubKey),0,nil,0,KEY_ALL_ACCESS,nil,hResult,nil); if Result <> ERROR_SUCCESS then begin exit; end; try Result := RegSetValueEx(hResult,PChar(p_sValueName),0,REG_SZ,@p_sValue[1],Length(p_sValue)+1); finally RegCloseKey(hResult); end; end; function ReadStringFromRegAPI(const p_sSubKey : string; const p_sValueName : string;var p_sResult : string) : integer; var hResult : HKEY; dwMaxValueLen : DWORD; szResult : PChar; begin Result := RegOpenKeyEx(HKEY_CURRENT_USER,PChar(p_sSubKey),0,KEY_ALL_ACCESS,hResult); if Result <> ERROR_SUCCESS then begin exit; end; try Result := RegQueryInfoKey(hResult,nil,nil,nil,nil,nil,nil,nil,nil,@dwMaxValueLen,nil,nil); if Result <> ERROR_SUCCESS then begin exit; end; inc(dwMaxValueLen); szResult := StrAlloc(dwMaxValueLen); try Result := RegQueryValueEx(hResult,PChar(p_sValueName),nil,nil,PByte(szResult),@dwMaxValueLen); if Result <> ERROR_SUCCESS then begin exit; end; p_sResult := trim(szResult); finally StrDispose(szResult); end; finally RegCloseKey(hResult); end; end; procedure TForm1.Button1Click(Sender: TObject); var iResult : integer; sResult : string; begin iResult := WriteStringToRegAPI('Software\CSE\TEST','TESTWERTNAME','TESTWERT'); if iResult <> ERROR_SUCCESS then begin ShowMessage(SysErrorMessage(iResult)); end; iResult := ReadStringFromRegAPI('Software\CSE\TEST','TESTWERTNAME',sResult); if iResult <> ERROR_SUCCESS then begin ShowMessage(SysErrorMessage(iResult)); end else begin ShowMessage(sResult); end; end; @Mathias Simmack Tut ist noch in Arbeit ;-) |
@daniel B:
Er will es aber NonVcl!!!!! |
Zitat:
|
Zitat:
|
:twisted: :twisted: eieieieiei
|
Moin Daniel B,
da zur Initialisierung des Buffers nur die maximale Länge eines Wertes interessant ist, frage ich auch nur den ab. Deshalb die ganzen nil Werte. Das was man dort sonst noch in Erfahrung bringen kann spielt im gezeigten Zusammenhang einfach keine Rolle.
Code:
RegQueryInfoKey(
hResult, // Handle des abzufragenden Keys nil, // Klasse des Keys nil, // Bufferlänge für Klasse nil, // Reserviert, muss nil sein nil, // Anzahl der SubKeys des Keys nil, // Maximale Länge eines Unterschlüssels nil, // Maximale Länge eines Klassennamens von SubKeys nil, // Anzahl der Werte des Keys nil, // Maximale Länge eines Wertnamens @dwMaxValueLen, // Maximale Länge eines Wertes nil, // Länge des Security Descriptors des Keys nil // Datum letzte Änderung ); |
Zitat:
![]() |
Thanx
danke fuer die hilfe.
zuerst mal an sakura, jep das is was ich will. ich will einen wert aus der Registry in ein Edit feld zeigen und dan einen wert aus der ComboBox in den Registry schreiben. an Danile B. mit VCL kann ich es ja auch aber dan wird meine .exe file leider 470 kb gorss und ohne VCL 14 kb. nice, he. an Christian, danke fuer die function. ich werde sie ducharbeiten und weiter bearbeiten. vielen dank. danke an alle fuer die antworten. |
TRegistry kapselt ja nur die API-Registry-Funktionen, hat also in dem Sinne nichts mit der VCL zu tun, wie die Unit Forms. Und ich würde es auch nicht übetreiben, deswegen binde doch mal die Unit Registry ein und kuck wie groß dann deine Exe wird.
Habe es gerade mal gemacht:+ 42 KB. Also wenn du das noch vetreten kannst, dann würde ich nicht so einen Umstand machen und mich mit den API's rumschlagen. Man sollte realistisch bleiben. Oder anders gesagt: Man kann es mit dem nonVCL-Wahn auch übertreiben. Auf der anderen Seite sag ich mir aber auch: Wenn schon dann richtig :mrgreen:. Jetzt wieder spreche ich mich da zwar etwas, aber ich denke, ihr wißt, wie ich das meine. |
Re: Thanx
Zitat:
Zitat:
Aber in dem Fall ist der direkte API-Zugriff natürlich vorzuziehen. Würde ich nicht anders machen. :-) Aber trotzdem ist es ja kein Widerspruch - es kommt eben immer auf die Situation an. |
Moin Zusammen,
ich habe mir jetzt nicht die gesamte TRegistry durchgesehen, aber spätestens wenn man Multistrings braucht (speziell beim Schreiben) hat man mit TRegistry verloren. Multistrings werden nicht davon unterstützt. |
Was sind Multistrings?
|
Moin Luckie,
das sind Stringlisten. Jeder String ist nullterminiert, die gesamte Liste dann mit einer doppelten Null, so wie z.B. die Datei/Verzeichnislisten bei SHFileOperation. (Bei Unicodestrings entsprechend die doppelte Anzahl von Nullen) In RegEdit wird dieser Typ als REG_MULTI_SZ angezeigt. Lesen kann man diesen meist mit TRegistry.ReadBinary, nur schreiben nicht. |
ok.
ihr habt warscheinlich rech mir dem "wahn". 40 kb sind auch nicht zu viel. danke machts gut |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 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