Formular mit einem Frame dynamisch erzeugen

Rund um die LCL und andere Komponenten
Antworten
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

Formular mit einem Frame dynamisch erzeugen

Beitrag von braunbär »

Irgendwie funktioniert da überhaupt nichts, und ich habe keine Idee, was ich da falsch mache.

ich habe eine Klasse TfdFrame von TFrame abgeleitet, die hat (momentan - später werden es mehr) als einzige Änderung die property Caption in den published Bereich verschoben. Testweise habe ich ihr jetzt auch noch ein Editfeld verpasst. Die Klasse verwende ich nicht direkt, sondern nur als Basisklasse für eine Reihe von abgeleiteten Frameklassen. Das erste Seltsame (das stört mich nicht wirklich, sollte aber sicher nicht so sein) ist, dass ich im OI von TfdFrame die Property Caption nicht angezeigt bekomme - in einer von TfdFrame abgeleiteten Klasse aber schon.

Nun habe ich eine Basisklasse TfdGridform von TForm abgeleitet. Die Forms dieses Typs werden zur Laufzeit erstellt, sie enthalten ein Stringgrid, ein Memo sowie ein Panel. In dem Panel sollte eines der von TfdFrame abgeleiteten Frames angezeigt werden. Die Prozedur, die das bewerksteligt, schaut so aus:

Code: Alles auswählen

 
procedure Showgrid (Parent: TForm; Frameclass: TfdFrameclass)// TfdFrameclass = class of TfdFrame
 var
  Form: TGridForm;              //  Diese Form wird erstellt und angezeigt
  MyFrame: TfdFrame;            //  Diese Frame wird erstellt und im Panel der Form angezeigt werden
 
begin
  Application.CreateForm(TGridForm, Form);
  Form.Parent := Parent;           
 
  MyFrame := Frameclass.Create(Form.Panel1)// je nach Aufrufparameter wird der entsprechende Frametyp erstellt.
  MyFrame.Parent := Form.Panel1;             
 
  if MyFrame is TfrmInterpret then Showmessage('frmInterpret');     // Das funktioniert richtig, Tfrminterpret wird beim Aufruf von showgrid  übergeben
 
   showmessage( MyFrame.Caption )// Aber Myfram.Caption ist leer, obwohl ich im OI als Caption von TfrmInterpret den String "Interpret" eingegeben habe
   Form.Show
 
end;
 
 

Die Form wird gezeigt, aber obwohl der Typ der Frame laut obiger Testausgabe TfrmInterpret und nicht TfdFrame ist, wird nur das Eingabefeld angezeigt, das ich probeweise in der Basisklasse TfdFrame einggeben habe, die Eingabefelder von TfrmInterpret fehlen und die Caption von TfrmInterpret ist leer.
Es schaut so aus, als würden die Aktionen, die ich in der Ableitung Tfrminterpret (abgeleitet von TfdFrame) im OI eingegeben habe, nicht passieren, und als würde bloß ein TfdFrame erzeugt, das glaubt, es wäre ein TfrmInterpret.


Und im gleichen Atemzug gleich noch zwei andere Probleme:

Das Formular reagiert nicht (geht nicht zu), wenn man rechts oben auf den Schliessen-Button klickt.

Das aufrufende (Parent)Formular MainForm hat den Formstyle fsMDIForm, und Gridform hat den Style fsMDIChild. Die Gridform pickt am linken oberen Rand des Mainforms fest und kann nur resized, aber nicht verschoben werden.

Antworten