Delphi-PRAXiS

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 Auf Shape zeichnen (https://www.delphipraxis.net/110465-auf-shape-zeichnen.html)

slytab 18. Mär 2008 13:25


Auf Shape zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich würde gerne auf einem rechteckigen Shape eine Diagonale einzeichnen.
Ich würde dazu gerne das Canvas des Shapes benutzen, ist zwar protected, aber über with scheine ich dranzukommen:

Delphi-Quellcode:
   with shape1 do
   begin
      Canvas.Pen.Color := clBlack;
      Canvas.MoveTo(Left, Top);
      Canvas.LineTo(Width+left, Height+Top);
   end;
Im Prinzip funktioniert es, nur man sieht es nicht, da die Linie immer unter das Shape gezeichnet wird.

Ich kann das erkennen, wenn ich das Shape nicht ausfülle.
Und: Warum klappt dies nur in der onPaint-Routine, nicht in onActivate?

Und wie bekomme es hin, dass ich die Linie sehe, wenn das Shape (weiß) ausgefüllt ist (brush.style = bsSolid)? Dann überdeckt das Shape die Linie.

Mir liegt jetzt mehr daran, die Phänomeme zu verstehen, als Alternativlösungen zu bekommen.

Viele Grüße & Dänke
slytab

DeddyH 18. Mär 2008 14:27

Re: Auf Shape zeichnen
 
Über das with kommst Du nicht an den Canvas des Shapes.

Die Muhkuh 18. Mär 2008 14:28

Re: Auf Shape zeichnen
 
Ich würde eine Komponente von TShape ableiten und mit der dann diesen Strich zeichnen.

Delphi-Quellcode:
interface

type
  TMyShape = class(TShape)
  protected
    procedure Paint; override;
  end;

implementation

procedure TMyShape.Paint;
begin
  inherited Paint;

  Canvas.MoveTo(0, 0);
  Canvas.LineTo(Width, Height);
end;

SirThornberry 18. Mär 2008 14:30

Re: Auf Shape zeichnen
 
Dies ist ein wunderbares Beispiel warum man with nicht unbedingt nehmen wollte - Dadurch sieht man nicht auf anhieb worauf sich die Befehle in dem with beziehen und es kommt zu Irrtümern.

DeddyH 18. Mär 2008 14:34

Re: Auf Shape zeichnen
 
Obwohl ich nicht generell die Verwendung von with verteufeln würde, muss ich Jens in diesem Fall Recht geben. Ich möchte wetten, wenn Du Deinen Code etwas erweiterst, tritt keine Änderung ein, aber evtl. geht Dir dann ein Licht auf:
Delphi-Quellcode:
with shape1 do
   begin
      self.Canvas.Pen.Color := clBlack;
      self.Canvas.MoveTo(Left, Top);
      self.Canvas.LineTo(Width+left, Height+Top);
   end;

slytab 18. Mär 2008 14:59

Re: Auf Shape zeichnen
 
Danke erstmal für die vielen, schnellen Antworten.
Ich glaube Ihr habt recht, dass ich über with nicht an die Canvas des Shapes komme.
Ich dachte, dass dies der Fall wäre, weil die Werte von Top, Left, Width und Height eben genau die der Shape sind und nicht des Formulars. Deswegen dachte ich, Canvas wäre auch vom Shape und nicht vom Formular.
In der Hilfe steht, dass Shapes die Eigenschaft Canvas haben, andereseits scheint man nicht drauf zugreifen zu können.
Folgendes geht nicht:
shape1.canvas.pen.color := clBlack

Ich hab mal irgendwo gelesen, dass Canvas der Shapes protected ist und dachte, ich könnte es mit with aushebeln. (War zwar nicht logisch, zugegeben, aber es sah so aus als ob es klappt :-(

Kommt man denn irgendwie an die Canvas des shapes?

Aber davon abgesehen, warum sehe ich die Linie nicht, wenn das Shape ausgefüllt ist?

Die Muhkuh 18. Mär 2008 15:01

Re: Auf Shape zeichnen
 
Zitat:

Zitat von slytab
Kommt man denn irgendwie an die Canvas des shapes?

Aber davon abgesehen, warum sehe ich die Linie nicht, wenn das Shape ausgefüllt ist?

Siehe meine Antwort oben dran :)

Die Linie wird bei Dir auf die Form gezeichnet und dort drüber wird ein TShape gezeichnet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 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