Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


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