Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   OnShow von Frames selbst erstellen (https://www.delphipraxis.net/164031-onshow-von-frames-selbst-erstellen.html)

Maya 26. Okt 2011 13:00

OnShow von Frames selbst erstellen
 
Hallo ihr Lieben,

das Mini-Azubi braucht mal wieder etwas Hilfe.
Ich arbeite ja zur Zeit mit Frames und läuft, trotz kleiner Stolpersteine ganz gut. Eine Lösung für das fehlende OnCreate-Ereignis habe ich schon gefunden, aber nun fall ich wgn. dem fehlenden OnShow auf die Nase.

Ich möchte das Programm ja auch benutzerfreundlich gestalten, deswegen soll der Cursor beim Aufruf des Frames direkt im entsprechenden Edit-Feld blinken. Also dachte ich mir, packst du das ebenfalls in dein selbstgebasteltes OnCreate herein.

Delphi-Quellcode:
private
   constructor Create(AOwner: TComponent); override;

[...]
constructor Tirgendetwas.Create(AOwner: TComponent);
begin
   inherited;
   dtpAnfang.Date:=Now;
   dtpEnde.Date:=Now;
end;
Das klappt super, aber sobald ich "lbledt_Begriff.SetFocus" einbaue, sagt Delphi-Lein mir folgendes beim Aufruf des entsprechenden Frames: "Element 'lbledt_Begriff' hat kein übergeordnetes Fenster". Da dachte ich mir, das könnte daran liegen, dass bei dem Constructor die labeled Edits noch nicht erezeugt wurden und deswegen damit nichts angefangen werden kann. Aus dem Grund war mein Lösungsansatz, ich bastel mir selber ein OnShow-Ereignis.
Frage ist bloß: wie? Gibt es ein Tutorial oder einen Tipp, den ihr mir geben könnt. Ich möchte ja nicht, dass mir alles vorgekaut wird, aber ein Schubser ist schon notwendig. -.-

Dankefein!

webcss 26. Okt 2011 13:10

AW: OnShow von Frames selbst erstellen
 
Delphi-Quellcode:
interface

TMyFrame = class(TFrame)
private
  FOnShow: TNotifyEvent;
protected
  procedure DoShow;
published
  property OnShow: TNotifyEvent read FOnShow write FOnShow;
end;

implementation

procedure TMyFrame.DoShow;
begin
  inherited DoShow;
  if assigned(FOnShow) then
    FOnShow(self);
end;
So sollte es gehen.

himitsu 26. Okt 2011 13:17

AW: OnShow von Frames selbst erstellen
 
Du kannst
Delphi-Quellcode:
procedure VisibleChanging; override;
überschreiben oder auf CM_VISIBLECHANGED reagieren.


PS: Das hättest du auch selber rausfinden können.
Schauen was der Setter von TFrame.Visible (also hier das TControl.SetVisible) macht, ob sich dieser Setter überschreiben läßt,
oder ob darin ein Event ausgelöst wird, bzw. ob dort etwas Überschreibbares ausgerufen wird.

@webcss: Wenn du DoShow überschreiben willst, dann solltest du es auch als override markieren.

@maya: Der Constructor sollte vermutlich public sein und nicht private?

Maya 26. Okt 2011 13:42

AW: OnShow von Frames selbst erstellen
 
Zitat:

Zitat von himitsu (Beitrag 1132631)
Du kannst
Delphi-Quellcode:
procedure VisibleChanging; override;
überschreiben[..]
@maya: Der Constructor sollte vermutlich public sein und nicht private?

Also es scheint Syntaxfehlerfrei zu sein, aber passieren tut trotzdem nichts.

Delphi-Quellcode:
procedure Tirgendetwas.VisibleChanging;
begin
   inherited;
   lbledt_Begriff.SetFocus;
end;
Jupp, ist public. Hatte es ursprünglich mal im Private, aber da kam ja dann immer ein Hinweis, dass das so nicht wirklich in Ordnung ist.

webcss 26. Okt 2011 14:43

AW: OnShow von Frames selbst erstellen
 
Zitat:

Zitat von himitsu (Beitrag 1132631)
@webcss: Wenn du DoShow überschreiben willst, dann solltest du es auch als override markieren.

Richtig, aber ich meinte auch
Delphi-Quellcode:
procedure Show;
, denn
Delphi-Quellcode:
procedure DoShow;
gibt's erst in TCustomForm, TCustomFrame ist aber von TScrollingWinControl bzw. TWinControl geerbt, welche eben nur
Delphi-Quellcode:
Show;
kennen, und die ist weder virtual noch dynamic...

Maya 25. Jan 2012 06:59

AW: OnShow von Frames selbst erstellen
 
Ich möchte hier mal meine Lösung posten, falls noch jemand das mal braucht. Die Lösungen, die ich hier im Forum fand, halfen mir leider nicht so wirklich.

Delphi-Quellcode:
private
    { Private-Deklarationen }
    procedure CMSHowingChanged(var M: TMessage); message CM_SHOWINGCHANGED;

[...]

procedure TmeinFrame.CMSHowingChanged(var M: TMessage);
begin
  inherited;
  if Showing then
    begin
        //Mache dieses und jenes!
    end;
end;
Ganz simple, ganz einfach und klappt! :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz