Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Rechteck zeichnen (https://www.delphipraxis.net/117510-rechteck-zeichnen.html)

Larsi 19. Jul 2008 13:54


Rechteck zeichnen
 
Hi,

mit folgendem Code kann man auf einer Form ein Quadrat zeichnen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  canvas.Pen.mode :=pmNotXor;
  canvas.pen.style:= psDot; //Gepunktete Linien
  canvas.pen.color:=clRed;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
canvas.brush.style :=bsClear;  //Für transparentes Quadrat
if shift = [ssleft] then       //Zeichnen mit linker Maustaste
  begin
    x1 := x; y1 := y;
    x2 := x; y2 := y;
    canvas.rectangle (x1,y1,x2,y2);
  end;
if shift =[ssright] then     //Quadrat löschen mit rechter Maustaste
  canvas.rectangle(x1,y1,x2,y2);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if shift = [ssleft] then begin
  canvas.rectangle (x1,y1,x2,y2);
  x2 := x;  y2 := y1+x-x1;   //Quadrat durch X-Verschiebung der Maus
  canvas.rectangle (x1,y1,x2,y2);
  end
end;
Meine Frage ist jetzt wie ich ein Rechteck zeichnen kann, bzw. was ich im Code umändern muss damit die gezeichnete Form nicht immer quadratisch ist?

Es soll so sein wie wenn man in Paint ein Rechteck zieht.



MFG Lars Wiltfang

Nils_13 19. Jul 2008 14:01

Re: Rechteck zeichnen
 
Sollte gehen, setz vielleicht mal x2 und y2 anders als x1 und y1.

Larsi 19. Jul 2008 14:06

Re: Rechteck zeichnen
 
Zitat:

Zitat von Nils_13
Sollte gehen, setz vielleicht mal x2 und y2 anders als x1 und y1.

Kannst du mir das mal im Code zeigen?

_frank_ 19. Jul 2008 14:58

Re: Rechteck zeichnen
 
Zitat:

Zitat von Larsi
Delphi-Quellcode:
x1 := x; y1 := y;
x2 := x; y2 := y;

du setzt dort den Punkt für links oben (x1,y1) und den für unten rechts (x2,y2) auf den gleichen wert, somit malst du ein Rechteck von 0px breite und 0px Höhe.
lösen z.b. so:
Delphi-Quellcode:
x2 := x+50; y2 := y+50;
HTH Frank

Larsi 19. Jul 2008 15:18

Re: Rechteck zeichnen
 
Kann mir nicht mal jemand sagen, wie ich den Code verändern muss damit das richtig klappt? Was soll das bringen 50 zu addieren?

turboPASCAL 19. Jul 2008 15:22

Re: Rechteck zeichnen
 
Soche mal im Open Source Bereich nach "Mandelbrot". Da gibt's Anschaumaterial wie
man das macht.

Blackheart 19. Jul 2008 15:28

Re: Rechteck zeichnen
 
Zitat:

Zitat von Larsi
Kann mir nicht mal jemand sagen, wie ich den Code verändern muss damit das richtig klappt? Was soll das bringen 50 zu addieren?

Ich verbitte mir die bettelei nach Quellcode :wink:
probiers doch einfach mal aus dann wirst du ja sehen was es bringt.

Namenloser 19. Jul 2008 15:31

Re: Rechteck zeichnen
 
Delphi-Quellcode:
  x2 := x;  y2 := y1+x-x1;   //Quadrat durch X-Verschiebung der Maus
Was glaubst du, was dieser Code macht? Wie wär's mal mit Hirn einschalten? :wall:

Larsi 19. Jul 2008 15:44

Re: Rechteck zeichnen
 
Habs jetzt hinbekommen aber ich habe nochmal ne Frage: Ich habe bsps. das Recheckt: Rec:Trect deklariert, wie kann ich jetzt dieses Rechteck benutzen um zu zeichnen um später damit weiter zuporgrammieren?


Kann ich einfach sagen Image1.Canvas.Rec(p1, p2, p3, p4) oder wie macht man das?

Phoenix 19. Jul 2008 15:53

Re: Rechteck zeichnen
 
Du legst grad echt ein TD / Taktaky-Verhalten an den Tag :warn:

Schau Dir doch mal die Onlinehilfe zu TCanvas, TRect etc. an.
Und wenn das nicht hilft und Du Google anschmeisst wirst Du sogar den einen oder anderen Thread hier in der DP zu diesen Schlagwörtern findern :roll:

Larsi 19. Jul 2008 16:18

Re: Rechteck zeichnen
 
Ok, jetzt bin ich schon mal wieder ein Stück weiter aber es klappt nicht. Mein Code jetzt ist:
Delphi-Quellcode:
procedure TForm16.FormCreate(Sender: TObject);
begin
  image1.canvas.Pen.mode :=pmNotXor;
  image1.canvas.pen.style:= psDot; //Gepunktete Linien
  image1.canvas.pen.color:=clRed;
end;

procedure TForm16.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

Image1.canvas.brush.style :=bsClear;  //Für transparentes Quadrat
if shift = [ssleft] then       //Zeichnen mit linker Maustaste
  begin
    x1 := x;
    y1 := y;
rec := Rect(x1, y1, x2, y2);
    Image1.Canvas.DrawFocusRect(Rec);
  end;
if shift =[ssright] then     //Quadrat löschen mit rechter Maustaste
  image1.canvas.rectangle(x1,y1,x2,y2);

end;

procedure TForm16.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin

 if shift = [ssleft] then begin
 Image1.Canvas.DrawFocusRect(Rec);
 x2 := x;
 y2 := y;  //Quadrat durch X-Verschiebung der Maus
  rec := Rect(x1, y1, x2, y2);
 Image1.Canvas.DrawFocusRect(Rec);
  end;
end;

Wenn ich jetzt aber ein Rechteck zeichnen will dann sehe ich nur Steifen im Bilder mehr nicht.

Die Muhkuh 19. Jul 2008 16:20

Re: Rechteck zeichnen
 
Debug durch und schau Dir mal die Werte an, die gezeichnet werden.

_frank_ 19. Jul 2008 16:51

Re: Rechteck zeichnen
 
vielleicht hilft dir diese Klasse von mir weiter...dort wird ein Rechteck "gezogen":
http://www.delphipraxis.net/internal...=909362#909362

HTH Frank

rollstuhlfahrer 19. Jul 2008 21:41

Re: Rechteck zeichnen
 
HI,

was macht denn bitte DrawFocusRect??
Delphi-Hilfe
Die Methode DrawFocusRect zeichnet ein Rechteck, wie es normalerweise fokussierte Objekte umgibt.


Um ein Rechteck zu zeichnen, würde ich den Aufruf von .Rectangle(Rect) verwenden. !Achtung! .Rechtangle ist eine überladene Funktion, die 1. mit 4 Integern aufgerufen werden kann und 2. mit einem Rechteck aufgerufen werden kann. Da Windows nur mit 4 Integer-Punkten arbeiten kann, wird intern die .Rectangle (1) aufgerufen.

Zu deinem Problem:
Zitat:

Zitat von Larsi
Kann ich einfach sagen Image1.Canvas.Rec(p1, p2, p3, p4) oder wie macht man das?

Rect.Top,
Rect.Bottom,
Rect.Left
und Rect.Right gibts da. Dies kann man dann in der richtigen Reihenfolge eingeben.

Bernhard


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