![]() |
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:
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.
private
constructor Create(AOwner: TComponent); override; [...] constructor Tirgendetwas.Create(AOwner: TComponent); begin inherited; dtpAnfang.Date:=Now; dtpEnde.Date:=Now; end; 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! |
AW: OnShow von Frames selbst erstellen
Delphi-Quellcode:
So sollte es gehen.
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; |
AW: OnShow von Frames selbst erstellen
Du kannst
Delphi-Quellcode:
überschreiben oder auf CM_VISIBLECHANGED reagieren.
procedure VisibleChanging; override;
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? |
AW: OnShow von Frames selbst erstellen
Zitat:
Delphi-Quellcode:
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.
procedure Tirgendetwas.VisibleChanging;
begin inherited; lbledt_Begriff.SetFocus; end; |
AW: OnShow von Frames selbst erstellen
Zitat:
Delphi-Quellcode:
, denn
procedure Show;
Delphi-Quellcode:
gibt's erst in TCustomForm, TCustomFrame ist aber von TScrollingWinControl bzw. TWinControl geerbt, welche eben nur
procedure DoShow;
Delphi-Quellcode:
kennen, und die ist weder virtual noch dynamic...
Show;
|
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:
Ganz simple, ganz einfach und klappt! :D
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz