Delphi-PRAXiS

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" (https://www.delphipraxis.net/147083-rechtecke-auf-timage-ziehen.html)

Delphi-Narr 1. Feb 2010 16:14


Rechtecke auf TImage "ziehen"
 
Hallo,
ich bin gerade dabei, eine Art Paintprogramm zu schreiben. Dabei gibt es nur ein kleines Problem:

Ich möchte Rechtecke und Ellipsen auf der TImage Komponente aufziehen.
Ich abeite mit MouseDown, MouseMove und MouseUp. Bei MouseDown wird der Ursprungspunkt des Rechtecks in den Variablen x2 und y2 gespeichert. Außerdem wird die TBitmap Variable "Alt" auf das aktuelle Bitmap der TImage gesetzt.
Bei MouseMove soll wird dann erst der alte Zustand wiederhergestellt werden

Delphi-Quellcode:
Image1.picture.bitmap:=Alt;
und dann das Rechteck gezogen werden.

Delphi-Quellcode:
Image1.Canvas.Rectangle(X2,Y2,X,Y);
Dabei bekomme ich leider immer eine Zugriffsverletzung...
Wo ist der Fehler oder kann man das auf diese Art gar nicht machen. OnFormCreate habe ich die Variable mit


Delphi-Quellcode:
Alt:=TBitmap.Create;
initialisiert...

Liebe Grüße!

patti 1. Feb 2010 16:16

Re: Rechtecke auf TImage "ziehen"
 
Ich würde zur graphischen Ausgabe keine Image-Komponente nehmen, sonder einfach auf die Zeichenfläche einer Paintbox zeichnen. Die Image-Komponente ist für sowas eigentlich nicht gedacht.

mfg

Delphi-Narr 1. Feb 2010 16:18

Re: Rechtecke auf TImage "ziehen"
 
Zitat:

Zitat von patti
Die Image-Komponente ist für sowas eigentlich nicht gedacht.

Aber es müsste ja trotzdem möglich sein.

patti 1. Feb 2010 16:22

Re: Rechtecke auf TImage "ziehen"
 
Ich weiß zwar nicht, was gegen die Verwendung einer Paintbox-Komponente spricht, aber gut. Vielleicht solltest du anstatt

Delphi-Quellcode:
Image1.Canvas.Rectangle(X2,Y2,X,Y);
einmal

Delphi-Quellcode:
Image1.Picture.Bitmap.Canvas.Rectangle(X2,Y2,X,Y);
versuchen (kann dir im Moment aber auch nicht sagen, ob das so funktioniert). Allerdings müsstest du in diesem Fall der Image-Komponente wohl noch mitteilen, dass sie sich neu zeichnen muss.

Medium 1. Feb 2010 16:26

Re: Rechtecke auf TImage "ziehen"
 
Mit
Image1.picture.bitmap.Assign(Alt);
statt
Image1.picture.bitmap:=Alt;
könnte es evtl. hinhauen. Irgendwie sowas war da.

Das ist auch (mit) ein Grund warum TImage nicht so prima ist - es ist eigentlich nur zur Anzeigen von statischen Bildern. Wenn man aus dem Programm heraus selbst zeichnet, macht man das üblicherweise einfach auf ein TBitmap (welches ja zunächst nirgends angezeigt wird), und kopiert das fix und fertige Bitmap dann als aller letzten Schritt (idealerweise im OnPaint() Ereignis der Painbox) auf eben diese Paintbox.
TImage bringt einen riesen Haufen unnötigen Ballast mit, und an obigem sieht man ja schon, dass eine derartige Nutzung eher eine Vergewaltigung ist ;)

Delphi-Narr 1. Feb 2010 16:36

Re: Rechtecke auf TImage "ziehen"
 
Ok, soweit klappt das. Aber soweit kam ich auch, wenn ich einfach nur Bild.Picture wiederhergestellt habe, da, wenn man das Rechteck jetzt wieder kleiner ziehen will, das alte nicht verschwindet...

Matze 1. Feb 2010 16:48

Re: Rechtecke auf TImage "ziehen"
 
Hallo,

vielleicht hilft dir meine Demo, die zeigt, wie das Ganze mit Linien funktioniert. Das kannst du auch auf Rechtecke übertragen.
Allerdings gibt es keine "Punkte", an denen du dein Rechteck größer ziehen kannst.

Grüße, Matze


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