Psycho Fred Geschrieben 27. August 2003 Geschrieben 27. August 2003 Hallo Leutz, hab folgendes prob: ich will ein programm mit delphi machen, mit ich gezielt einträge aus der registry auslesen kann. hab dann nun auch mal ein bisschen quelltext entwickelt. Leider funzt das Prog nicht, ich bekomm, nachdem der compiler erfolgreich drübergelaufen ist, ne fehlermeldung, das er TForm1 nicht findet. Schaut euch bitte mal meinen Quelltext an: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; MyString: string[200]; implementation uses registry; procedure readregistry; var Reg : TRegistry; begin reg:=TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey ('Software\Gotthardt\eASys\Lizenz', TRUE) then MyString := Reg.ReadString('TestString'); finally Reg.CloseKey; Reg.Free; end; End; end. Danke im voraus für die Hilfe. Fred Zitieren
grueni Geschrieben 27. August 2003 Geschrieben 27. August 2003 Wenn ich dich richtig verstehe, entsteht der Fehler beim Start des Programms. Hast du schon mal einen Blick in die Projektdatei geworfen ? Ich denk mal, da liegt der Hund am ehesten begraben ! Zitieren
Psycho Fred Geschrieben 27. August 2003 Autor Geschrieben 27. August 2003 danke für die schnelle antwort. hier die project datei. program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Zitieren
grueni Geschrieben 27. August 2003 Geschrieben 27. August 2003 Die Projektdatei sieht OK aus. Dann hätt ich da zwei Fragen: 1. Befinden sich Unit1.pas und Form1.dfm im gleichen Verzeichnis wie die Projektdatei (und heißen die Dateien auch so)? 2. An welcher Stelle bleibt das Programm stehen ? (Ich vermute in der dpr bei CreateForm) btw: Deklarier MyString nicht als globale Variable sondern als öffentliche property ! Zitieren
Psycho Fred Geschrieben 27. August 2003 Autor Geschrieben 27. August 2003 danke für deine tipps, leider wars das immer noch nicht. er bleibt stehen in der project datei bei application.run. Zitieren
grueni Geschrieben 27. August 2003 Geschrieben 27. August 2003 Tja, ich glaub da fehlt ne Compilerdirektive: Aus der Delphi-Hilfe: Achtung: Entfernen Sie die Direktive {$R *.DFM} nicht aus der Unit-Datei. Andernfalls entsteht Code, der nicht verwendbar ist. Achtung: In einer Unit-Datei darf immer nur ein Formular enthalten sein. Die zugehörige Formulardatei (.DFM) kann nur ein einziges Formular beschreiben. Ich würd das Programm so aufbauen: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } procedure readRegistry; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} uses registry; { TForm1 } procedure TForm1.readRegistry; var MyString: String; reg: TRegistry; begin reg:=TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey ('Software\Gotthardt\eASys\Lizenz', TRUE) then MyString := Reg.ReadString('TestString'); finally Reg.CloseKey; Reg.Free; end; end; end. Zitieren
Psycho Fred Geschrieben 27. August 2003 Autor Geschrieben 27. August 2003 danke, hab den fehler gefunden, es lag an der direktive, die hab ich wohl versehentlich gelöscht. vielen dank für deine hilfe. grüße aus koblenz fred Zitieren
Psycho Fred Geschrieben 27. August 2003 Autor Geschrieben 27. August 2003 halt, stop, kommando zurück, es kommt zwar keine fehlermeldung mehr aber dafür wird auch nix ausgegeben, es kommt einfach nur eine leere form. woran kann das liegen? danke im voraus. fred Zitieren
lpd Geschrieben 27. August 2003 Geschrieben 27. August 2003 Original geschrieben von Psycho Fred es kommt einfach nur eine leere form. woran kann das liegen? Anfänger ? Dein Code sagt ja auch nichts anderes aus. Natürlich wird nur ein leeres Formular ausgegeben. Wenn du deine Stringvariable irgendwo angezeigt haben willst, musst du das auch angeben. Ergänze deinen Code nach der Zuweisung MyString := ... mal um folgende Zeile : Form1.Caption := MyString; Nun siehst du den Inhalt der Variable in der Titelleiste des Formulars. Zitieren
Psycho Fred Geschrieben 28. August 2003 Autor Geschrieben 28. August 2003 Anfänger, richtig. Danke für den Tip, klappt aber leider nicht. ich seh immer noch nix. hab schon mal nen anderen pfad probiert, daran liegts auch nicht. Zitieren
grueni Geschrieben 28. August 2003 Geschrieben 28. August 2003 1. Platziere einen Knopf "Button1" auf deinem Formular 2. Platziere ein Label "Label1" Formular 3. Rufe im OnClick von "Button1" deine Prozedur auf und weise "Label1" den Wert von MyString zu. Also ungefähr so: Zitieren
grueni Geschrieben 28. August 2003 Geschrieben 28. August 2003 Beim Klick auf Button1 sollte jetzt etwas passieren. Du definierst einfach ein OnClick-Ereignis für Button1: Wähle Button1 aus, gehe im Objektinspektor auf das Register Ereignisse, Doppelklick auf das freie Feld neben OnClick, und schon hast du den Prozedur-Rumpf für dein Ereignis. Der Code, der hier eingefügt wird, wird bei Eintreten des Ereignisses ausgeführt ! unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } procedure readRegistry; MyString: String; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} uses registry; { TForm1 } procedure TForm1.readRegistry; var reg: TRegistry; begin reg:=TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey ('Software\Gotthardt\eASys\Lizenz', TRUE) then MyString := Reg.ReadString('TestString'); finally Reg.CloseKey; Reg.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin readRegistry; Label1.Caption := MyString; end; end. Zitieren
Psycho Fred Geschrieben 28. August 2003 Autor Geschrieben 28. August 2003 danke für deine mühe, aber es klappt immer noch nicht. woran kann das liegen? muss ich in der registry irgendwas freigeben, damit delphi drauf zugreifen kann? grüße fred Zitieren
geloescht_JesterDay Geschrieben 28. August 2003 Geschrieben 28. August 2003 Hallo Fred, Dein Code mag zwar syntaktisch richtig sein, sieht aber sehr stark nach TurboPascal Code aus, und weniger nach Delphi Code Während bei TP der Code von oben nach unten abgearbeitet wird (also der Code in der Main-Prozedur zw. begin und end.) und nur durch Prozedur und Funktionsaufrufe u.U. ein bisschen rumgesprungen wird, sieht dies bei Delphi und generell Windows Anwendungen anders aus. Da wird ein Programm gestartet und dann tut sich erstmal nix (also nach Application.Run). Alles was dann passiert, passiert nur aufgrund von irgendwelchen Ereignissen (Windows-Messages, die von der Anwendung empfangen werden). Durch diese Ereignisse werden dann, falls zugewiesen, bestimmte Prozeduren oder Funktionen aufgerufen. Beispielsweise wird bei dir ein Objekt vom Typ TForm1 erzeugt. Bei dessen Erzeugung, welches ja durch aufruf der Prozedur Create geschieht (in diesem Fall gekapselt durch Application.CreateForm) in dieser Prozedur (die nicht Prozedur sondern Constructor genannt wird) wird überprüft, ob der Property OnCreate eine Prozedur zugewiesen wurde, und falls ja diese Aufgerufen. Sprich: Wenn du im Objektinspektor bei Ereignissen einen Doppelklick auf das Ereigniss OnCreate machst wird die dann erstellte Prozedur dem Ereigniss zugewiesen und aufgerufen. Auch alles andere geschieht auf ähnliche Weise. Wenn du in deinem Programm also etwas tun willst, muss du das immer in irgendeinem Ereigniss tun. Für dein auslesen aus der Registry wäre das Ereigniss OnClick eines Buttons auf dem Formular ganz praktisch (wurde ja auch schon genannt). Das ist der Hauptunterschied zw. der prozeduralen Programmierung (TurboPascal - DOS) und der ereignissgesteuerten Programmierung (Windows Programme). Hoffe das war soweit verständlich. Original geschrieben von paulaner unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } [b]function[/b] readRegistry[b]: String[/b]; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} uses registry; { TForm1 } [b]function[/b] TForm1.readRegistry[b]: String[/b]; var reg: TRegistry; begin reg:=TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey ('Software\Gotthardt\eASys\Lizenz', TRUE) then [b]Result[/b] := Reg.ReadString('TestString'); finally Reg.CloseKey; Reg.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := [b]readRegistry[/b]; end; end. Habe den Code etwas abgewandelt und (meiner Meinung nach) schöner gemacht Sollte aber so funktionieren. Bist du dir sicher, dass der Root-Knoten HKEY_Local_Machine ist und nicht HKEY_Current_User? Und das zweite Argument bei Reg.OpenKey würde ich auf FALSE setzen, da andernfalls der Key neu angelegt wird, falls er nciht vorhanden ist. Für ein einfaches Auslesen sollte das ja nicht gemacht werden, oder? Zitieren
Psycho Fred Geschrieben 28. August 2003 Autor Geschrieben 28. August 2003 danke für die erklärung ) hab mich aber bei diesem programm an ein delphi buch gehalten. leider klappt es immer noch nicht. hab schon 100 verschiedene registry pfade versucht, aber es klappt immer noch nicht... langsam verzweifle ich... trotzdem danke für deine/eure mühen fred Zitieren
lpd Geschrieben 1. September 2003 Geschrieben 1. September 2003 Hm. Du solltest vielleicht einmal die Funktion "ReadRegistry" debuggen. Setz´ einfach einen Haltepunkt auf die Zeile "if Reg.OpenKey...". Wenn der Debugger anhält, kannst du mit F8 einen Schritt weitergehen und schauen, ob überhaupt etwas in das "Result" geschrieben wird. Was die Vermutung von Jesterday betrifft: Wenn ich mich nicht irre, dann konnte man auf den HKEY_LOCAL_MACHINE nicht zugreifen, wenn man unter NT & 2000 im Account keine Adminrechte besaß, so dass eine Fehlermeldung ausgelöst wurde (Würde hier durch try-finally allerdings abgefangen). Ich hoffe, ich irre mich da jetzt nicht. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.