Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Fehlermeldung nach Compilierung

Empfohlene Antworten

Veröffentlicht

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

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 !

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.

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 !

danke für deine tipps, leider wars das immer noch nicht.

er bleibt stehen in der project datei bei application.run.

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.

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

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

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.

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.

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:

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.

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

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?

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.