Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem bei Rechteck zeichnen (mit PaintBox) (https://www.delphipraxis.net/157057-problem-bei-rechteck-zeichnen-mit-paintbox.html)

approxinately007 27. Dez 2010 12:53

Problem bei Rechteck zeichnen (mit PaintBox)
 
Hallo,

ich bin Neuling in diesem Forum und Schüler und Anfänger in Sachen Delphi...
Wir müssen für die Schule ein Programm schreiben!
Meine Idee war, ein Rechteck zu zeichnen, wenn ich auf den Button2 klicke!

Das Problem: Wenn ich das Rechteck vergrößere, ist alles normal!
Verkleinere ich es mit gedrückter Mausdaste, dann sieht man die ganzen anderen Rechtecke,
welche durch MouseMove gezeichnet werden!!!

Ist es möglich, das ich das Rechteck vergrößern und verkleinern kann (mit linke maustaste gedrückt)
und dass es ein Rechteck bleibt und nicht hunderte übereinander...

Hier mal der Code:


Code:
var
  Form1: TForm1;
  Bild: TBitmap;
  Zeichenfarbe: TColor;
  X1, Y1, AMax, AMin: Integer;
  S, R, b: Boolean;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if S then
  begin
  if ssLeft in Shift then PaintBox1.Canvas.MoveTo(X,Y);
  if ssLeft in Shift then PaintBox1.Canvas.LineTo(X,Y);
  end;
  if R then
  begin
  if ssLeft in Shift then PaintBox1.Canvas.MoveTo(X,Y);
  b := true;
  X1 := X;
  Y1 := Y;
  end;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if S then
  begin
  if ssLeft in Shift then PaintBox1.Canvas.LineTo(X,Y);
  end;
  if R then
  begin
    if b then
      begin
      if ssLeft in Shift then
      PaintBox1.Canvas.MoveTo(X,Y);
      PaintBox1.Canvas.Rectangle(X1,Y1,X,Y);
      end;
  end;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
  S := true;
  R := false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  R := true;
  S := false;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if R then
  begin
    if ssLeft in Shift then
    PaintBox1.Canvas.MoveTo(X,Y);
    PaintBox1.Canvas.Rectangle(X1,Y1,X,Y);
    b := false;
  end;
end;

end.
Würde mich über eure Hilfe freuen! Als Anfänger komme ich mit diesem Problem nich mehr klar!

Mfg
Approxinately007

Klaus01 27. Dez 2010 12:56

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
Hallo,

Du musst Dir die Eckpunkte des größsten Rechtecks merken
und das Rechteck löschen bevor du das kleine Rechteck zeichnest.

Grüße
Klaus

approxinately007 27. Dez 2010 13:58

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
ok, erst mal danke für deine schnelle Antwort!

...klinkt logisch!
Wie lösche ich am besten Rechtecke?

mfg

Klaus01 27. Dez 2010 14:03

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
Zitat:

Zitat von approxinately007 (Beitrag 1070616)
Wie lösche ich am besten Rechtecke?

mfg


mit der Hintergrundfarbe übermalen.

Grüße
Klaus

Bummi 27. Dez 2010 19:43

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
Irgendwie läuft die Benutzung der Paintbox in der letzten Zeit etwas aus dem Ruder.....
Die Paintbox soll im OnPaint gemalt werden, ansonsten ist das Ergebnis z.B. nach dem in den Vordergrund bringen eine anderen Fensters völlig undefiniert.
Auch ein Repaint schadet bei der Paintbox mehr als es nützt, hier ist ein Invalidate angesagt, dann gibt es auch nichts zu löschen, es wird genau das gemalt was gemalt werden soll.

approxinately007 28. Dez 2010 15:13

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
Zitat:

Zitat von Klaus01 (Beitrag 1070602)
Hallo,

Du musst Dir die Eckpunkte des größsten Rechtecks merken
und das Rechteck löschen bevor du das kleine Rechteck zeichnest.

Grüße
Klaus


Tut mir leid, aber ich versteh generell nich ganz wie ich das hinbekommen soll!
Könntest du mir vielleicht den Code vorschreiben, damit ich einen Anhaltspunkt bekomme...

Gruß
approxinately

Klaus01 28. Dez 2010 15:26

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
Hallo,

wie Thomas bereits geschrieben hatte, ist es besser
in der Paint Methode (onPaint Ereignis) zu malen und mit invalidate den Paintbox Inhalt
zu löschen. Es wird dann automatisch ein Neuzeichnen angestossen.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1Paint(Sender: TObject);
  private
    startX, startY, endX, endY: Integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  startX := x;
  startY := y;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  endX := x;
  endY := y;
  invalidate;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  with (sender as TPaintbox) do
    begin
      Canvas.MoveTo(startx,startY);
      Canvas.Rectangle(endX,endY,startX,startY);
    end;
end;
Grüße
Klaus

approxinately007 28. Dez 2010 15:59

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
alles klar Dankeschön!

Ich dachte eig. ich könnte dass schaffen, mit mousemove, dass man sieht, wie man das rechteck zeichnet, bevor man die maustaste loslässt!
aber das ist mir jetz auch zu viel und zu kompliziert!!!

trotzdem danke für eure hilfe...
n guden rutsch an alle

...

Klaus01 28. Dez 2010 16:13

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
.. ist nicht kompliziert:

Delphi-Quellcode:
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  endX := x;
  endY := y;
  invalidate;
end;
Grüße und auch einen guten Rutsch
Klaus

DeddyH 28. Dez 2010 18:35

AW: Problem bei Rechteck zeichnen (mit PaintBox)
 
Zitat:

Zitat von approxinately007 (Beitrag 1070813)
Ich dachte eig. ich könnte dass schaffen, mit mousemove, dass man sieht, wie man das rechteck zeichnet, bevor man die maustaste loslässt!

Google mal nach Bei Google suchenDelphi Gummibandeffekt.


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