![]() |
Registry Werte beim starten auslesen klappt nicht
Hallo Leute,
ich habe eine kleine Frage. Ich benutze folgenden Code um Daten aus der Registry auszulesen, ich benutze dafür die OnClick Routine eines MainMenu eintrages:
Delphi-Quellcode:
weil ich aber eigentlich einen klick sparen wollte da die Daten sowieso bei jedem Programmstart gelesen werden sollen, habe ich den identischen Code in das OnCreate Ereigniss von Form1 gesetzt, sobald ich dann das Programm starte werden keine Werte mehr gelesen und alle Werte in der Registry werden auf 0 gesetzt, wie kann das sein?
procedure TForm1.Datenholen1Click(Sender: TObject);
var reg : TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Fischmob\Flotteninformationen\0.1 beta', false); Edit1.Text := reg.ReadString('Typ 1'); Edit2.Text := reg.ReadString('Typ 2'); Edit3.Text := reg.ReadString('Typ 3'); Edit4.Text := reg.ReadString('Typ 4'); Edit5.Text := reg.ReadString('Typ 5'); Edit6.Text := reg.ReadString('Typ 6'); Edit7.Text := reg.ReadString('Typ 7'); Edit8.Text := reg.ReadString('Typ 8'); Edit9.Text := reg.ReadString('Typ 9'); reg.free; end; |
Re: Registry Werte beim starten auslesen klappt nicht
daran ist nichts falsch, bist du sicher das der pfad richtig ist?
|
Re: Registry Werte beim starten auslesen klappt nicht
also ich habs nochmal getestet:
Delphi-Quellcode:
funktioniert einwandfrei
procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry; begin reg := TRegistry.Create; with reg do begin RootKey := HKEY_CURRENT_USER; if OpenKey('Software\Fischmob\Flotteninformationen\0.1 beta', false) then begin Try Edit1.Text := ReadString('Typ 1'); Edit2.Text := ReadString('Typ 2'); Edit3.Text := ReadString('Typ 3'); Edit4.Text := ReadString('Typ 4'); Edit5.Text := ReadString('Typ 5'); Edit6.Text := ReadString('Typ 6'); Edit7.Text := ReadString('Typ 7'); Edit8.Text := ReadString('Typ 8'); Edit9.Text := ReadString('Typ 9'); finally CloseKey; Free; end; end; end; end; |
Re: Registry Werte beim starten auslesen klappt nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaube nicht das Tippfehler drinne sind, ich schaue da seit 5:30 drauf, aber ich häng das Projekt nochmal an, so wie es nicht funktioniert.
Nochmal zur verdeutlichung was passiert: Erster Start: - Registry Werte existieren noch nicht und werden mit dem Wert 0 erzeugt. - Ich gebe Werte in die Edits ein und beende das Progg, die Werte werden geschrieben. Zweiter Start: - Überprüfung ob der Key schon existiert über
Delphi-Quellcode:
- Die in der Registrierung stehenden werte werden nicht eingetragen, sondern nur Nullen (Die Werte stehen aber noch in der Registrierung).
reg.OpenKey('Software\Fischmob\Flotteninformationen\0.1 beta', true);
- Beenden des Programmes, Werte in der Registrierung werden mit Nullen überschrieben......und ich habe keine Ahnung wieso. |
Re: Registry Werte beim starten auslesen klappt nicht
die unit1.pas/unit1.dcu brauch ich schon :mrgreen:
|
Re: Registry Werte beim starten auslesen klappt nicht
Liste der Anhänge anzeigen (Anzahl: 1)
ups...war das falsche Projektverzeichniss :-(
|
Re: Registry Werte beim starten auslesen klappt nicht
hi Helpliner, das dürfte wohl am OnCreate liegen, die edits sind nach dem create von form1 wohl noch nicht da, machs mal im OnShow/OnActivate
|
Re: Registry Werte beim starten auslesen klappt nicht
Hast Du mal versucht, die Einträge nicht schon beim OnCreate sondern erst beim OnActivate zu lesen?
Ich hatte da mal so ein Problem. Gruß Manfred |
Re: Registry Werte beim starten auslesen klappt nicht
Besten Dank Leute, jetzt geht es......ist das denn Zufall das die Edits....tja..."langsamer" da sind als das Form.Create oder ist das eine Erstellungsreihenfolge (Erst Form, dann Items auf der Form) ?
|
Re: Registry Werte beim starten auslesen klappt nicht
Trotzdem solltest du noch mal über das try und finally nachdenken, wenn das in deinem Programm so aussieht wie in deinem Codeauszug oben. Ich gebe zu, ich habe mir deinen Anhang nicht angesehen. Vielleicht ist da ja inzwischen alles richtig.
|
Re: Registry Werte beim starten auslesen klappt nicht
Ich habs zwar nicht mit try finally sondern etwas verkürzt mit try except gemacht, aber es ist mittlerweile eingebaut.
Das war auch zwingend nötig, weil selbst wenn der Key erstellt wird, existieren ja noch lange keine Werte. |
Re: Registry Werte beim starten auslesen klappt nicht
Das habe ich aber nicht gemeint.
Ich spreche davon: Zitat:
|
Re: Registry Werte beim starten auslesen klappt nicht
hoi,
hoffe du verwechselst mich nicht mit dem topic creator. btw ist was falsch an dem code? |
Re: Registry Werte beim starten auslesen klappt nicht
Hmmmm, eventuell habe ich da jetzt ein Verständniss Problem, try --> finally benutzt du dabei doch um Fehler abzufangen falls einer der Werte in dem Registry-Key nicht existiert oder ?
Ich habe das folgendermassen gemacht:
Delphi-Quellcode:
d.h. tritt der Fall auf das die Werte nicht existieren (erster Programmstart), dann fülle ich die Edits mit 0, beim beenden des Programmes werden die Werte dann ja auf jedenfall geschrieben.
procedure TForm1.FormActivate(Sender: TObject);
var reg : TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; try reg.OpenKey('Software\Fischmob\Flotteninformationen\0.1 beta', true); Edit1.Text := reg.ReadString('Typ 1'); Edit2.Text := reg.ReadString('Typ 2'); Edit3.Text := reg.ReadString('Typ 3'); Edit4.Text := reg.ReadString('Typ 4'); Edit5.Text := reg.ReadString('Typ 5'); Edit6.Text := reg.ReadString('Typ 6'); Edit7.Text := reg.ReadString('Typ 7'); Edit8.Text := reg.ReadString('Typ 8'); Edit9.Text := reg.ReadString('Typ 9'); except Edit1.Text := ('0'); Edit2.Text := ('0'); Edit3.Text := ('0'); Edit4.Text := ('0'); Edit5.Text := ('0'); Edit6.Text := ('0'); Edit7.Text := ('0'); Edit8.Text := ('0'); Edit9.Text := ('0'); end; reg.free; end; Oder verstehe ich jetzt etwas grundsätzlich falsch? |
Re: Registry Werte beim starten auslesen klappt nicht
@Pseudemys Nelsoni: Upps, ja stimmt. Ich habe dich verwechselt. Mein Fehler. Aber ich hätte den Code so gestaltet:
Delphi-Quellcode:
Man könnte das Auslesen der Werte und Zuweisen an die Edits auch so machen:
reg := TRegistry.Create;
if reg <> nil then with reg do try // eigentlich unnötig, weil Standard --> // RootKey := HKEY_CURRENT_USER; if OpenKey('Software\Fischmob\Flotteninformationen\0.1 beta', false) then try Edit1.Text := ReadString('Typ 1'); Edit2.Text := ReadString('Typ 2'); Edit3.Text := ReadString('Typ 3'); Edit4.Text := ReadString('Typ 4'); Edit5.Text := ReadString('Typ 5'); Edit6.Text := ReadString('Typ 6'); Edit7.Text := ReadString('Typ 7'); Edit8.Text := ReadString('Typ 8'); Edit9.Text := ReadString('Typ 9'); finally CloseKey; end; finally Free; end;
Delphi-Quellcode:
Auf die gleiche Weise kann man natürlich vor dem Registryzugriff die Edits mit den gewünschten Standardwerten füllen.
for i := 1 to 9 do
if(ValueExists('Typ ' + inttostr(i))) then begin MyEdit := self.FindComponent('Edit' + inttostr(i)); if(MyEdit <> nil) then (MyEdit as TEdit).Text := ReadString('Typ ' + inttostr(i)); end; @Helpliner: Wenn du die Werte nur lesen willst, halte ich Zitat:
|
Re: Registry Werte beim starten auslesen klappt nicht
@mathias, jo stimmt, sieht schon besser aus
|
Re: Registry Werte beim starten auslesen klappt nicht
Stimm, wenn ich so drüber nachdenke ist false völlig ausreichend.
Zitat:
Delphi-Quellcode:
durch
reg.WriteString('Typ 1', Edit1.Text);
reg.WriteString('Typ 2', Edit2.Text); etc.
Delphi-Quellcode:
Wobei das ersetzen der Zahl in Editx.Text nicht geklappt hat.
var i: Integer;
begin i := 1; while i <= 9 do begin reg.WriteString('Typ' + IntToStr(i)), Edit(i).Text); end; end; Aber jetzt habe ich ja eine Lösung dafür auf dem Silberteller bekommen die ich sogar noch verstehe *freu* |
Re: Registry Werte beim starten auslesen klappt nicht
Zitat:
Zuerst immer der Parent und dann die Child-Controls. Alternativ im OnCreate immer erst ein inherited; und dann erst zuweisungen, denn im inherited werden die childcontrols erzeugt. |
Re: Registry Werte beim starten auslesen klappt nicht
Zitat:
D.h. schon in FormCreate kann man auf alle Koponenten zugreifen, die man selbst aufs Form gepackt hat. Gruß, teebee |
Re: Registry Werte beim starten auslesen klappt nicht
Aber anscheinend ja nicht 100%ig sauber, sonst hätte es das
Zitat:
|
Re: Registry Werte beim starten auslesen klappt nicht
Zitat:
Wenn Du's nicht glauben magst hole Dir eine Professional - Version von Delphi und lies im Quelltext der VCL nach :) |
Re: Registry Werte beim starten auslesen klappt nicht
Zitat:
Delphi-Quellcode:
Im übrigen: das inherited in einem Ereignis-Handler wie OnCreate ist Unsinn. Bitte nicht mit einem inherited in einem Konstruktor, d.h in der Create-Methode selbst, verwechseln, in die kommst Du ja nicht rein, es sei denn Du leitest eine neue Klasse ab und überschreibst Create. Außerdem würde mir nicht einleuchten, wie man mit einem inherited, was ja eine Methode einer Super(sprich: Vererber)-Klasse aufruft und nicht eine Methode eines Child-Fensters, die untergeordneten Steuerelemente erzeugen lassen will.
constructor TCustomForm.Create(AOwner: TComponent);
begin CreateNew(AOwner); // zuerst wird das Form selbst erzeugt if (ClassType <> TForm) and not (csDesigning in ComponentState) then begin Include(FFormState, fsCreating); try if not InitInheritedComponent(Self, TForm) then // dann der Resourcendatei entsprechend alle Komponenten raise EResNotFound.CreateFmt(SResNotFound, [ClassName]); finally Exclude(FFormState, fsCreating); end; try if Assigned(FOnCreate) then FOnCreate(Self); // und _dann erst_ das Ereignis ausgelöst except Application.HandleException(Self); end; if fsVisible in FFormState then Visible := True; // erzeugt wird jetzt nix mehr end; end; Zusammengefasst heisst das: - wenn das OnCreate-Ereignis gefeuert wird, sind alle Komponenten, die in der Ressourcendatei des Forms gespeichert sind, bereits erzeugt. Das heisst zwar nicht, dass man auf alle Eigenschaften Zugriff hat, die Items einer ComboBox z.B. sind erst erreichbar, wenn die ComboBox auf dem Bildschirm ist (nichts desto trotz ist sie bei OnCreate bereits da!), TEdit.Text, und darum ging es hier ja, funktioniert allerdings, bitte mal ausprobieren! - der OnCreate-Ereignishandler eines Forms hat nichts mit seinem Konstruktor Create (außer, dass es von dort aufgerufen wird), inherited gehört hier nicht rein! Alle Klarheiten beseitigt? :wink: Gruß, teebee |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 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