Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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 !

Geschrieben

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.

Geschrieben

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 !

Geschrieben

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.

Geschrieben
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.

Geschrieben

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:

Geschrieben

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.

Geschrieben

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?

Geschrieben

danke für die erklärung :o)

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...