![]() |
Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Hallo Forum.
Kurze Frage. Ich habe eine Ableitung von TPanel gebaut. Im Konstruktor werden verschiedene Controls erzeugt, die in diesem Panel sichtbar sein sollen. Genaugenommen links eine Ableitung von TVirtualStringTree und rechts eine Ableitung von TPanel. Das funktioniert auch alles gut - nur möchte ich, wenn die Form da ist, die Child-Controls des Panels anordnen - zum Beispiel für den Tree die Breite setzen, weil er auf Align=alLeft ist - das Panel des Panels hat alClient. Die Breite für den Tree kann ich aber erst setzen, wenn das Fenster da ist und ClientWidth bekannt ist. Wenn ich in besagtem Panel auf ClientWidth zugreife (im Konstruktor) bekomme ich immer eine Exception. Das ist vielleicht auch verständlich, nur was muss ich überschreiben, was zu dem Zeitpunkt ausgeführt wird, wo ClientWidth bekannt ist? Ich könnte das im Resize() machen, aber ich will es ja nur einmal aufrufen. Klar könnte ich mir noch einen Merker setzen, so dass mein Code im Resize nur einmal aufgerufen wird, um die Controls beim Anzeigen der Form auszurichten, aber gibt es da auch eine schönere Methode? Vielen Dank im Vorraus und noch einen schönen Samstag Abend .. :stupid: |
Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Du könntest versuchen, Loaded zu überschreiben.
|
Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Danke für die Antwort!
Ich habe es direkt probiert, jedoch wird Loaded nicht aufgerufen.. :cry: Wenn ich mir die VCL-Sourcen so anschaue, sieht es für mich aus, als würde Loaded im Endeffekt nur durch InitInheritedComponent() aufgerufen werden, welches nur von TDataModule verwendet wird? Hat eventuell jemand noch eine Idee? |
Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Sry, aber das mag ich nicht glauben (zumal ich das selbst schon ein paar mal so gemacht habe):
![]() [edit] Ich revidiere meine Aussage, das gilt anscheinend nicht für Komponenten, die zur Runtime erzeugt werden. [/edit] |
Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Es deutet vieles darauf hin, dass du Recht hast. Ich glaube, ich habe ein anderes Problem...
Hier mein kurzer Test-Quelltext, in dem ShowMessage() nicht aufgerufen wird:
Delphi-Quellcode:
Mache ich irgendetwas anderes falsch? Ich habe das Gefühl, dass die Lösung sehr einfach ist, und mir das am Ende fast peinlich sein könnte.. :wall: ..
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TMyPanel = class(TPanel) protected procedure Loaded; override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var P: TMyPanel; begin P := TMyPanel.Create(Self); P.Parent := Self; P.Left := 10; P.Top := 10; P.Width := 100; P.Top := 100; P.Caption := 'Mein Panel!'; P.Show; end; { TMyPanel } procedure TMyPanel.Loaded; begin inherited; ShowMessage('X'); end; end. |
Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Siehe mein Edit oben :oops:. Dann fällt mir auf die Schnelle nur eine schmutzige Lösung ein, nämlich ein privates Flag, das im Konstruktor auf true gesetzt, im OnResize dann ausgewertet und auf false gestellt wird. Nicht gerade sonderlich elegant, sollte aber funktionieren.
|
Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Okay, vielen Dank :)
Das Problem hatte ich schon öfters, und habe es dann immer "dreckig" gelöst, wie du es jetzt auch vorgeschlagen hast, aber heute Abend hat es mich stärker genervt als sonst und ich musste nachfragen... Naja, wenn die dreckige Lösung die einzige sein sollte.. kann sie ja nicht so dreckig sein :-D Schönes Wochenende noch :cheers: |
Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
Dir auch (kann ja nicht immer alles auf Anhieb klappen) :cheers:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 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