Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Linie in abgeleiteter Komponente zeichnen (https://www.delphipraxis.net/160631-linie-abgeleiteter-komponente-zeichnen.html)

Andreas L. 23. Mai 2011 19:12


Linie in abgeleiteter Komponente zeichnen
 
Hallo,

ich habe eine Komponente von TCustomPanel abgeleitet die verschiedene Rahmen haben kann. Von dieser Komponente (TCsCustomPanel) habe ich wiederrum eine Komponente (TCsPageNavigation) abgeleitet die eine Eigenschaft Style hat mit der die Komponente in 3 Stilen erscheinen kann. In der Refresh-Methode setze ich je nach Style die BorderTop-Eigenschaft. Das funktioniert auch super. Bei einem Stil muss aber unter dem Border noch nachträglich eine weiße Linie gezeichnet werden um einen Schatten wie bei TBevel darzustellen. Die Linie wird leider nicht angezeigt. Ich vermute das sie schon gezeichnet wird aber das die Paint-Methode des Vorfahren sie wieder überschreibt. Was mache ich falsch bzw. wie kann ich das Problem lösen?

Delphi-Quellcode:

  ...
  ...

procedure TCsCustomPanel.DrawBorder(Style: TCsBorderStyle;
  Position: TCsBorderPosition);
var
  Coord: TPoint;
begin
  if Style.Visible and (Style.Width > 0) then
  begin
    Canvas.Pen.Color := Style.Color;
    Canvas.Pen.Width := Style.Width;
    Canvas.PenPos := GetBorderStartPosition(Position);

    Coord := GetBorderEndPosition(Position);

    Canvas.LineTo(Coord.X, Coord.Y);
  end;
end;

procedure TCsCustomPanel.Paint;
begin
  inherited Paint;

  DrawBorder(FBorderLeft, cbpLeft);
  DrawBorder(FBorderRight, cbpRight);
  DrawBorder(FBorderTop, cbpTop);
  DrawBorder(FBorderBottom, cbpBottom);
end;

  ...
  ...

procedure TCsPageNavigation.DrawBorderShadow;
begin
  Canvas.Pen.Color := clWhite;
  Canvas.Pen.Width := 1;
  Canvas.MoveTo(0, 1);
  Canvas.LineTo(Width - 1 , 1);
end;

procedure TCsPageNavigation.Refresh;
begin

  case FStyle of
    cwsFlat:
    begin
      BorderTop.Visible := False;
    end;
    cwsWin2000:
    begin
      BorderTop.Visible := True;
      BorderTop.Color := clGray;
      DrawBorderShadow; // Hier soll die weiße Linie gezeichnet werden
    end;
    cwsVista:
    begin
      BorderTop.Visible := True;
      BorderTop.Color := clSilver;
    end;
  end;

end;

EarlyBird 23. Mai 2011 20:08

AW: Linie in abgeleiteter Komponente zeichnen
 
Hast Du mal versucht das Zeichnen der Linie in die Paint Methode zu verschieben!?

EarlyBird 23. Mai 2011 20:15

AW: Linie in abgeleiteter Komponente zeichnen
 
Delphi-Quellcode:
procedure TCsCustomPanel.Paint;
begin
  inherited Paint;

  DrawBorder(FBorderLeft, cbpLeft);
  DrawBorder(FBorderRight, cbpRight);
  DrawBorder(FBorderTop, cbpTop);
  DrawBorder(FBorderBottom, cbpBottom);
  if FStyle = cwsWin2000 then
    DrawBorderShadow;
end;

Andreas L. 24. Mai 2011 06:25

AW: Linie in abgeleiteter Komponente zeichnen
 
Zitat:

Zitat von EarlyBird (Beitrag 1102417)
Hast Du mal versucht das Zeichnen der Linie in die Paint Methode zu verschieben!?

Ja, dann flackert die Linie ständig. Paint wird also in einer Endlos-Schleife aufgerufen.

Zitat:

Zitat von EarlyBird (Beitrag 1102419)
Delphi-Quellcode:
procedure TCsCustomPanel.Paint;
begin
  inherited Paint;

  DrawBorder(FBorderLeft, cbpLeft);
  DrawBorder(FBorderRight, cbpRight);
  DrawBorder(FBorderTop, cbpTop);
  DrawBorder(FBorderBottom, cbpBottom);
  if FStyle = cwsWin2000 then
    DrawBorderShadow;
end;

Im TCsCustomPanel.Paint kann ich die Linie natürlich nicht zeichnen, weil DrawBorderShadow und FStyle in der Ableitung TCsPageNavigation definiert sind ;-)

