Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Registry Werte beim starten auslesen klappt nicht (https://www.delphipraxis.net/15165-registry-werte-beim-starten-auslesen-klappt-nicht.html)

Helpliner 23. Jan 2004 06:43


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:
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;
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?

Pseudemys Nelsoni 23. Jan 2004 06:48

Re: Registry Werte beim starten auslesen klappt nicht
 
daran ist nichts falsch, bist du sicher das der pfad richtig ist?

Pseudemys Nelsoni 23. Jan 2004 06:55

Re: Registry Werte beim starten auslesen klappt nicht
 
also ich habs nochmal getestet:

Delphi-Quellcode:
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;
funktioniert einwandfrei

Helpliner 23. Jan 2004 07:02

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:
   reg.OpenKey('Software\Fischmob\Flotteninformationen\0.1 beta', true);
- Die in der Registrierung stehenden werte werden nicht eingetragen, sondern nur Nullen (Die Werte stehen aber noch in der Registrierung).
- Beenden des Programmes, Werte in der Registrierung werden mit Nullen überschrieben......und ich habe keine Ahnung wieso.

Pseudemys Nelsoni 23. Jan 2004 07:03

Re: Registry Werte beim starten auslesen klappt nicht
 
die unit1.pas/unit1.dcu brauch ich schon :mrgreen:

Helpliner 23. Jan 2004 07:07

Re: Registry Werte beim starten auslesen klappt nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
ups...war das falsche Projektverzeichniss :-(

Pseudemys Nelsoni 23. Jan 2004 07:12

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

BrinkschulteManfred 23. Jan 2004 07:19

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

Helpliner 23. Jan 2004 07:25

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) ?

MathiasSimmack 23. Jan 2004 08:25

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.

Helpliner 23. Jan 2004 08:27

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.

MathiasSimmack 23. Jan 2004 08:32

Re: Registry Werte beim starten auslesen klappt nicht
 
Das habe ich aber nicht gemeint.
Ich spreche davon:
Zitat:

Delphi-Quellcode:
  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;

Das try/finally wird üblicherweise nach dem Erzeugen des Registry-Objektes benutzt. Wenn du auf Nummer Sicher gehen willst, kannst du auch "OpenKey" noch mal damit einklammern, so wie du es ja auch getan hast.

Pseudemys Nelsoni 23. Jan 2004 08:36

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?

Helpliner 23. Jan 2004 08:46

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:
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;
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.

Oder verstehe ich jetzt etwas grundsätzlich falsch?

MathiasSimmack 23. Jan 2004 09:10

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:
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;
Man könnte das Auslesen der Werte und Zuweisen an die Edits auch so machen:
Delphi-Quellcode:
      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;
Auf die gleiche Weise kann man natürlich vor dem Registryzugriff die Edits mit den gewünschten Standardwerten füllen.

@Helpliner: Wenn du die Werte nur lesen willst, halte ich
Zitat:

Code:
reg.OpenKey('Software\Fischmob\Flotteninformationen\0.1 beta', [color=#ff0000]true[/color]);

für überflüssig. false reicht, denn schreibend greifst du ja ohnehin nicht zu. Das machst du sicher später, beim Speichern der Werte, und dann passt es auch.

Pseudemys Nelsoni 23. Jan 2004 09:16

Re: Registry Werte beim starten auslesen klappt nicht
 
@mathias, jo stimmt, sieht schon besser aus

Helpliner 23. Jan 2004 09:24

Re: Registry Werte beim starten auslesen klappt nicht
 
Stimm, wenn ich so drüber nachdenke ist false völlig ausreichend.

Zitat:

Zitat von MathiasSimmack
Delphi-Quellcode:
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;
Auf die gleiche Weise kann man natürlich vor dem Registryzugriff die Edits mit den gewünschten Standardwerten füllen.

So etwas ähnliches habe ich zu Anfang ausprobiert, nur das ich es nicht hinbekommen habe ich habe versucht

Delphi-Quellcode:
  reg.WriteString('Typ 1', Edit1.Text);
  reg.WriteString('Typ 2', Edit2.Text);
  etc.
durch

Delphi-Quellcode:
 var i: Integer;
begin
 i := 1;
  while i <= 9 do begin
   reg.WriteString('Typ' + IntToStr(i)), Edit(i).Text);
  end;
end;
Wobei das ersetzen der Zahl in Editx.Text nicht geklappt hat.
Aber jetzt habe ich ja eine Lösung dafür auf dem Silberteller bekommen die ich sogar noch verstehe *freu*

Phoenix 23. Jan 2004 09:29

Re: Registry Werte beim starten auslesen klappt nicht
 
Zitat:

Zitat von Helpliner
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) ?

Latürnich: Dein Kind kann nicht auf die Welt kommen bevor Du nicht geboren wurdest. -> Du kannst nichts auf einen Tisch stellen (auf einer Form erzeugen) wenn der Tisch noch nicht da steht (das Form noch nicht created wurde).

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.

teebee 23. Jan 2004 11:39

Re: Registry Werte beim starten auslesen klappt nicht
 
Zitat:

Zitat von Phoenix
Zitat:

Zitat von Helpliner
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) ?

