![]() |
Grafische Komponente in Delphi entwickeln
Hi!
Für eine Facharbeit soll ich eine Pendel-Komponente entwickeln. Wie ich ein Pendel simuliere weiß ich, nur bin ich mir nicht genau sicher, von welcher Klasse ich meine neue Komponente ableiten soll (TCustomControl, TWinControl, TGraphicControl) und wie ich die Basis für eine Canvas schaffe. Meine Denkansätze gingen in die Richtung, dass ich im Konstruktor der Komponente eine PaintBox erstelle, deren Größe der Größe der Komponente anpasse und der PaintBox anschließend ein OnPaint-Ereignis zuweise. Wenn ich allerdings versuche auf die Canvas der PaintBox zu zeichnen, bekomme ich folgende Fehlermeldung: "Element '' hat kein übergeordnetes Fenster" :gruebel: Danke für alle Tipps :wink: |
Re: Grafische Komponente in Delphi entwickeln
Hi Wheelie,
Also wenn die Komponente nur etwas darstellen soll reicht TGraphicControl. Ansonsten leite die Komponente von TCustomControl ab. Beide besitzen eine Paint-Methode, die du einfach überschreibst. Die Paintbox wird NICHT benötigt. Im Übrigen rührt die Fehlermeldung daher, dass du, :?: wahrscheinlich :?: , folgenden Code vergessen hast:
Delphi-Quellcode:
Noch einige Tipps:
Paintbox.Parent := PendelKomponente;
* Ich nehme an, dass das Pendel animiert sein soll --> Benutz dafür Threads, nicht Timer. * Benutz ein TBitmap im Speicher für die Zeichenvorgänge und kopiere das Bitmap auf den Canvas (Paint-Methode). |
Re: Grafische Komponente in Delphi entwickeln
Du solltest deine Pendelkomponente von TGraphicControl ableiten
und die Procedure Paint überschreiben. Sonst hast du immer das Problem, dass du nicht steuern kannst, auf welchem Parent dein Control zu liegen kommt. |
Re: Grafische Komponente in Delphi entwickeln
für die graphichen Komponenten die ich bisher gebastelt hab, hab ich entweder TCustomControl, oder TWinControl genommen. Wobei du dir auch gedanken machen solltest ob die Componente ein Handle haben soll oder nicht
Wenn deine Komponente teilweise transparent sein soll würde ich empfehlen einen Vorfahren zu nehmen der kein Handle hat. Also TGraphicControl (wobei ich da meist TControl nehme). Wenn die Componente ein handle haben soll dann wäre TCustomControl wieder eine gescheite ausgangsbasis... |
Re: Grafische Komponente in Delphi entwickeln
Danke erstmal für alle Antworten. Also ich werde die Kompo von TGraphicControl ableiten. Ich weiß nur noch nicht, wie ich die Prozedur OnPaint überschreiben kann. Eine PaintBox will ich nun auch nicht mehr verwenden, sondern gleich auf die Canvas zeichnen. Aber bei jedem Versuch auf die Canvas zuzugreifen, bekomme ich die Fehlermeldung "Element '' hat kein übergeordnetes Fenster".
Mal ein ganz einfaches Beispiel, bei dem bei mir prompt eine Fehlermeldung kommt:
Delphi-Quellcode:
unit TPhPendel;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TPendel = class(TGraphicControl) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TPendel]); end; constructor TPendel.Create; begin inherited Create(AOwner); Canvas.Rectangle(5, 5, 10, 10); end; end. |
Re: Grafische Komponente in Delphi entwickeln
Man sollte hier ein TGraphicControl eindeutig einem TWinControl vorziehen.
Ein TWinControl hat ein eigenenes Fenster und damit ist die Komponente nicht mehr transparent zu bekommen. |
Re: Grafische Komponente in Delphi entwickeln
der Fehler liegt bei
Delphi-Quellcode:
Zum Zeitpunkt des Create hat die Komponente noch kein Parent und somit auch keine Canvas und somit kommt ein fehler. Man sollte in jedem fall soetwas in der Paint-Methode machen um sicherzustellen das eine Canvas vorhanden ist denn Paint wird nur aufgerufen wenn auch eine Canvas vorhanden ist
Canvas.Rectangle(5, 5, 10, 10);
Delphi-Quellcode:
TPendel = class(TGraphicControl)
private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; procedure Paint; override; published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [TPendel]); end; constructor TPendel.Create; begin inherited Create(AOwner); end; procedure TPendel.Paint; begin //eventuell noch "inherited Paint" wenn du die ursprüngliche Paintmehtode ausführen willst Canvas.Rectangle(5, 5, 10, 10); end; Warum bist du eigentlich von TWinControl auf TGraphiccontrol umgestiegen? TWinControl hat ein Handle, TGraphiccontrol nicht und somit zeichnet sich deine Komponente immer auf das Parentcanvas... Wenn deine Componente auch einen Button überdecken können soll würde ich von TCustomControl ableiten, dann hast du auch ein Handle... |
Re: Grafische Komponente in Delphi entwickeln
Ich glaube so ein Pendel soll spaeter mit anderen Komponenten interagieren koennen.
Als TWinControl sitzt es aber in einem eigenen Fenster fest und kann nicht transparent sein. |
Re: Grafische Komponente in Delphi entwickeln
Hmm, das kommt jetzt eben drauf an was mit dem Pendel alles geplant ist. Wenn man dem Pendel ein Hintergrundbild noch zuweist dann bräuchte man es auch nicht transparent.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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