[gelöst] OnShow für TFrame oder Alternative

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] OnShow für TFrame oder Alternative

Beitrag von kralle »

OS: Linux Mint 17.3 64-Bit
FPC: 3.0.0
Laz: 1.6

Moin,

ich bin auf der Suche nach einem Weg ein "OnShow"-Ereignis für ein Frame zu erstellen.
Das Einzige was ich gefunden habe, ist eine Delphi-Lösung die nur unter Windows läuft weil sie eine Windows-Message nutzt.

Gibt es vielleicht eine Alternative? Ich möchte z.B.

Code: Alles auswählen

Edit1.Enable:=true;
das auf einem Frame liegt setzen je nach Inhalt einer Variablen in einen Datenmodul.
Wie würdet ihr das lösen? Das ich das über das Formular das die Frames aufnimmt machen könnte, weiß ich, aber geht es auch auf obigen Weg?

Gruß Heiko
Zuletzt geändert von kralle am Sa 19. Mär 2016, 05:59, insgesamt 1-mal geändert.
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: OnShow für TFrame oder Alternative

Beitrag von Marsmännchen »

Hi,

nur zum besseren Verständnis: Wenn der Frame (bzw. die Form, in der er liegt?) angezeigt wird, dann sollen Komponenten, die in diesem Frame sind, auf die Variable in einem Datenmodul reagieren, ja? Kannst du denn nicht das OnShow-Event der Form benutzen, um dann den Frame mit den Daten des Datenmoduls zu pimpen? Im Sinne von: Wenn die Form angezeigt wird, dann check die Daten des Datenmoduls und dann setze die entsprechenden Eigenschaften des Frames? Die Steuerung würde also über die Mutterkomponente des Frames erfolgen. Oder muss der Frame das partout selber regeln?
Ich mag Pascal...

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

Re: OnShow für TFrame oder Alternative

Beitrag von Warf »

Nicht getestet aber so sollte es gehen:

Code: Alles auswählen

 
  TFrame1 = class(TFrame)
  private
    { private declarations }
  protected
    procedure SetVisible(Value: Boolean); override;
  public
    { public declarations }
  end;
 
implementation
 
{$R *.lfm}
 
    procedure TFrame1.SetVisible(Value: Boolean);
    begin
      if not Visible and Value then
      begin
       // OnShow
 
      end;
      inherited;
    end;   
Dabei überlädst du einfach die Methode die Aufgerufen wird sobald der Visible Wert von dem Frame verändert wird.
Marsmännchen hat geschrieben:Hi,

nur zum besseren Verständnis: Wenn der Frame (bzw. die Form, in der er liegt?) angezeigt wird, dann sollen Komponenten, die in diesem Frame sind, auf die Variable in einem Datenmodul reagieren, ja? Kannst du denn nicht das OnShow-Event der Form benutzen, um dann den Frame mit den Daten des Datenmoduls zu pimpen? Im Sinne von: Wenn die Form angezeigt wird, dann check die Daten des Datenmoduls und dann setze die entsprechenden Eigenschaften des Frames? Die Steuerung würde also über die Mutterkomponente des Frames erfolgen. Oder muss der Frame das partout selber regeln?
Ich persönlich finde es besser Frames komplett autonom zu bauen, sodass man sie mehrfach verwenden kann (also eigene Komponenten mit Designer). Und ich persönlich möchte nur so wenig wie möglich auf das Vaterobjekt zurückgreifen wollen

Soner
Beiträge: 756
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: OnShow für TFrame oder Alternative

Beitrag von Soner »

Wenn du das für Ersatz von OnCreate suchst, dann kannst du AfterConstruction verwenden. Ich habe deinen anderen Beitrag mit OnCreate gelesen, Constructor-Überschreiben bringt nicht viel, weil die Objekte noch nicht erstellt bzw. geladen sind.
Bei TForm wird auch in AfterConstruction das OnCreate-Ereignis aufgerufen.

Code: Alles auswählen

 
  TFrame1 = class(TFrame)
  public
    procedure AfterConstruction; override;
  end;
 

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: OnShow für TFrame oder Alternative

Beitrag von kralle »

Moin,
Marsmännchen hat geschrieben:Hi,
nur zum besseren Verständnis: Wenn der Frame (bzw. die Form, in der er liegt?) angezeigt wird, dann sollen Komponenten, die in diesem Frame sind, auf die Variable in einem Datenmodul reagieren, ja?
Ja, nur die Frames liegen auf dem Formular auf einzelnen Seiten eines TTabSheet.
Marsmännchen hat geschrieben:
Kannst du denn nicht das OnShow-Event der Form benutzen, um dann den Frame mit den Daten des Datenmoduls zu pimpen? Im Sinne von: Wenn die Form angezeigt wird, dann check die Daten des Datenmoduls und dann setze die entsprechenden Eigenschaften des Frames? Die Steuerung würde also über die Mutterkomponente des Frames erfolgen.
Wie ich schon schrieb, weiß ich das dieser Weg möglich ist.
Marsmännchen hat geschrieben:
Oder muss der Frame das partout selber regeln?
Ich möchte soviel wie möglich durch die einzelnen Frames erledigen lassen.

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: OnShow für TFrame oder Alternative

Beitrag von kralle »

Hallo,
Warf hat geschrieben:Nicht getestet aber so sollte es gehen:

Code: Alles auswählen

 
  TFrame1 = class(TFrame)
  private
    { private declarations }
  protected
    procedure SetVisible(Value: Boolean); override;
  public
    { public declarations }
  end;
 
implementation
 
{$R *.lfm}
 
    procedure TFrame1.SetVisible(Value: Boolean);
    begin
      if not Visible and Value then
      begin
       // OnShow
 
      end;
      inherited;
    end;   
Dabei überlädst du einfach die Methode die Aufgerufen wird sobald der Visible Wert von dem Frame verändert wird.
Funktioniert hier nicht.
Warf hat geschrieben: Ich persönlich finde es besser Frames komplett autonom zu bauen, sodass man sie mehrfach verwenden kann (also eigene Komponenten mit Designer).
Soweit das ich eigene Komponenten bauen kann bin ich leider noch nicht.
Warf hat geschrieben: Und ich persönlich möchte nur so wenig wie möglich auf das Vaterobjekt zurückgreifen wollen
Das will ich auch nicht.

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: OnShow für TFrame oder Alternative

Beitrag von kralle »

Moin,

wie ich jetzt feststellen konnte, komme ich mit dem "OnEnter"-Ereignis des Frames (so wie es im Moment aussieht), auch ans Ziel.

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

Antworten