Soll ich die komplette Unit anhängen?

angos 24. Mai 2011 06:56

AW: Linie in abgeleiteter Komponente zeichnen
 
Hilft es da nicht ein "TCsPageNavigation.Paint"? (Ich gehe jetzt mal davon aus, dass TCsPageNavigation von TCsCustomPanel abgeleitet ist)


Gruß
angos

DeddyH 24. Mai 2011 07:01

AW: Linie in abgeleiteter Komponente zeichnen
 
Ich verstehe das Problem nicht ganz.
Delphi-Quellcode:
type
  TBasis = class(TCustomPanel)
  ...
  protected
    procedure Paint; override;
  ...
  end;

  TAbgeleitet = class(TBasis)
  private
    FProperty: TDatentyp;
    procedure SetProperty(value: TDatentyp);
  ...
  protected
    procedure Paint; override;
  ...
  public
    property MyProperty: TDatentyp read FProperty write SetProperty;
  end;


procedure TBasis.Paint;
begin
  inherited;
  //Zeichnen
end;

procedure TAbgeleitet.Paint;
begin
  inherited; //Zeichenroutine der Basisklasse
  //weitere Zeichenoperationen
end;

procedure TAbgeleitet.SetProperty(value: TDatentyp);
begin
  //wenn nötig, neuzeichnen
  if FProperty <> value then
    begin
      FProperty := value;
      invalidate;
    end;
end;

Andreas L. 24. Mai 2011 07:24

AW: Linie in abgeleiteter Komponente zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
@DeddyH: Genau so mache ich es. In TBasis.Paint werden die Border gezeichnet, in TAbgeleitet.Paint die DrawBorderShadow-Methode. Wenn ich das mache wir die Komponente zur DesignTime nicht mehr richtig angezeigt (Nur Umrisse, keine Size-Grips, ...). Packe ich das DrawBorderShadow in die TAbgeleitet.Refresh-Methode wird alles angezeigt, nur eben ohne die weiße Linie.

Siehe Anhang

DeddyH 24. Mai 2011 07:34

AW: Linie in abgeleiteter Komponente zeichnen
 
Refresh gibt es bereits in TControl, diese Methode wird von Dir also verborgen. Wieso nicht alles ins Paint schieben? Und ich finde es etwas unglücklich, dass sich TCsNavigationButtonOptions und TCsPageNavigation gegenseitig kennen (müssen). Über Events wäre das IMO eleganter zu lösen.

Satty67 24. Mai 2011 07:45

AW: Linie in abgeleiteter Komponente zeichnen
 
Ich finde ja, dass in Refresh überhaupt nicht rein gehört.

Im Setter von BorderTop ein Invalidate und alles/nur zeichnen in Paint.

€: Sehe gerade DeddyH war wieder schneller, also das Prinzip wie im Schema von Post #6

EarlyBird 24. Mai 2011 08:01

AW: Linie in abgeleiteter Komponente zeichnen
 
ich habs mal getestet:
Delphi-Quellcode:
procedure TCsPageNavigation.Paint;
begin
  inherited Paint;
  if FStyle = cwsWin2000 then
    DrawBorderShadow;
  //Refresh;
end;

procedure TCsPageNavigation.Refresh;
begin

  case FStyle of
    cwsFlat:
    begin
      BorderTop.Visible := False;
    end;
    cwsWin2000:
    begin
      BorderTop.Visible := True;
      BorderTop.Color := clGray;


    end;
    cwsVista:
    begin
      BorderTop.Visible := True;
      BorderTop.Color := clSilver;
    end;
  end;

end;
da flackert nix
und gezeichnet wird es auch


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.
Seite 1 von 2  1 2      

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