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 Grafische Komponente in Delphi entwickeln (https://www.delphipraxis.net/22920-grafische-komponente-delphi-entwickeln.html)

Wheelie 26. Mai 2004 11:53


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:

AlphaBug 26. Mai 2004 12:35

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:
Paintbox.Parent := PendelKomponente;
Noch einige Tipps:
* 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).

shmia 26. Mai 2004 12:37

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.

SirThornberry 26. Mai 2004 12:58

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

Wheelie 25. Jun 2004 22:09

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.

Robert Marquardt 26. Jun 2004 05:55

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.

SirThornberry 26. Jun 2004 07:53

Re: Grafische Komponente in Delphi entwickeln
 
der Fehler liegt bei
Delphi-Quellcode:
Canvas.Rectangle(5, 5, 10, 10);
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
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...

Robert Marquardt 26. Jun 2004 18:02

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.

SirThornberry 26. Jun 2004 18:09

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 07:15 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