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
Thema durchsuchen
Ansicht
Themen-Optionen

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 3 von 13     123 45     Letzte »    
torud

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

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 08:05
Jo das mit dem Align funktioniert super. Ich hatte da den Fehler drin, dass ich das selbst noch als eigene Eigenschaft deklariert hatte, was wohl gar nicht nötig ist.

Habe sogar noch nen Fehler in deinem Code gefunden:

Delphi-Quellcode:
procedure TmyPanel.SetBgColorTo(Value : TColor);
begin
  If Value = FBgColorTo then Exit;
  //FBgColorFrom := Value; //empfohlem by OKI
  FBgColorTo := Value;
  Invalidate;
end;
Habs aber hinbekommen. So lernt man wenigstens was dabei...
Danke
Tom
  Mit Zitat antworten Zitat
oki

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

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 08:21
Richtig,

üblicherweise werden die Eigenschaften protected oder public deklariert und erst für die entsprechende abgeleitete Klasse die als Komponente integriert wird unter published veröffentlicht. Mit der vorhergehenden Deklaration wird somit nur die Sichtbarkeit verändert, aber nicht die Eigenschaft. deklariert man diese neu, so wird die vorherige Eigenschaft überschrieben.

Gruß oki
42
  Mit Zitat antworten Zitat
torud

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

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 08:52
Also jetzt gehts schon mal ganz gut. Sogar mit dem gradient klppts. Was leider noch nicht funktioniert ist der Border.

Kein Ahnung warum, aber er wird NOCHT nicht gezeichnet.

Ich hänge mal nur die Paint an, da dort ja der Border abgehandelt wird.

Delphi-Quellcode:
procedure TmyPanel.Paint;
var
  Rect,TextRect : TRect;
begin
  Rect := GetClientRect;
    Canvas.FillRect(Rect);
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.Pen.Style := BorderStyle;
    Canvas.Pen.Width := BorderWidth;
    Canvas.Pen.Color := BorderColor;
    if PaintGradient then
      DrawGradient(Canvas, BgColorFrom, BgColorTo, Rect, goVertical);
end;
Ich habe schon versucht den Pen nach dem Gradient zu übergeben, aber auch das brachte nichts.
Hm, und wenn das klappt, würde mich noch interessieren, wie ich eventuell die Ecken abgerundet zeichnen lassen kann...
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#24

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 08:56
Ehrlich gesagt sehe ich nicht, wo hier eine Border gezeichnet wird
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
torud

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

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 09:30
Zitat von DeddyH:
Ehrlich gesagt sehe ich nicht, wo hier eine Border gezeichnet wird
Hm, ich hatte mir die TShape angesehen und ging davon aus, dass dies hier dafür zuständig sei nen Boder zu zeichnen:

Delphi-Quellcode:
    Canvas.Pen.Style := BorderStyle;
    Canvas.Pen.Width := BorderWidth;
    Canvas.Pen.Color := BorderColor;
Zumindest klappt das bei einem Shape so. Definiert ist auch alles...
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#26

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 09:45
Mal zum Testen:
Delphi-Quellcode:
procedure TmyPanel.Paint;
var
  Rect,TextRect : TRect;
begin
  Rect := GetClientRect;
    Canvas.FillRect(Rect);
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := FBgColorFrom;
    Canvas.Pen.Style := BorderStyle;
    Canvas.Pen.Width := BorderWidth;
    Canvas.Pen.Color := BorderColor;
    if PaintGradient then
      DrawGradient(Canvas, BgColorFrom, BgColorTo, Rect, goVertical);
    Canvas.MoveTo(0,0);
    Canvas.LineTo(Rect.Right,Rect.Bottom);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
torud

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

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 11:24
Ok, das geht. Ich habe es soweit angepasst, dass ich die Linien vorerst von Links Oben nach unten und nach rechts gezogen habe. Leider wird dabei bisher die Linienstärke noch nicht berücksichtigt. Ich habe mal bei Canvas nachgesehen, aber leider nichts finden können, wie ich die Stiftdicke einstellen kann.

Der Code sieht derzeit nun so aus:

Delphi-Quellcode:
procedure TmyPanel.Paint;
var
  Rect,TextRect : TRect;
begin
  Rect := GetClientRect;
    Canvas.FillRect(Rect);
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := FBgColorFrom;

    Canvas.Pen.Mode := pmCopy;
    Canvas.Pen.Style := BorderStyle;
    Canvas.Pen.Width := BorderWidth;
    Canvas.Pen.Color := BorderColor;
    
    if PaintGradient then
      DrawGradient(Canvas, BgColorFrom, BgColorTo, Rect, goVertical);

    Canvas.MoveTo(0,0);
    Canvas.LineTo(Rect.Left,Rect.Bottom);
    Canvas.MoveTo(0,0);
    Canvas.LineTo(Rect.Right,Rect.Top);
end;
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#28

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 11:28
Zitat:
Canvas.Pen.Width := BorderWidth;
Hier setzt Du doch die Stiftbreite.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
torud

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

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 21:21
Danke für die Antwort.

Damit ich hier nicht nur als NEHMER dastehe, poste ich mal den bisherigen Code für diejenigen, die selbst solch ein Panel wollen, aber es nicht programmieren können. Da kann man sicher auch diverses verbessern, aber dafür, dass es meine erste selbst geschriebene Komponente ist, bin ich ziemlich stolz.

2 Dinge, die ich eigentlich noch einbinden will, brennen mir noch auf den Nägeln.

1. Die Beschriftung für das Panel soll in einem TStrings stehen, damit ich mehr als nur eine Caption oder Text aufnehmen und anzeigen kann.

2. Ich will eigentlich abgerundete Eckten. Hat jemand einen Tipp hierfür parat?

Delphi-Quellcode:
unit myPanel;

interface

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

type
  TbdStyle = (bdNone, bdSolid, bdDashed, bdClear, bdDotted);
  TGdDirection = (gdHorizontal, gdVertical, gdDiagonal);
  TGradientOrientation = (goVertical, goHorizontal);

type
  TPixelRec = packed record
    case Boolean of
      true: (Color: TColor);
      false: (r, g, b, Reserved: Byte);
  end;

type
  TmyPanel = class(TCustomControl)

  private
    FAlign : TAlign;
    FBgColorFrom : TColor;
    FBgColorTo : TColor;
    FPaintGradient : Boolean;
    FGradientDirection : TGdDirection;
    FBorderColor:TColor;
    FBorderStyle:TPenStyle;
    FBorderWidth:integer;
    FRoundEdges:boolean;
    FCornerWidth:integer;
    procedure SetBgColorFrom(Value : TColor);
    procedure SetBgColorTo(Value : TColor);
    procedure SetGradientStatus(Value: Boolean);
    procedure SetBorderWidth(Value: integer);
    procedure SetBorderColor(Value : TColor);

    { Private-Deklarationen }
  protected
  { Protected-Deklarationen }
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }

  published
    //property Align : TAlign read FAlign write FAlign;
    property Align;
    property BgColorFrom : TColor read FBgColorFrom write SetBgColorFrom;
    property BgColorTo : TColor read FBgColorTo write SetBgColorTo;
    property PaintGradient : boolean read FPaintGradient write SetGradientStatus;
    property GradientDirection : TGdDirection read FGradientDirection write FGradientDirection;
    property BorderColor : TColor read FBorderColor write SetBorderColor;
    property BorderStyle : TPenStyle read FBorderStyle write FBorderStyle;
    property BorderWidth : integer read FBorderWidth write SetBorderWidth;
    property RoundEdges : boolean read FRoundEdges write FRoundEdges;
    property CornerWidth : integer read FCornerWidth write FCornerWidth;
    { Published-Deklarationen }

  end;

procedure Register;

implementation

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

constructor TmyPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Align := alNone;
  BgColorFrom := clWhite;
  BgColorTo := clSilver;
  BorderColor := clGray;
  BorderStyle := psSolid;
  BorderWidth := 2;
end;

destructor TmyPanel.Destroy;
begin
  inherited;
end;

procedure TmyPanel.SetGradientStatus(Value:Boolean);
begin
  If Value = FPaintGradient then Exit; // wenn gleicher Status nichts tun
  FPaintGradient := Value; // Status abspeichern
  Invalidate; // Control neu zeichnen
end;

procedure TmyPanel.SetBorderWidth(Value:integer);
begin
  If Value = FBorderWidth then Exit; // wenn gleicher Status nichts tun
  FBorderWidth := Value; // Status abspeichern
  Invalidate; // Control neu zeichnen
end;

procedure TmyPanel.SetBorderColor(Value : TColor); // Settermethode
begin
  If Value = FBorderColor then Exit; // wenn gleiche Farbe nichts tun
  FBorderColor := Value; // Farbe abspeichern
  Invalidate; // Control neu zeichnen
end;

procedure TmyPanel.SetBgColorFrom(Value : TColor); // Settermethode
begin
  If Value = FBgColorFrom then Exit; // wenn gleiche Farbe nichts tun
  FBgColorFrom := Value; // Farbe abspeichern
  Invalidate; // Control neu zeichnen
