[gelöst] Ereignisse eines Frames

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
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

Beitrag von kralle »

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
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

Warf
Beiträge: 2194
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Ereignisse eines Frames

Beitrag von Warf »

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

Benutzeravatar
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

Beitrag von kralle »

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
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Mathias
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

Beitrag von Mathias »

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

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Ereignisse eines Frames

Beitrag von Michl »

Warf hat geschrieben:Deshalb lade ich Frames mittlerweile fast außschließlich dynamisch
+1

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;  

Benutzeravatar
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

Beitrag von kralle »

Hallo Michl,
Michl hat geschrieben: Ich mache das immer OnChange des PageControls. Altes Frame, falls erstellt, zerstören, neues erstellen.
Was für eine Lazarus-Version hast Du?
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

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Ereignisse eines Frames

Beitrag von Michl »

kralle hat geschrieben:Bei meiner gibt es kein Ereignis "OnCreate" bei dem "TPageControl" :?:
...ich auch nicht.

Ich nehme wie oben geschrieben OnChange vom PageControl.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Warf
Beiträge: 2194
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Ereignisse eines Frames

Beitrag von Warf »

Um einen Frame dynamisch zu laden kannst du einfach im OnCreate des Vaterformulars es so verwenden:

Code: Alles auswählen

 
  with TFrame1.Create(Self) do
  begin
    Parent:=self;
    Align:=alClient;
    // Weitere einstellungen vornehmen
  end;  
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;
 
...
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  FTestFrame := TFrame1.Create(Self);
  with FTestFrame do
  begin
    Parent:=self;
    Align:=alClient;
    // Weitere einstellungen vornehmen
  end;
end;    
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:

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; 
Selbiges geht auch mit dem Destruktor

PPS:
Ich mache das immer OnChange des PageControls. Altes Frame, falls erstellt, zerstören, neues erstellen.
Mache ich nur wenn es notwendig ist. wenn ich den Frame einfach nur updaten möchte schreibe ich eine Update Funktion.

Benutzeravatar
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

Beitrag von kralle »

Hallo warf,
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;
 
Das war der entscheidende Hinweis. Ich hatte die Zuweisung in einer von "OnCreate" aufgerufenen Procedure gemacht und nicht schon vorher im "private"-Abschnitt.
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

Benutzeravatar
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

Beitrag von kralle »

Ich danke Euch allen für die konstruktive Hilfe.

Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Antworten