AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Benötige Hilfe beim Entwickeln einer Komponente

Benötige Hilfe beim Entwickeln einer Komponente

Ein Thema von torud · begonnen am 29. Aug 2007 · letzter Beitrag vom 17. Jul 2013
Antwort Antwort
Seite 1 von 13  1 2311     Letzte » 
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#1

Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 07:11
Hallo Wissende,

ich möchte/muss eine eigene Komponente entwickeln, die im Prinzip wie ein Panel aufgebaut ist, nur etwas anders aussieht und etwas mehr zu bieten hat. Dazu möchte/muss ich wohl nun erstmalig eine eigene Komponente entwickeln. Das einzige Tutorial was bisher finden konnte, war hier zu finden. http://www.dsdt.info/tutorials/kompentwickeln/?page=1 Ich finde, dass es dort eingermaßen gut erläutert wurde und suche hier keinen, der mir die komplette Arbeit abnimmt, sondern nur hin und wieder jemand, der mir zeigt, wo ich wie was zu tun habe, damit es klappen kann.

Als Add-On benötige ich folgendes.
einen Border mit abgerundeten Ecken
Hintergrund einfarbig oder als Gradient horizontal, vertikal oder diagonal
Aufname eine Bildes mit den abgerundeten Ecken als Rahmen
ODER
Aufnahme, Anzeige von formtaierten Text (es wird beides NIE gleichzeitig benötigt)

Da ich das Tutorial gelesen aber nicht alles verstanden habe und auch hier im Forum schon etwas gesucht und gelesen habe, bin ich auf den Dreh gekommen, dass ich die neue Komponente von TCustomControl ableiten müsste. Folgendes habe ich derzeit erstellt, aber leider funktioniert so gut wie nichts. Warum weiss ich leider nicht.

Delphi-Quellcode:
unit myPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Graphics;

type
  TbdStyle = (bdSolid, bdDashed, bdClear, bdDotted);
  TGdDirection = (gdHorizontal, gdVertical, gdDiagonal);

type
  TmyPanel = class(TCustomControl)

  private
    FBgColorFrom : TColor;
    FBgColorTo : TColor;
    FPaintGradient : Boolean;
    FGradientDirection : TGdDirection;
    FBorderColor:TColor;
    FBorderStyle:TbdStyle;
    FBorderWidth:integer;
    FRoundEdges:boolean;
    FCornerWidth:integer;
    procedure SetBGColor(Value: TColor);
    { Private-Deklarationen }

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }

  published
    property BgColorFrom : TColor read FBgColorFrom write FBgColorFrom;
    property BgColorTo : TColor read FBgColorTo write FBgColorTo;
    property PaintGradient : boolean read FPaintGradient write FPaintGradient;
    property GradientDirection : TGdDirection read FGradientDirection write FGradientDirection;
    property BorderColor : TColor read FBorderColor write FBorderColor;
    property BorderStyle : TbdStyle read FBorderStyle write FBorderStyle;
    property BorderWidth : integer read FBorderWidth write FBorderWidth;
    property RoundEdges : boolean read FRoundEdges write FRoundEdges;
    property CornerWidth : integer read FCornerWidth write FCornerWidth;
    { Published-Deklarationen }

  end;

procedure Register;
  
implementation

procedure Register;
begin
  RegisterComponents('Beispiel', [TmyPanel]);
end;

constructor TmyPanel.Create(AOwner: TComponent);
begin
  //Canvas := TCanvas.Create;
  inherited Create(AOwner);
end;

destructor TmyPanel.Destroy;
begin
  inherited;
  Canvas.Free;
end;

procedure TmyPanel.SetBGColor(Value: TColor);
var
  Rect : TRect;
  notUsed : HWND;
begin
  Rect := GetClientRect;
  Canvas.Handle := GetDeviceContext(notUsed);
  if ColorToRGB(Value) > -1 then
  begin
    Canvas.Brush.Color := Value;
    Canvas.FillRect(Rect);
    FBGColorFrom := Value;
    FBgColorTo := Value;
  end;
  Canvas.Refresh;
