![]() |
Fadenkreuz für TImage
Hallo, habe bis jetzt irgendwie keine für mich entsprechende Lösung (auch über die Suche) für folgendes Problem gefunden:
Ich habe ein TImage in das ich ein JPG-Lade. Nun möchte ich bei jeder Mausbewegung (OnMouseMove) ein Fadenkreuz erzeugen, dass bis zu den Rändern der TImage-Komponente reicht. So ähnlich wie in einem CAD-Programm. Die Möglichkeit den Cursor des TImage auf crCross zu stellen habe ich bereits in betracht gezogen aber das entspricht leider nicht meinen Vorstellungen, da das Fadenkreuz / der Mauszeiger einfach zu klein ist. Wie bekomme ich das am einfachsten hin, hat jemand eine Idee? |
Re: Fadenkreuz für TImage
zeichne es dir einfach selbst und zwar mit pen.mode:=pmxor. Wenn du damit Linien zeichnest, werden die Farben unter deiner Linie invertiert, zeichnest du sie also nochmal, ist sie wieder weg.
|
Re: Fadenkreuz für TImage
Danke für den Tipp, ich mache nun folgendes...
Delphi-Quellcode:
dann löscht er allerding meine JPG-Grafik im TImage und zeigt mir auch kein Fadenkreuz.
imgLageplan.Picture.Bitmap.Canvas.Pen.Mode:= pmNotXor;
imgLageplan.Picture.Bitmap.Canvas.MoveTo(oldX, 0); imgLageplan.Picture.Bitmap.Canvas.LineTo(oldX, imgLageplan.Height); imgLageplan.Picture.Bitmap.Canvas.MoveTo(0, oldY); imgLageplan.Picture.Bitmap.Canvas.LineTo(imgLageplan.Width, oldY); imgLageplan.Picture.Bitmap.Canvas.Pen.Mode:= pmXor; imgLageplan.Picture.Bitmap.Canvas.MoveTo(X, 0); imgLageplan.Picture.Bitmap.Canvas.LineTo(X, imgLageplan.Height); imgLageplan.Picture.Bitmap.Canvas.MoveTo(0, Y); imgLageplan.Picture.Bitmap.Canvas.LineTo(imgLageplan.Width, Y); oldX := X; oldY := Y; Wenn ich es so mache...
Delphi-Quellcode:
erwartet er allerding eine BMP-Datei anstelle des JPG's, sonst gibt es einen Compiler Fehler "Ein Bild kann nur geändert werden, wenn es ein Bitmap enthält." Wenn ich es dann mit einer BMP-Datei ausprobiere geht es. Allerdings muss ich bei JPG bleiben. Wie kann ich das Problem jetzt lösen?
imgLageplan.Canvas.Pen.Mode:= pmNotXor;
imgLageplan.Canvas.MoveTo(oldX, 0); imgLageplan.Canvas.LineTo(oldX, imgLageplan.Height); imgLageplan.Canvas.MoveTo(0, oldY); imgLageplan.Canvas.LineTo(imgLageplan.Width, oldY); imgLageplan.Canvas.Pen.Mode:= pmXor; imgLageplan.Canvas.MoveTo(X, 0); imgLageplan.Canvas.LineTo(X, imgLageplan.Height); imgLageplan.Canvas.MoveTo(0, Y); imgLageplan.Canvas.LineTo(imgLageplan.Width, Y); oldX := X; oldY := Y; |
Re: Fadenkreuz für TImage
hallo, dann musst du das jpg erst in ein bitmap zeichnen:
Delphi-Quellcode:
das bitmap kannst du dann in dein timage reinpüacken und trotzdem noch drauf rumzeichnen.
procedure GetBitmap(const Graphic: TGraphic; out Bitmap: TBitmap);
begin if Bitmap = nil then Bitmap := TBitmap.Create; Bitmap.SetSize(Graphic.Width,Graphic.Height); Bitmap.Canvas.Draw(0,0,Graphic); end; |
Re: Fadenkreuz für TImage
Du kannst auf JPGs nicht zeichnen. *grummel*
Du musst also a. Das JPG in ein Bitmap umwandlen (du mussst halt die Funktion mal raussuchen) b. eine Paintbox vor das Image legen und auf dieser dann zeichnen. |
Re: Fadenkreuz für TImage
Hm... wenn ich jetzt versuche die JPG-Datei in BMP zu wandeln, bekomme ich einen "abstrakten Fehler" bei TEMPBitmap := TBitmap.Create;:
Delphi-Quellcode:
was mach ich da schon wieder falsch?
var
strLageplan: String; TEMPGraphic: TGraphic; TEMPBitmap: TBitmap; begin strLageplan := 'C:\lageplan.jpg'; TEMPGraphic := TGraphic.Create; TEMPGraphic.LoadFromFile(strLageplan); TEMPBitmap := TBitmap.Create; TEMPBitmap.Height := TEMPGraphic.Height; TEMPBitmap.Width := TEMPGraphic.Width; TEMPBitmap.Canvas.Draw(0,0,TEMPGraphic); imgLageplan.Picture.Bitmap.Assign(TEMPBitmap); imgLageplan.AutoSize := True; |
Re: Fadenkreuz für TImage
Hallo,
Delphi-Quellcode:
nimm doch ein TJpegImage.
TEMPGraphic: TJpegImage;
begin strLageplan := 'C:\Fehler.jpg'; TEMPGraphic := TJpegImage.Create; ... |
Re: Fadenkreuz für TImage
Alles Klar! Daran hat es gelegen!
Jetzt klappt die Umwandlung und ich kann schön bei den JPGs bleiben. :-D Danke. |
Re: Fadenkreuz für TImage
Hallo, du kannst TGraphic nicht instanziieren. Nimm ein TPicture, erstelle es, lade auf deiner jpeg-datei und übergib an meine funktion dann picture.graphic.
Damit bleibst du format-unabhängig, solltest du es dir irgendwann anders überlegen. |
Re: Fadenkreuz für TImage
Ok, das werde ich tun aber nun habe ich noch ein anderes Problemchen...
wenn ich die Maus zu schnell bewege oder während der Bewegung einen Mausbutton drücke, löscht der das Fadenkreuz nicht immer, sprich die Striche bleiben mal erhalten und mal nicht. Die folgende Prozedur befindet sich im OnMouseMove Ereignis, oldX und oldY sind Global!
Delphi-Quellcode:
wie kann man das in den Griff bekommen?
//Fadenkreuz zeichnen, wenn aktiviert
if (strUseCross = 'Enabled') then begin imgLageplan.Canvas.Pen.Mode:= pmNotXor; imgLageplan.Canvas.MoveTo(oldX, 0); imgLageplan.Canvas.LineTo(oldX, imgLageplan.Height); imgLageplan.Canvas.MoveTo(0, oldY); imgLageplan.Canvas.LineTo(imgLageplan.Width, oldY); imgLageplan.Canvas.Pen.Mode:= pmXor; imgLageplan.Canvas.Pen.Style:= psDot; imgLageplan.Canvas.MoveTo(X, 0); imgLageplan.Canvas.LineTo(X, imgLageplan.Height); imgLageplan.Canvas.MoveTo(0, Y); imgLageplan.Canvas.LineTo(imgLageplan.Width, Y); oldX := X; oldY := Y; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz