Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Fadenkreuz für TImage (https://www.delphipraxis.net/92232-fadenkreuz-fuer-timage.html)

NetSonic 16. Mai 2007 14:49


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?

Nikolas 16. Mai 2007 15:00

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.

NetSonic 16. Mai 2007 15:17

Re: Fadenkreuz für TImage
 
Danke für den Tipp, ich mache nun folgendes...

Delphi-Quellcode:
  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;
dann löscht er allerding meine JPG-Grafik im TImage und zeigt mir auch kein Fadenkreuz.

Wenn ich es so mache...

Delphi-Quellcode:
  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;
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?

DGL-luke 16. Mai 2007 15:40

Re: Fadenkreuz für TImage
 
hallo, dann musst du das jpg erst in ein bitmap zeichnen:

Delphi-Quellcode:
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;
das bitmap kannst du dann in dein timage reinpüacken und trotzdem noch drauf rumzeichnen.

Apollonius 16. Mai 2007 15:41

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.

NetSonic 16. Mai 2007 16:13

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:
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;
was mach ich da schon wieder falsch?

bitsetter 16. Mai 2007 16:22

Re: Fadenkreuz für TImage
 
Hallo,

Delphi-Quellcode:
   TEMPGraphic: TJpegImage;
begin

strLageplan := 'C:\Fehler.jpg';

TEMPGraphic := TJpegImage.Create;
...
nimm doch ein TJpegImage.

NetSonic 16. Mai 2007 16:25

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.

DGL-luke 16. Mai 2007 16:26

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.

NetSonic 16. Mai 2007 17:04

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:
//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;
wie kann man das in den Griff bekommen?

mimi 16. Mai 2007 21:25

Re: Fadenkreuz für TImage
 
ich vermute imgLageplan ist von typ TImage, richtig ?

ich würde das nicht mit XOR machen, damit habe ich schlecht Erfahrung.
am besten währe es wenn du das Bild ständig Komplet löschen würdes.

Damit währe der Bug auto. behoben. Denke ich mal.

bitsetter 16. Mai 2007 22:11

Re: Fadenkreuz für TImage
 
Bei mir funzt dein Code überhaupt nicht, das ganze Bild ist voller Streifen, wenn ich den Code ins onMouseMove Ereignis des Image gesetzt habe.
Aber wenn ich
Delphi-Quellcode:
  //imgLageplan.Canvas.Pen.Mode:= pmXor;
raus genommen habe dann ging es zumindest bei mir.

NetSonic 18. Mai 2007 08:39

Re: Fadenkreuz für TImage
 
Danke bitsetter, wenn ich diese Zeile auskommentiere habe ich auch keine "Streifen" mehr... hätte man vielleicht auch selbst darauf kommen können, das mal aus zu probieren... Aber manchmal fehlt einem einfach die richtige Vermutung oder Idee... :wall:


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