end;

procedure TmyPanel.SetBgColorTo(Value : TColor);
begin
  If Value = FBgColorTo then Exit;
  FBgColorTo := Value;
  Invalidate;
end;

procedure DrawGradient(const Canvas: TCanvas; Color1, Color2: TColor;
                       ARect: TRect; GradientOrientation: TGradientOrientation);
var
  c1, c2, c: TPixelRec; //for easy access to RGB values as well as TColor value
  x, y: Integer; //current pixel position to be set
  OldPenWidth: Integer; //Save old settings to restore them properly
  OldPenStyle: TPenStyle;//see above
begin
  c1.Color := ColorToRGB(Color1); //convert system colors to RGB values
  c2.Color := ColorToRGB(Color2); //if neccessary
  OldPenWidth := Canvas.Pen.Width; //get old settings
  OldPenStyle := Canvas.Pen.Style;
  Canvas.Pen.Width:=1; //ensure correct pen settings
  Canvas.Pen.Style:=psInsideFrame;

  case GradientOrientation of
    goVertical:
    begin
      for y := 0 to ARect.Bottom - ARect.Top do
      begin
        c.r := Round(c1.r + (c2.r - c1.r) * y / (ARect.Bottom - ARect.Top));
        c.g := Round(c1.g + (c2.g - c1.g) * y / (ARect.Bottom - ARect.Top));
        c.b := Round(c1.b + (c2.b - c1.b) * y / (ARect.Bottom - ARect.Top));
        Canvas.Brush.Color := c.Color;
        Canvas.FillRect(Classes.Rect(ARect.Left, ARect.Top + y,
                                     ARect.Right, ARect.Top + y + 1));
      end;
    end;
    goHorizontal:
    begin
      for x := 0 to ARect.Right - ARect.Left do
      begin
        c.r := Round(c1.r + (c2.r - c1.r) * x / (ARect.Right - ARect.Left));
        c.g := Round(c1.g + (c2.g - c1.g) * x / (ARect.Right - ARect.Left));
        c.b := Round(c1.b + (c2.b - c1.b) * x / (ARect.Right - ARect.Left));
        Canvas.Brush.Color := c.Color;
        Canvas.FillRect(Rect(ARect.Left + x, ARect.Top,
                             ARect.Left + x + 1, ARect.Bottom));
      end;
    end;
  end;
  Canvas.Pen.Width := OldPenWidth; //restore old settings
  Canvas.Pen.Style := OldPenStyle;
end;

procedure TmyPanel.Paint;
var
  Rect,TextRect : TRect;
begin
  Rect := GetClientRect;
    Canvas.FillRect(Rect);
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := FBgColorFrom;

    Canvas.Pen.Mode := pmCopy;
    Canvas.Pen.Style := BorderStyle;
    Canvas.Pen.Width := BorderWidth;
    Canvas.Pen.Color := BorderColor;
    
    if PaintGradient then
      DrawGradient(Canvas, BgColorFrom, BgColorTo, Rect, goVertical);

    Canvas.MoveTo(0,0);
    Canvas.LineTo(Rect.Left,Rect.Bottom);
    Canvas.MoveTo(0,0);
    Canvas.LineTo(Rect.Right,Rect.Top);

    Canvas.MoveTo(self.Width,0);
    Canvas.LineTo(Rect.Right,Rect.Bottom);
    Canvas.MoveTo(0,self.Height); //links unten
    Canvas.LineTo(Rect.Right,Rect.Bottom);
    //Canvas.MoveTo(Rect.Right,0);
    //Canvas.LineTo(Rect.Right,Rect.Bottom);


    //TextRect := Rect(2, 2, self.Width-2, TitleHeight-2);
    //SetBkMode(Canvas.Handle, TRANSPARENT);
    //DrawText(self.Canvas.Handle, PChar(FCaption), -1, TextRect,
    // DT_CENTER or DT_VCENTER or DT_SINGLELINE);
    //Canvas.TextOut(1,1,'Test');
end;

end.
Danke
Tom
  Mit Zitat antworten Zitat
oki

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

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 30. Aug 2007, 21:31
Hi torud,

sieht doch schon gut aus.
Warum willst du unbedingt TStrings für den Text verwenden. Ein String tut es doch auch. Mit DrawText kannst du auch multiline realisieren. Schau einfach mal in der Hilfe nach, da sind alle Flags beschrieben.

Leider hab ich im Moment auch keine einfache Lösung. Nur ne komplizierte und die hab ich auch noch nicht ausprobiert.

Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 13     123 45     Letzte »    


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