end;

end.
Also wie Ihr sehen könnt, habe ich die ersten Schritte getan. Nun frage ich mich aber, wann und wo ich endlich was mit den ganzen Eigenschaften etwas anfangen kann!? Also so wie ich es sehe, müsste ich doch OnPaint irgendwo und irgendwie überschreiben und dann dort die Eigenschaften einfach nur auswerten.

Könnte mir bitte jemand mitteilen, wo und wie ich das realisieren muss? Also nur den Code, den ich benötige, damit OnPaint zur DesignTime und zur Laufzeit aufgerufen wird. Den Code werde ich dann selbste einpflegen, so weit und so gut es geht und hier wieder vorstellen....

Es könnte sein, dass in dem bisherigen Code schon ein Fehler ist, da mir jedes mal, nach dem Testen der Komponente mein Delphi abschmiert. SetBgColor kann, glaube ich raus. Das ist noch aus einem Beispiel eines anderen Users hier im Forum.
Danke
Tom
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 07:37
Ich habe die Komponente jetzt dahingehend geändert, dass ich SetColor entfernt habe und OnPaint eingefügt habe. Leider bringt das gar nix, da die procedure scheinbar NIE aufgerufen oder ausgelöst wird. Warum nur?

Delphi-Quellcode:
unit myPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Graphics;

type
  TbdStyle = (bdSolid, bdDashed, bdClear, bdDotted);
  TGdDirection = (gdHorizontal, gdVertical, gdDiagonal);

type
  TmyPanel = class(TCustomControl)

  private
    Canvas : TCanvas;
    FBgColorFrom : TColor;
    FBgColorTo : TColor;
    FPaintGradient : Boolean;
    FGradientDirection : TGdDirection;
    FBorderColor:TColor;
    FBorderStyle:TbdStyle;
    FBorderWidth:integer;
    FRoundEdges:boolean;
    FCornerWidth:integer;
    { Private-Deklarationen }

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }

  published
    property BgColorFrom : TColor read FBgColorFrom write FBgColorFrom;
    property BgColorTo : TColor read FBgColorTo write FBgColorTo;
    property PaintGradient : boolean read FPaintGradient write FPaintGradient;
    property GradientDirection : TGdDirection read FGradientDirection write FGradientDirection;
    property BorderColor : TColor read FBorderColor write FBorderColor;
    property BorderStyle : TbdStyle read FBorderStyle write FBorderStyle;
    property BorderWidth : integer read FBorderWidth write FBorderWidth;
    property RoundEdges : boolean read FRoundEdges write FRoundEdges;
    property CornerWidth : integer read FCornerWidth write FCornerWidth;
    procedure OnPaint;
    { Published-Deklarationen }

  end;

procedure Register;
  
implementation

procedure Register;
begin
  RegisterComponents('Standard', [TmyPanel]);
end;

constructor TmyPanel.Create(AOwner: TComponent);
begin
  Canvas := TCanvas.Create;
  inherited Create(AOwner);
end;

destructor TmyPanel.Destroy;
begin
  inherited;
  Canvas.Free;
end;

procedure TmyPanel.OnPaint;
begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
    Canvas.Refresh;
end;

end.
Danke
Tom
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 08:48
Schnipps:

Delphi-Quellcode:
   :
   Procedure Paint;override;
   :
   :
   procedure TMyPanel.Paint;override;
   begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
    Canvas.Refresh;
   end;
Also im Prinzip aus onPaint, paint machen.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 08:58
als ergänzung zu Ghostwalker:

da du von tcustomcontrol ableitest musst du in dieser komponente oder deren vorfahren gucken wo und wie das onpaint event deklariert ist.

du musst dann genau die gleiche deklaration der methode in deiner komponente dann per override kennzeichnen und die methode deinen wünschen entsprechend implementieren
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 09:01
Unbekannte Anweisung 'override' erhalte ich vom Debugger als Meldung.

