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/)
-   -   Delphi Ableitung von TPanel - wo/wann ist ClientWidth bekannt? (https://www.delphipraxis.net/148706-ableitung-von-tpanel-wo-wann-ist-clientwidth-bekannt.html)

wicht 6. Mär 2010 22:43


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:

DeddyH 6. Mär 2010 22:51

Re: Ableitung von TPanel - wo/wann ist ClientWidth bekannt?
 
Du könntest versuchen, Loaded zu überschreiben.

wicht 6. Mär 2010 23:03

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?

DeddyH 6. Mär 2010 23:07

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): TComponent.Loaded. Möglicherweise ist das nicht der richtige Zeitpunkt, aber aufgerufen wird es bestimmt.

[edit] Ich revidiere meine Aussage, das gilt anscheinend nicht für Komponenten, die zur Runtime erzeugt werden. [/edit]

wicht 6. Mär 2010 23:13

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

DeddyH 6. Mär 2010 23:17

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.

wicht 6. Mär 2010 23:21

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:

DeddyH 6. Mär 2010 23:23

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