Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Rechtecke auf TImage ziehen mit DrawFocusRect (https://www.delphipraxis.net/145755-rechtecke-auf-timage-ziehen-mit-drawfocusrect.html)

Delphi-Narr 7. Jan 2010 20:45


Rechtecke auf TImage ziehen mit DrawFocusRect
 
Hallo, ich möchte gerne auf TImage ein Rechteck "ziehen", ähnlich wie bei Zeichenprogrammen. Dies soll mit über die Befehle OnMouseDown und Move geschehen. Beim Drücken der Maustaste wird der Startpunkt festgelegt, jetzt soll man das Rechteck ziehen können. Mein Problem: Das Rechteck wird gezogen, es erscheinen aber innerhalb dieses Rechtecks seeeehr viele andere Rechtecke, alle mit gestrichelter schwacher Linie.
Was kann ich machen?

Delphi-Quellcode:
procedure TForm1.BildMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Bild.Canvas.MoveTo(X,Y);
     Zeichnen:=True;
     Bild.Canvas.Pen.mode:=pmxor;
     Xf:=X;
     Yf:=Y;
end;

procedure TForm1.BildMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
     if not Zeichnen then exit;
     if Werkzeug.ItemIndex=1 then //Das Rechteck-Werkzeug
     begin
          Bild.Canvas.DrawFocusRect(Rect(Xf,Yf,X,Y));
     end;    
end;

Liebe Grüße!

s.h.a.r.k 7. Jan 2010 20:52

Re: Problem mit DrawFocusRect
 
Das Problem ist, dass das Bild sich den letzten Rahmen merkt und diesen nicht löscht. Du musst das Bild inkl. Rahmen neu zeichnen -> siehe Code:
Delphi-Quellcode:
procedure TForm1.BildMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
     if not Zeichnen then exit;
     if Werkzeug.ItemIndex=1 then //Das Rechteck-Werkzeug
     begin
          // Bild "clearen"
          Bild.Canvas.Brush.Color := clWhite;
          Bild.Canvas.FillRect(Rect(0, 0, Bild.Width, Bild.Height));

          // Neuen Rahmen zeichnen
          Bild.Canvas.DrawFocusRect(Rect(Xf,Yf,X,Y));
     end;    
end;

Delphi-Narr 7. Jan 2010 20:55

Re: Problem mit DrawFocusRect
 
Ja, darauf würde ich ja zurückgreifen, aber das, was bereits auf dem Bild ist, soll da auch bleiben...

Eine Art Zeichenprogramm solls werden.

SirThornberry 7. Jan 2010 21:13

Re: Problem mit DrawFocusRect
 
Hallo, kannst du dem Thema bitte einen aussagekräftigeren Titel geben? Das du ein Problem hast sagt bereits die gewählte Forenkategorie aus und "DrawFocusRect" sagt nicht sehr viel über dein Problem aus.
Bedenke das auch du Vorteile von einem aussagekräftigerem Titel hast. Aber auch das Andere mit gleichem Problem das Thema später über die Suche besser finden (wenn ein ordentlicher Titel vergeben wurde) ist nicht zu vernachlässigen. :)

Delphi-Narr 7. Jan 2010 21:25

Re: Problem mit DrawFocusRect
 
Nun ja, ich fand den Titel recht gut, da ich mich nicht ohne Suche aufs Forum geschmissen habe. In anderen Foren klappt diese Methode zum Zeichnen von Rechtecken auf einer TImage-Komponente und so habe ich mir gedacht, es ist ein spezifisches Problem bei mir.
Alternative Titel hätten mehr mit meinem Projekt als mit meinem Problem zu tun, deshalb habe ich diesen gewählt.
Wenn dir der Titel nicht aussagekräftig genug ist, kannst du ihn bitte ändern, mir fehlen dazu die Rechte...
LG

s.h.a.r.k 7. Jan 2010 21:27

Re: Problem mit DrawFocusRect
 
Du musst dazu den ersten Beitrag editieren. Dies kannst du innerhalb von 24h machen.

Delphi-Narr 7. Jan 2010 21:30

Re: Rechtecke auf TImage ziehen mit DrawFocusRect
 
Ok, danke - wieder was gelernt.
Ich sehe gerade, ich habe das gleiche Problem auch mit geraden Linien und Ellipsen.
Mein Programm hat bereits den "Farbeimer", den Bleistift und ein Radiergummi...

LG

s.h.a.r.k 7. Jan 2010 21:34

Re: Rechtecke auf TImage ziehen mit DrawFocusRect
 
Mir fällt irgendwie nur folgendes ein: Und zwar gibt es ja das sichtbare Bild. Zudem brauchst du noch eines, welches nicht auf der Form oder eben unsichtbar ist. Dieses dient als Zwischenspeicher. Wenn du nun eine Aktion abgeschlossen hast synchonisierst du beide Bilder, d.h. du kopierst den Inhalt des sichtbaren Bildes in das des nicht sichtbaren. Anstatt nun das TImage zu "clearen", wie ich das vorher per Code gezeigt habe, zeichnest du einfach das gepufferte, nicht sichtbare Bild. Verständlich?

Ob das aber die beste Lösung ist, kann ich dir nicht sagen.

Edit 1: Also es funktioniert auf jedenfall mal :thumb: Habs gerade getestet. Aber es gibt noch einen Bug, wenn ich das Rechteck nicht nach rechts unten ziehe.

Delphi-Narr 7. Jan 2010 21:42

Re: Rechtecke auf TImage ziehen mit DrawFocusRect
 
Ich könnte das ganze auch mit einem dynamischen Shape machen, dessen Koordinaten dann an das Image übergeben werden. Ich wunder mich halt nur, warum das nicht so klappt...

s.h.a.r.k 7. Jan 2010 21:45

Re: Rechtecke auf TImage ziehen mit DrawFocusRect
 
Das Problem ist doch, dass du etwas zeichnest und das wieder rückgängig machen musst. Und das geht halt nicht so einfach, außer du kennst du Zustand zuvor, den du dann wieder einblendest. Das ist genau das Verfahren, das ich dir gerade erzählt habe.

Was hälst du davon, wenn du das wirklich mit Shapes macht und zusätzlich noch mit Ebenen, à la Photoshop arbeitest? Sowas finde ich recht praktisch. Zudem könntest du dann später auch noch Eigenschaften von Objekten ändern.


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