Formulare ohne eigene Unit erstellen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aries
Beiträge: 18
Registriert: Fr 26. Okt 2012, 01:41

Formulare ohne eigene Unit erstellen

Beitrag von Aries »

Ist es möglich, Formulare ohne eine eigene Unit zu erstellen, also nur mit der "Program"-Datei?

Ich klicke auf Datei>Neu>Programm und füge unter "uses" die Unit Forms hinzu
Daran scheint es schon zu scheitern.

Code: Alles auswählen

program Project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, Forms;
 
{$R *.res}
 
begin
end.   
Nachricht: "Fatal: Can't find unit Forms used by Project1"

Woran liegt das?

Wie kann ich den Fehler beheben?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Formulare ohne eigene Unit erstellen

Beitrag von m.fuchs »

Aries hat geschrieben:Ist es möglich, Formulare ohne eine eigene Unit zu erstellen, also nur mit der "Program"-Datei?
Wenn du auf die Unterstützung des Designers verzichten kannst, ist das kein Problem. Ob der damit klarkäme bezweifele ich.
Aries hat geschrieben:Ich klicke auf Datei>Neu>Programm und füge unter "uses" die Unit Forms hinzu
Daran scheint es schon zu scheitern.
Du musst das Package LCL manuell hinzufügen. Projektinspektor => Hinzufügen => Neue Anforderung...
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Aries
Beiträge: 18
Registriert: Fr 26. Okt 2012, 01:41

Re: Formulare ohne eigene Unit erstellen

Beitrag von Aries »

m.fuchs hat geschrieben:
Aries hat geschrieben:Ich klicke auf Datei>Neu>Programm und füge unter "uses" die Unit Forms hinzu
Daran scheint es schon zu scheitern.
Du musst das Package LCL manuell hinzufügen. Projektinspektor => Hinzufügen => Neue Anforderung...
Danke, die Fehlermeldung kommt jetzt nicht mehr.

Was beinhaltet das LCL-Package?

Beim manuellen Hinzufügen des LCL-Packages hat sich nichts am Code geändert. In welcher anderen Datei steht jetzt, dass das LCL-Package eingebunden ist?

Der Programmcode sieht nun so aus:

Code: Alles auswählen

program Project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  classes, Forms, Interfaces;
 
var
  Form1: TForm;
 
{$R *.res}
 
begin
  Form1:=TForm.Create(nil);
  Form1.Show;
  readln;
end.  
Fehlermeldung: Failed to create win 32 control, error 1407: Fensterklasse wurde nicht gefunden.

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Formulare ohne eigene Unit erstellen

Beitrag von theo »

Wozu eigentlich?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Formulare ohne eigene Unit erstellen

Beitrag von Socke »

Aries hat geschrieben:Was beinhaltet das LCL-Package?
LCL steht für Lazarus Component Library und entspricht in etwa der Delphi VCL (Visual Component Library). Die LCL enthält kapselt also jede Menge durch das Widgetset (Win32, GTK[2|3], QT, etc.) bereitgestellte Steuerelemente, sodass man diese bequem in Pascal verwenden kann.
Aries hat geschrieben:Beim manuellen Hinzufügen des LCL-Packages hat sich nichts am Code geändert. In welcher anderen Datei steht jetzt, dass das LCL-Package eingebunden ist?
Das steht in der Projektdatei (.lpi). Im Package sind die Unit-Suchpfade für den Compiler hinterlegt, sodass dieser die Units beim Übersetzen finden kann.
Aries hat geschrieben:Fehlermeldung: Failed to create win 32 control, error 1407: Fensterklasse wurde nicht gefunden.
Die LCL benötigt ein TApplication-Objekt. Dieses wird in der Unit Forms automatisch erstellt und in der Variablen Forms.Application hinterlegt. Von diesem Objekt musst du vor dem Erstellen von Fenstern die Methode Initialize() aufrufen. sobald alles fertig ist, startest du mit der Methode Run() die Hauptbotschaftenschleife (main message loop), in der die Anwendung auf Botschaften des Widgetsets (Maus-/Tastatur-/Betriebssystemereignisse, etc.) reagiert.

Als Beispiel solltest du dir eine Standard-GUI-Anwendung in Lazarus ansehen (Projekt -> .lpr-Datei anzeigen).

Ob damit der Fehler behoben ist, kann ich nicht sagen, aber diese Methodenaufrufe fehlen bei dir definitiv noch.