In diese Zeile springt der Kollege:

procedure TmyPanel.Paint; override; in published habe ich

procedure Paint; override; Also wo liegt nun das Problem???
Danke
Tom
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 09:02
Nein, Paint ist eine Virtuelle Methode, die du überschreiben kannst. Paint wird jedesmal aufgerufen, wenn dein Control neu gezeichnet wird. Somit ist das die ideale Stelle um eigene Ausgaben (zeichnen, Text) vorzunehmen.

Der Ansatz ist richtig!

Gruß oki
42
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 09:03
Zitat von M. Hassmann:
als ergänzung zu Ghostwalker:

da du von tcustomcontrol ableitest musst du in dieser komponente oder deren vorfahren gucken wo und wie das onpaint event deklariert ist.
Vielleicht wäre es einfach von einem anderen Vorfahren abzuleiten? Ich habe aber immer wieder gelesen, dass es günstiger und einfacher sein soll von TCustomcontrol abzuleiten. Warum auch immer!?
Danke
Tom
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 09:06
grrr* roter Kasten!

Die Procedure Paint wird nur in der Klassendeklaration mit override deklariert. Im Implementation-Teil nicht.
Delphi-Quellcode:
:
   Procedure Paint;override;
   :
   :
   procedure TMyPanel.Paint;override;
   begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
   end;
und dann kein refresh, denn es wird ja schon gezeichnet. Sonst wird es rekursiv!!!

Gruß oki

[edit] Mann schon wieder roter Kasten. ich bin heut zu langsam! [/edit]
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 09:06
TCustomControl ist ok.
42
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#10

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 29. Aug 2007, 09:13
Ok, ich habe es nun so wie von Dir empfohlen geändert, aber jetzt ist leider kein Zeichnen auf Leinwand mehr erlaubt...Scheinbar doch nicht alles so einfach, wie erwartet. Ein Buch ist bestellt, aber trotzdem will ich nicht warten hier nochmal der gesamte Code:

Delphi-Quellcode:
unit myPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Graphics;

type
  TbdStyle = (bdSolid, bdDashed, bdClear, bdDotted);
  TGdDirection = (gdHorizontal, gdVertical, gdDiagonal);

type
  TmyPanel = class(TCustomControl)

  private
    Canvas : TCanvas;
    FBgColorFrom : TColor;
    FBgColorTo : TColor;
    FPaintGradient : Boolean;
    FGradientDirection : TGdDirection;
    FBorderColor:TColor;
    FBorderStyle:TbdStyle;
    FBorderWidth:integer;
    FRoundEdges:boolean;
    FCornerWidth:integer;
    { Private-Deklarationen }

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }

  published
    property BgColorFrom : TColor read FBgColorFrom write FBgColorFrom;
    property BgColorTo : TColor read FBgColorTo write FBgColorTo;
    property PaintGradient : boolean read FPaintGradient write FPaintGradient;
    property GradientDirection : TGdDirection read FGradientDirection write FGradientDirection;
    property BorderColor : TColor read FBorderColor write FBorderColor;
    property BorderStyle : TbdStyle read FBorderStyle write FBorderStyle;
    property BorderWidth : integer read FBorderWidth write FBorderWidth;
    property RoundEdges : boolean read FRoundEdges write FRoundEdges;
    property CornerWidth : integer read FCornerWidth write FCornerWidth;
    procedure Paint; override;
    { Published-Deklarationen }

  end;

procedure Register;
  
implementation

procedure Register;
begin
  RegisterComponents('Standard', [TmyPanel]);
end;

constructor TmyPanel.Create(AOwner: TComponent);
begin
  Canvas := TCanvas.Create;
  inherited Create(AOwner);
end;

destructor TmyPanel.Destroy;
begin
  inherited;
  Canvas.Free;
end;

procedure TmyPanel.Paint;
begin
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.TextOut(1,1,'Test');
end;

end.
Danke
Tom
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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