AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Linie in abgeleiteter Komponente zeichnen

Ein Thema von Andreas L. · begonnen am 23. Mai 2011 · letzter Beitrag vom 24. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#1

Linie in abgeleiteter Komponente zeichnen

  Alt 23. Mai 2011, 19:12
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;
Andreas Lauß
Blog

Geändert von Andreas L. (23. Mai 2011 um 19:23 Uhr)
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#2

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 23. Mai 2011, 20:08
Hast Du mal versucht das Zeichnen der Linie in die Paint Methode zu verschieben!?
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#3

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 23. Mai 2011, 20:15
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;
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 24. Mai 2011, 06:25
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.

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?
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 24. Mai 2011, 06:56
Hilft es da nicht ein "TCsPageNavigation.Paint"? (Ich gehe jetzt mal davon aus, dass TCsPageNavigation von TCsCustomPanel abgeleitet ist)


Gruß
angos
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 24. Mai 2011, 07:01
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;
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
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 24. Mai 2011, 07:24
@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
Angehängte Dateien
Dateityp: txt CsPanels.txt (15,3 KB, 4x aufgerufen)
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 24. Mai 2011, 07:34
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.
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
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 24. Mai 2011, 07:45
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
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#10

AW: Linie in abgeleiteter Komponente zeichnen

  Alt 24. Mai 2011, 08:01
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:57 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