[gelöst] Ereignisse eines Frames
- kralle
- Lazarusforum e. V.
- Beiträge: 1247
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
[gelöst] Ereignisse eines Frames
Moin,
ich habe mal wieder Stress mit Frames.
Normaler Weise läuft das z.B. mit einem OnChange-Ereignis so:
Komponente markieren im Objektinspektor Doppelklick auf das Eingabefeld des Ereignisses und schon hat man eine leere Procedure im Quellcode.
Wenn ich aber im Quellcode eines Frames bin, dann landet Procedure nicht im Quellcode des Frames sondern in der Unit die das Frame eingebunden hat.
Auch manuell kann ich keine Verbindung zwischen der Ereignis-Routine der Komponente auf dem Frame und dem Frame-Quellcode herstellen.
Gibt es da einen Trick oder muss ich das Frame erst von dem aufrufenden Formular trennen ( was dann beim Neuanlegen neue Namen bedeutet und Verlust der vorhanden Bezüge)
Gruß Heiko
ich habe mal wieder Stress mit Frames.
Normaler Weise läuft das z.B. mit einem OnChange-Ereignis so:
Komponente markieren im Objektinspektor Doppelklick auf das Eingabefeld des Ereignisses und schon hat man eine leere Procedure im Quellcode.
Wenn ich aber im Quellcode eines Frames bin, dann landet Procedure nicht im Quellcode des Frames sondern in der Unit die das Frame eingebunden hat.
Auch manuell kann ich keine Verbindung zwischen der Ereignis-Routine der Komponente auf dem Frame und dem Frame-Quellcode herstellen.
Gibt es da einen Trick oder muss ich das Frame erst von dem aufrufenden Formular trennen ( was dann beim Neuanlegen neue Namen bedeutet und Verlust der vorhanden Bezüge)
Gruß Heiko
Zuletzt geändert von kralle am Do 3. Mär 2016, 16:51, insgesamt 1-mal geändert.
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
-
- Beiträge: 2194
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Ereignisse eines Frames
Frames kannst du nach dem du sie Eingebunden hast noch nachträglich verändern, das heißt dass die Änderungen die du z.B. in Form 1 an dem Frame machst in Form1 gespeichert werden, und nicht in dem Frame. Willst du etwas im Frame selbst ändern, oder für jede Instanz des Frames, so musst du es in der LFM vom Frame ändern, und danach den Frame auf der Form aktualisieren. Das ist ein wenig nervig ich weiß, und ich bin auch kein Fan dieses Features, aber es ist nun halt mal so. Den Fehler mache ich auch öfters, dinge Teilweise nur in der Form zu ändern. Deshalb lade ich Frames mittlerweile fast außschlislich dynamisch
- kralle
- Lazarusforum e. V.
- Beiträge: 1247
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
Re: Ereignisse eines Frames
Hallo Warf,
wo packst Du denn das Erzeugen und aufrufen der Frames hin?
Spontan würde ich sagen:" ins OnCreate des Hauptformular".
Wenn die Frames aber nicht direkt auf dem Hauptformular angezeigt werden sollen,
sondern auf einzelnen Seiten eines TabSheet - dann ins OnCreate des TabSheet oder
doch in ersteres, aber wie kann ich dann da sicher sein, dass das TabSheet als Ziel dem System schon bekannt ist?
Gruß Heiko
wo packst Du denn das Erzeugen und aufrufen der Frames hin?
Spontan würde ich sagen:" ins OnCreate des Hauptformular".
Wenn die Frames aber nicht direkt auf dem Hauptformular angezeigt werden sollen,
sondern auf einzelnen Seiten eines TabSheet - dann ins OnCreate des TabSheet oder
doch in ersteres, aber wie kann ich dann da sicher sein, dass das TabSheet als Ziel dem System schon bekannt ist?
Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
-
- Beiträge: 7026
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Ereignisse eines Frames
Mit Parent kannst du sagen, auf welches Fenster die Frame kommen soll, in deinem Beispiel wäre es TabSheet.
Code: Alles auswählen
Frame.Parent:=TabSheet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Ereignisse eines Frames
+1Warf hat geschrieben:Deshalb lade ich Frames mittlerweile fast außschließlich dynamisch
Ich mache das immer OnChange des PageControls. Altes Frame, falls erstellt, zerstören, neues erstellen.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
- kralle
- Lazarusforum e. V.
- Beiträge: 1247
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
Re: Ereignisse eines Frames
Hallo Michl,
Bei meiner gibt es kein Ereignis "OnCreate" bei dem "TPageControl"
Und die nächste Frage die sich stellt, wie mache ich Vorgaben für die einzelnen Frames?
Bisher hatte ich das im "OnCreate" des Hauptformulars.
Aber selbst wenn ich im "OnCreate" die als Frames erstes erzeuge und anzeigen lasse, kennt die IDE während der Entwicklung die Frames in dem Moment nicht und
ich keinem Objekt auf dem Frame irgend welche Eigenschaften zu weisen.
Das Frame selber hat auch kein "OnCreate"-Ereignis.
Habe ich jetzt nur die Möglichkeit im Formular-Designer , die Vorgaben einzustellen?
Gruß Heiko
Was für eine Lazarus-Version hast Du?Michl hat geschrieben: Ich mache das immer OnChange des PageControls. Altes Frame, falls erstellt, zerstören, neues erstellen.
Bei meiner gibt es kein Ereignis "OnCreate" bei dem "TPageControl"

