![]() |
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; |
AW: Linie in abgeleiteter Komponente zeichnen
Hast Du mal versucht das Zeichnen der Linie in die Paint Methode zu verschieben!?
|
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; |
AW: Linie in abgeleiteter Komponente zeichnen
Zitat:
Zitat:
Soll ich die komplette Unit anhängen? |
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 |
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; |
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 |
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.
|
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 |
AW: Linie in abgeleiteter Komponente zeichnen
ich habs mal getestet:
Delphi-Quellcode:
da flackert nix
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; und gezeichnet wird es auch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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 by Thomas Breitkreuz