Btw. theos Frage bleibt natürlich noch: Warum das ganze? Vielleicht gibt es einen einfacheren Weg dein Ziel zu erreichen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Formulare ohne eigene Unit erstellen

Beitrag von Socke »

Aries hat geschrieben:Was beinhaltet das LCL-Package?
LCL steht für Lazarus Component Library und entspricht in etwa der Delphi VCL (Visual Component Library). Die LCL enthält kapselt also jede Menge durch das Widgetset (Win32, GTK[2|3], QT, etc.) bereitgestellte Steuerelemente, sodass man diese bequem in Pascal verwenden kann.
Aries hat geschrieben:Beim manuellen Hinzufügen des LCL-Packages hat sich nichts am Code geändert. In welcher anderen Datei steht jetzt, dass das LCL-Package eingebunden ist?
Das steht in der Projektdatei (.lpi). Im Package sind die Unit-Suchpfade für den Compiler hinterlegt, sodass dieser die Units beim Übersetzen finden kann.
Aries hat geschrieben:Fehlermeldung: Failed to create win 32 control, error 1407: Fensterklasse wurde nicht gefunden.
Die LCL benötigt ein TApplication-Objekt. Dieses wird in der Unit Forms automatisch erstellt und in der Variablen Forms.Application hinterlegt. Von diesem Objekt musst du vor dem Erstellen von Fenstern die Methode Initialize() aufrufen. sobald alles fertig ist, startest du mit der Methode Run() die Hauptbotschaftenschleife (main message loop), in der die Anwendung auf Botschaften des Widgetsets (Maus-/Tastatur-/Betriebssystemereignisse, etc.) reagiert.

Als Beispiel solltest du dir eine Standard-GUI-Anwendung in Lazarus ansehen (Projekt -> .lpr-Datei anzeigen).

Ob damit der Fehler behoben ist, kann ich nicht sagen, aber diese Methodenaufrufe fehlen bei dir definitiv noch.

Btw. theos Frage bleibt natürlich noch: Warum das ganze? Vielleicht gibt es einen einfacheren Weg dein Ziel zu erreichen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Aries
Beiträge: 18
Registriert: Fr 26. Okt 2012, 01:41

Re: Formulare ohne eigene Unit erstellen

Beitrag von Aries »

Der Code sieht nun so aus:

Code: Alles auswählen

Program Project1;
 
{$mode objfpc}
 
uses
  classes, forms, interfaces;
 
Var
  Form1: TForm;
 
begin
  Application.Initialize;
  Form1:=TForm.CreateNew(Application);
  Form1.Show;
  Application.Run;
end.     
Ob das Programm funktioniert, hängt nun davon ab, ob man im Projektinspektor LCL hinzufügt.

Gibt es da eine Möglichkeit, das über den Code zu regeln?

Mit {$include ~lcl~} vielleicht?
Zuletzt geändert von Aries am Di 11. Dez 2012, 01:59, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Formulare ohne eigene Unit erstellen

Beitrag von Socke »

Aries hat geschrieben:Ob das Programm funktioniert, hängt nun davon ab, ob man im Projektinspektor LCL hinzufügt.

Gibt es da eine Möglichkeit, das über den Code zu regeln?

Mit {$include ~lcl~} vielleicht?
Nein. Die Unit Interfaces bereitet alles vor, damit die Formulare (und andere Steuerelemente) erstellt werden können. Wenn du so willst, ist das das Zeichen "Hier wird die LCL" verwendet". Damit diese Unit gefunden wird, muss die LCL im Projektinspektor eingetragen sein.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Formulare ohne eigene Unit erstellen

Beitrag von martin_frb »

Aries hat geschrieben:Der Code sieht nun so aus:
Ob das Programm funktioniert, hängt nun davon ab, ob man im Projektinspektor LCL hinzufügt.
Genau genommen: Das bestimmt, ob es kompiliert werden kann.
Gibt es da eine Möglichkeit, das über den Code zu regeln?

Mit {$include ~lcl~} vielleicht?
Im Code ist doch "uses interfaces"

Allerdings, weiss der compiler nicht wo auf deiner platte, diese (und alle von dieser benutzten Units) ist.

Du musst dem Kompiler also den Pfad angeben., Aber da interfaces weitere units verwended, die in noch mehr anderen Pfaden sind, muss Du sehr viele Pfade angeben.
Daher sagst du der IDE, das die Package LCL alle diese Daten hat. Die IDE sammelt dann all die Pfade, und gibt dies dem Kompiler.

Antworten