Und die nächste Frage die sich stellt, wie mache ich Vorgaben für die einzelnen Frames?
Bisher hatte ich das im "OnCreate" des Hauptformulars.
Aber selbst wenn ich im "OnCreate" die als Frames erstes erzeuge und anzeigen lasse, kennt die IDE während der Entwicklung die Frames in dem Moment nicht und
ich keinem Objekt auf dem Frame irgend welche Eigenschaften zu weisen.
Das Frame selber hat auch kein "OnCreate"-Ereignis.
Habe ich jetzt nur die Möglichkeit im Formular-Designer , die Vorgaben einzustellen?
Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
Re: Ereignisse eines Frames
...ich auch nicht.kralle hat geschrieben:Bei meiner gibt es kein Ereignis "OnCreate" bei dem "TPageControl"
Ich nehme wie oben geschrieben OnChange vom PageControl.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 2194
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Ereignisse eines Frames
Um einen Frame dynamisch zu laden kannst du einfach im OnCreate des Vaterformulars es so verwenden:
Wenn du später noch drauf zugreifen möchtest empfiehlt sich die Nutzung eines Felds in der Formularklasse:
Benötigst du den Frame erst später (z.B. bei einem Browser mit verschiedenen Tabs bei neuen Tabs) dann kannst du einfach wann auch immer im Code den Frame erst erstellen
PS: Willst du in einem Frame bei der Creation etwas machen hast du zwar kein OnCreate, aber kannst einfach den Konstruktor überladen:
Selbiges geht auch mit dem Destruktor
PPS:
Code: Alles auswählen
with TFrame1.Create(Self) do
begin
Parent:=self;
Align:=alClient;
// Weitere einstellungen vornehmen
end;
Code: Alles auswählen
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FTestFrame: TFrame1;
public
{ public declarations }
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
FTestFrame := TFrame1.Create(Self);
with FTestFrame do
begin
Parent:=self;
Align:=alClient;
// Weitere einstellungen vornehmen
end;
end;
PS: Willst du in einem Frame bei der Creation etwas machen hast du zwar kein OnCreate, aber kannst einfach den Konstruktor überladen:
Code: Alles auswählen
TFrame1 = class(TFrame)
private
{ private declarations }
public
constructor Create(TheOwner: TComponent); override;
{ public declarations }
end;
implementation
{$R *.lfm}
{ TFrame1 }
constructor TFrame1.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
// Dein Code
end;
PPS:
Mache ich nur wenn es notwendig ist. wenn ich den Frame einfach nur updaten möchte schreibe ich eine Update Funktion.Ich mache das immer OnChange des PageControls. Altes Frame, falls erstellt, zerstören, neues erstellen.
- kralle
- Lazarusforum e. V.
- Beiträge: 1247
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
Re: Ereignisse eines Frames
Hallo warf,
Jetzt kann ich auch wieder meine Default-Werte an die Frames übergeben.
Danke.
Gruß heiko
Das war der entscheidende Hinweis. Ich hatte die Zuweisung in einer von "OnCreate" aufgerufenen Procedure gemacht und nicht schon vorher im "private"-Abschnitt.Warf hat geschrieben: Wenn du später noch drauf zugreifen möchtest empfiehlt sich die Nutzung eines Felds in der Formularklasse:Code: Alles auswählen
TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FTestFrame: TFrame1; public { public declarations } end;
Jetzt kann ich auch wieder meine Default-Werte an die Frames übergeben.
Danke.
Gruß heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
- kralle
- Lazarusforum e. V.
- Beiträge: 1247
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 4.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
Re: [gelöst] Ereignisse eines Frames
Ich danke Euch allen für die konstruktive Hilfe.
Gruß Heiko
Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1