Latürnich: Dein Kind kann nicht auf die Welt kommen bevor Du nicht geboren wurdest. -> Du kannst nichts auf einen Tisch stellen (auf einer Form erzeugen) wenn der Tisch noch nicht da steht (das Form noch nicht created wurde).

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.

Muss Dir leider widersprechen, in dem Moment, da das OnCreate-Ereignis eines Formulars ausgelöst wird, sind sämtliche Komponenten darauf bereits erzeugt. Sonst hätte es in dem Fall hier auch Schutzverletzungen gehagelt statt eines merkwürdigen Programmverhaltens.

D.h. schon in FormCreate kann man auf alle Koponenten zugreifen, die man selbst aufs Form gepackt hat.

Gruß, teebee

Helpliner 25. Jan 2004 19:33

Re: Registry Werte beim starten auslesen klappt nicht
 
Aber anscheinend ja nicht 100%ig sauber, sonst hätte es das
Zitat:

Zitat von teebee
merkwürdigen Programmverhaltens.

ja nicht gegeben.

Phoenix 25. Jan 2004 19:56

Re: Registry Werte beim starten auslesen klappt nicht
 
Zitat:

Zitat von teebee
Muss Dir leider widersprechen, in dem Moment, da das OnCreate-Ereignis eines Formulars ausgelöst wird, sind sämtliche Komponenten darauf bereits erzeugt. Sonst hätte es in dem Fall hier auch Schutzverletzungen gehagelt statt eines merkwürdigen Programmverhaltens.

D.h. schon in FormCreate kann man auf alle Koponenten zugreifen, die man selbst aufs Form gepackt hat.

Wie ich bereits geschrieben habe: Wenn erst ein inherited geschieht, dann ja - andernfalls werden die Controls implizit nach OnCreate erzeugt.

Wenn Du's nicht glauben magst hole Dir eine Professional - Version von Delphi und lies im Quelltext der VCL nach :)

teebee 25. Jan 2004 20:45

Re: Registry Werte beim starten auslesen klappt nicht
 
Zitat:

Zitat von Phoenix
Wie ich bereits geschrieben habe: Wenn erst ein inherited geschieht, dann ja - andernfalls werden die Controls implizit nach OnCreate erzeugt.

Wenn Du's nicht glauben magst hole Dir eine Professional - Version von Delphi und lies im Quelltext der VCL nach :)

Ich habe eine Pro-Version und ein Blick in den Quelltext zeigt genau, was beim Erzeugen eines Forms passiert:
Delphi-Quellcode:
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;
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.

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 01:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz