Von eigenen TForms und TFrames ableiten

Rund um die LCL und andere Komponenten
braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Von eigenen TForms und TFrames ableiten

Beitrag von braunbär »

Ich probiere schon eine ganze Weile herum und bekomme es nicht hin.

Was muss ich bei Lazarus machen, um eine eigene TmyForm oder TmyFrame als Basisformular für neue, abzuleitende Formulare und Frames zu erstellen, und zwar so, dass das zur Laufzeit und auch mit dem Object Inspector richtig funktioniert? Das Zusammenspiel der LFMs der ursprünglichen und der abgeleiteten Form bzw. Frame ist mir bei Free Pascal überhaupt nicht klar. Ich habe den starken Verdacht, dass da etwas im Compiler bzw. in der Runtime feherhaft ist, aber ich blicke noch nicht genug durch, um das sicher sagen zu können.

Bei Delphi gibt es die Objektablage, in der man derartige Dinge ablegt und dann ohne Problem wiederverwenden kann. Gibt es bei Lazarus irgend etwas vergleichbares, bzw. wie ist da die empfohlene Vorgangsweise?

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Von eigenen TForms und TFrames ableiten

Beitrag von braunbär »

Es scheint überhaupt nicht zu funktionieren.

Ich habe jetzt die einfachste Version überhaupt versucht -> Lazarus crasht:

Neues Projekt erstellen mit einer Unit Unit1 und einer Form TForm 1. Auf die Form nur ein Button Button1.
Dann Datei - Neu - Abgeleiteter Punkt - Abgeleitete Projektkomponente - Form1
Im Editor erscheint eine Unit, im Formulareditor eine neue, leere Form, der vererbte Button1 ist aber schon einmal nicht sichtbar.

Und dieses Programm aus zwei Units, das noch gar nichts macht (und die 2. Unit wird nicht einmal verwendet), hängt schon beim Starten in einer Endlosschleife und muss abgeschossen werden.

TraumTaenzerDieter
Beiträge: 28
Registriert: So 14. Aug 2011, 09:11

Re: Von eigenen TForms und TFrames ableiten

Beitrag von TraumTaenzerDieter »

Läuft wie im Anhang gezeigt (Lazarus 1.8.4 FPC 3.0.4).
(und wie von taaz beschrieben)
Suche mal unter dem Begriff "VFI" (Visual Form Inheritance),
da findest Du einiges.
Dateianhänge
VFI.zip
Muster für abgeleitete Form (VFI)
(2.73 KiB) 86-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Von eigenen TForms und TFrames ableiten

Beitrag von af0815 »

Warum lädst du den nicht funktionierende Source nicht einmal hoch. Aus der Beschreibung alleine kann ich mir keinen Reim machen,was da schiefläuft. Ich habe in meinen Applikation oft vererbte Frames und Forms und keine Probleme.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Von eigenen TForms und TFrames ableiten

Beitrag von braunbär »

Hier ist ein simples Projekt mit 2 Units.
Im OI schaut noch alles richtig aus, kompiieren geht sogar auch, aber beim Starten des Programm stürrzt es ab. Es zeichnet nur den Rahmen der 1. Form ohne Button1 und ohne caption, dann reagiert es nicht mehr und kann nur mehr über den "Stop"-Button des Debuggers bzw. über den Taskmanager beendet werden.
In anderen Konstellationen, speziell wenn so eine Form als Teil eines Package in Lazarus eingebunden wird, stürzt auch die IDE komplett ab.

Der Ordnung Halber: Ich habe das Problem inzwischen auch im englisch-sprachigen Forum gepostet.
Dateianhänge
Projekt 1.zip
(125.94 KiB) 75-mal heruntergeladen

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Von eigenen TForms und TFrames ableiten

Beitrag von braunbär »

Hi, ich glaube (hoffe), ich habe die Lösung gefunden. Danke für das VFI.zip, das hat einwandfrei gestartet. Ich habe dann geschaut, was da anders ist als in meinem Projekt, und die Prozedur Formcreate entfernt. Jetzt stürzt es genauso ab wie meine Programme.

Wenn sie vererbt werden soll, braucht eine Form offenbar eine Prozedur Formcreate, auch wenn drin nichts gemacht wird:

Code: Alles auswählen

 
procedure TfVorlage.FormCreate(Sender: TObject);
begin
   self.Left := 0;
   self.Top := 0;
end;
 

Hier passiert ja in Wirklichkeit auch nichts, die beiden Eigenschaften sind im OI schon so gesetzt. Aber ohne FormCreate stürzt das Programm ab. Ein Hinweis in der Dokumentation von TForm wäre da sehr hilfreich.

TraumTaenzerDieter
Beiträge: 28
Registriert: So 14. Aug 2011, 09:11

Re: Von eigenen TForms und TFrames ableiten

Beitrag von TraumTaenzerDieter »

NEIN, da irrst Du Dich!
Nicht das FormCreate ist das Problem in Deinem Projekt sondern die Zeile
Application.CreateForm(TForm1, Form1);
in Deiner Project1.lpr !!
Kommentiere sie aus und auch Dein Projekt functioniert!

Das überschrieben Create in meiner abgeleiteten Form habe ich nur
überschrieben um Dir zu zeigen daß dadurch die Position ändert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Von eigenen TForms und TFrames ableiten

Beitrag von wp_xyz »

Form1 ist doch das Hauptformular. Das kann er doch nicht einfach entfernen!

Ansonsten sehe ich mit dem oben beigefügten Demoprogramm keinerlei Absturz. Ich habe neben Laz trunk/fpc 3.04 auch Laz 1.6.4/3.02 und Laz 1.0/fpc 2.6.0 ausprobiert, jeweils 32 bit auf Win10/64 bit. Was ist dein BS? Hast du irgendwelche "Spezial"-Komponenten installiert? Benenne dein Profil-Verzeichnis um, so dass Lazarus mit Defaultwerten neu startet und probiere es erneut.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Von eigenen TForms und TFrames ableiten

Beitrag von braunbär »

ich probiere gerade verschiedene Sachen aus und werde berichten, was ich herausgefunden habe.

Aber das von TraumTaenzerDieter hochgeladene Projekt VFI lässt sich bei mir anstandslos starten und ausführen.
Wenn ich die Prozedur Formcreate entferne und sonst absolut nichts an den Sourcen verändere, lässt es sich zwar kompilieren, stürzt aber beim Start genau so ab wie meine eigenen Beispielprogrmme - egal, ob aus der IDE gestartet oder ob ich das Exe-File aus dem Betriebsystem heraus aufrufe.

@TraumTaenzerDieter
Das Formcreate gehört nicht zur abgeleiteten Form, sondern zur Vorlage.

@wp_xyz
Das Beispielprogramm, das ich hochgeladen habe, funktioniert bei dir??? Dann verstehe ich nicht, was los ist. Ich arbeite mit Windows 10 64Bit, Lazarus IDE 1.8.4 (ich nehme an, 1.6.4 war ein Tippfehler von dir) mit Docking (AnchordockingDsgn 0.5 und Sparta_DockedFormEditor 0.0) und FPC 3.0.4. Könnte es sein, dass die Docking-Komponenten die Probleme verursachen? Aber die sollten doch das EXE-File nicht beeinflussen?
Die ganze Installation wegen der Probleme mittlerweile mehrfach komplett vom Rechner gelöscht (inkl. des Installationsverzeichnisses von lazarus) und von null weg neu installiert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Von eigenen TForms und TFrames ableiten

Beitrag von wp_xyz »

braunbär hat geschrieben:@wp_xyz
Das Beispielprogramm, das ich hochgeladen habe, funktioniert bei dir??? Dann verstehe ich nicht, was los ist. Ich arbeite mit Windows 10 64Bit, Lazarus IDE 1.8.4 (ich nehme an, 1.6.4 war ein Tippfehler von dir) mit Docking (AnchordockingDsgn 0.5 und Sparta_DockedFormEditor 0.0) und FPC 3.0.4. Könnte es sein, dass die Docking-Komponenten die Probleme verursachen? Aber die sollten doch das EXE-File nicht beeinflussen?
Die ganze Installation wegen der Probleme mittlerweile mehrfach komplett vom Rechner gelöscht (inkl. des Installationsverzeichnisses von lazarus) und von null weg neu installiert.

Ich muss das Demo-Programm nur entpacken, kompilieren, starten und auf den Button klicken und dann soll der Fehler kommen, oder? Kein Fehler bei mir, das Programm läuft einwandfrei, nach dem Klick kommt das zweite, geerbte, Formular. 1.6.4 war so richtig, aber ich habe eben auch 1.8.4 ausprobiert, auch kein Problem, und die 1.8.4 habe ich noch mit 64-Bit und Anchordocking auf der Platte, auch kein Problem. Sehr mysteriös...

Nochmals: ich habe nicht gemeint, dass du Laz neu installieren sollst. Sondern nur das Profilverzeichnis umbenennen, Lazarus neu starten und die IDE neu bauen (ok - das hatte ich oben nicht geschrieben) - dann ist Lazarus so wie im Anlieferungszustand, ohne Zusatzkomponenten. Tritt in diesem Zustand der Fehler nicht auf, dann kannst du deine Komponenten schrittweise wieder hinzufügen und weißt dann, in welcher das faule Ei gelegt wird.

Ist dein Lazarus 64-Bit? Obwohl - 1.8.4/64-Bit mit Anchordocking und Sparta_DockedFormEditor hat bei mir ja funktioniert...

TraumTaenzerDieter
Beiträge: 28
Registriert: So 14. Aug 2011, 09:11

Re: Von eigenen TForms und TFrames ableiten

Beitrag von TraumTaenzerDieter »

braunbär hat geschrieben:@TraumTaenzerDieter
Das Formcreate gehört nicht zur abgeleiteten Form, sondern zur Vorlage.


Wenn Du das FormCreate in der Vorlage löscht, dann knallt es logischerweise:
das abgeleitete Formular ruft in seinem FormCreate (per "inherited")
das FormCreate der Vorlage auf, also worauf soll es dann zugreifen?

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Von eigenen TForms und TFrames ableiten

Beitrag von braunbär »

@wp_xyz
Verstehe ich wirklich nicht. Wenn ich das kompilierte Programm starte, kommt es nicht einmal so weit, dass es den Button anzeigen würde.
Und ich habe, wie schon geschrieben, jetzt eine völlig neue, "jungfräuliche" Installation, außer den beiden Docking-Komponenten ist Lazarus im Originalzustand, da ist noch keine einzige Komponente von mir beteiligt.

@TraumTaenzerDieter
Die abgeleitete Form in Deinem Beispiel hat kein Formcreate, nur die Vorlage.
Und selbst wenn sie eines hätte, und in dem Formcreate inherited aufgerufen würde, SOLLTE das kein Problem sein, weil es dann auf das Formcreate des Vorgängers der Vorlage, also auf das Formcreate von TForm, zugreifen müsste. Jede Klasse erbt automatisch alle Methoden der Vorfahrklasse, auch wenn sie nicht explizit in der abgeleiteten Klasse deklariert sind, und die Vorlage SOLLTE das Formcreate von TForm erben, wenn kein eigenes deklariert ist.

TraumTaenzerDieter
Beiträge: 28
Registriert: So 14. Aug 2011, 09:11

Re: Von eigenen TForms und TFrames ableiten

Beitrag von TraumTaenzerDieter »

Ich weiss nicht welches Testprogramm Du meinst,
aber in meiner Form fAbgeleitet GIBT es ein FormCreate
in dem Left auf 100 gesetzt wird!
Sieh noch einmal genau nach im ORGINAL!

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Von eigenen TForms und TFrames ableiten

Beitrag von braunbär »

Du hast Recht, dort ist auch ein formcreate. Ich weiss jetzt auch nicht, wo ich da geschaut habe, wo kein formcreate war.
Aber wie schon geschrieben, wenn in TfVorlage kein Formcreate deklariert wird, dann erbt TfVorlage trotzdem das Formcreate von TForm und sollte deshalb kein eigenes brauchen, damit das inherited in der abgeeiteten Form funktioniert.

Mittlerweile habe ich den Verdacht, dass meine Windows Installation irgendwie korrupt ist. Das fertige EXE-File, das auf meinem PC gleich beim Starten abstürzt, wenn ich es aus dem Betriebssystem heraus aufrufe, habe ich auf einen USB Stick kopiert und auf meinem Notebook gestartet - da funktioniert es einwandfrei. Ich fürchte, ich muss meinen Rechner neu aufsetzen - obwohl mit anderen Programmen bis jetzt keine Schwierigkeiten erkennbar sind.

TraumTaenzerDieter
Beiträge: 28
Registriert: So 14. Aug 2011, 09:11

Re: Von eigenen TForms und TFrames ableiten

Beitrag von TraumTaenzerDieter »

Na dann: viel Vergnügen!
Um es mit den Worten eines EDV-Veteranen zu beschreiben
E nde
D er
V ernunft

Antworten