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/)
-   -   TCustomControl - Fehlermeldung beim Aufurf von Canvas (https://www.delphipraxis.net/191819-tcustomcontrol-fehlermeldung-beim-aufurf-von-canvas.html)

Rabenrecht 23. Feb 2017 09:51


TCustomControl - Fehlermeldung beim Aufurf von Canvas
 
Ich habe eine von TCustomControl abgeleitete Komponente und möchte die Canvas Property nutzen, um visuelle Anpassungen vorzunehmen:

Delphi-Quellcode:
type
  myComp = class(TPanel)
  private
    procedure DrawStuff;
  end;

[...]

procedure myComp.DrawStuff;
begin
  Canvas.TextOut(Left,Top,'Hello World');
end;

[...]

procedure TForm1.FormCreate(Sender: TObject);
begin
  testComp := myComp.Create(self);
  testComp.Parent := self;
end;
Leider erhalte ich beim Ausführen die Fehlermeldung "Element 'Name der Komponente' hat kein übergeordnetes Fenster."
Beim Debuggen wird die Fehlermeldung beim Canvas.TextOut ausgespukt. (Jede beliebige andere Funktion von Canvas führt zu diesem Fehler).

Was bedeutet das und wie lässt sich das Problem beheben?

stahli 23. Feb 2017 10:25

AW: TCustomControl - Fehlermeldung beim Aufurf von Canvas
 
Wird DrawStuff schon im Contructor von myComp aufgerufen?

Das wäre dann zu früh, da der Parent noch nicht zugewiesen ist.
Windows kann dann nicht ermitteln, in welchem Kontext die Komponente gezeichnet werden soll.

Es gab da m.E. eine Funktion, die prüft, ob ein gültiger Kontext vorliegt (weiß aber nicht mehr, wie die hieß).

Die Lösung wäre, erst nach dem Create zu zeichnen.


Nachtrag: Die Klasse sollte entsprechend der Konventionen immer im "T" benannt werden (hast Du aber sicher nur hier in dem Beispiel vergessen...)

HolgerX 23. Feb 2017 17:37

AW: TCustomControl - Fehlermeldung beim Aufurf von Canvas
 
Hmm..

wenn Du etwas im Kontext des CustomControl zeichnen wills,

dann musst Du

Delphi-Quellcode:
protected
    procedure Paint; override;

überschreiben und dann (nach dem inherited) deine DrawStuff reinpacken.

Denn dann wird sich darum gekümmert, das bei jedem Neuzeichen auch deine Zeichenbefehle benutzt werden..


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 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