Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild nachträglich auf einem Canvas verschieben (https://www.delphipraxis.net/71144-bild-nachtraeglich-auf-einem-canvas-verschieben.html)

Xyres 9. Jun 2006 16:25


Bild nachträglich auf einem Canvas verschieben
 
Hi,

meine Frage lautet wie folgt:

Ich füge eime *.bmp Datei per Draw-Befehl in ein Canvas ein. Jetzt suche ich eine möglichkeit wie ich dieses Bild nachträglich verschieben kann. Ich denke mir das es beim anklicken aktiviert wird und man es dann verschieben kann. IST DIES ÜBERHAUPT möglich wenn ja wie ?

MfG

Xyres

shmia 9. Jun 2006 16:35

Re: Bild nachträglich auf einem Canvas verschieben
 
Zitat:

Zitat von Xyres
Ich füge eime *.bmp Datei per Draw-Befehl in ein Canvas ein. Jetzt suche ich eine möglichkeit wie ich dieses Bild nachträglich verschieben kann. Ich denke mir das es beim anklicken aktiviert wird und man es dann verschieben kann. IST DIES ÜBERHAUPT möglich wenn ja wie ?

Das ist so nicht möglich. Wenn du einen Stempel auf ein Blatt Papier drückst, kannst du das Abbild
auch nicht mehr verschieben.
Du kannst allerdings:
1.) auf der alten Position ein weisses Recheck zeichnen, dass genau so gross ist wie dein Bitmap
2.) das Bitmap mit Draw() an der neuen Position zeichnen

Oder auch:
1.) vor dem Draw() die Fläche, die überschrieben wird in ein temporäres Bitmap sichern
2.) dein Bild mit Draw() zeichnen
3.) auf der alten Position das temp. Bitmap zeichnen (statt weissem Rechteck)
4.) wie 1.)
5.) das Bitmap mit Draw() an der neuen Position zeichnen

sniper_w 9. Jun 2006 16:44

Re: Bild nachträglich auf einem Canvas verschieben
 
Ein leeres Formular, 1 Panel darauf, 1 Image auf PANEL, Image.Align = alClient in OI stellen.
Events zuweisen, in OnCreate Event des Formulars ein Bild laden(Image1.Picture.LoadFromFile('filenname.ext') ) und das wars.

EDIT:
Image.AutoSize = False; Image.Strech = True;

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
    movement: integer;
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Sender is TWinControl) then
  begin
    ReleaseCapture; //Fängt alle Mausereignisse ab
    TWinControl(Sender).Perform(WM_SysCommand, movement, 0);
  end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Panel1mousedown(panel1, button, shift, x, y);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  panel1mousemove(panel1, shift, x, y);
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  movement := $F012;
  panel1.Cursor := crArrow;
  if x < 6 then
  begin
    Panel1.Cursor := crSizeWE;
    Movement := $F001;
    if y < 6 then
    begin
      Movement := $F004;
      panel1.Cursor := crSizeNWSE;
    end else
      if y > panel1.Height - 6 then
      begin
        movement := $F007;
        panel1.Cursor := crSizeNESW;
      end;
  end
  else
    if x > panel1.Width - 6 then
    begin
      panel1.Cursor := crSizeWE;
      movement := $F002;
      if y < 6 then
      begin
        movement := $F005;
        panel1.Cursor := crSizeNESW;
      end else
        if y > panel1.Height - 6 then
        begin
          movement := $F008;
          panel1.Cursor := crSizeNWSE;
        end;
    end else
      if y < 6 then
      begin
        movement := $F003;
        panel1.Cursor := crSizeNS;
      end else
        if y > panel1.Height - 6 then
        begin
          movement := $F006;
          panel1.Cursor := crSizeNS;
        end;
end;

end.

Xyres 9. Jun 2006 16:52

Re: Bild nachträglich auf einem Canvas verschieben
 
hmmm... gibt es denn dann eine möglichkeit ein eingefügtes bild wie ein objekt zu behandeln. und es dann irgendwie mit der maus zu verschieben, ich muss zugeben ich hab davon noch nich so wirklich die ahnung bin mich gerade am einarbeiten in die ganze materie. bin für jeden denkansatz dankbar

@ sniper_w sorry nix raff muss ich mir erst mal gaaanz in ruhe anschauen und dann hoffe ich das ich das kapier

sniper_w 9. Jun 2006 16:58

Re: Bild nachträglich auf einem Canvas verschieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

gibt es denn dann eine möglichkeit ein eingefügtes bild wie ein objekt zu behandeln.
Genau das habe ich gepostet. Gut, heir das ganze Projekt als Anhang.

Xyres 10. Jun 2006 17:41

Re: Bild nachträglich auf einem Canvas verschieben
 
danke für das projekt darunter kann ich mir jetzt was vorstellen nur leider ist das auch nich die lösung meins problems scheint wohl etwas komplizierter. denn man soll x belibige bilder verschieben können auf die innerhalb eines canvas eingefügt wurden wie bei photoshop z.B.. Aber vielen dank sniper_w das du mir deinen code zur verfügung gestellt hast.

Ich werd mal weiter suchen


MfG

Xyres

Namenloser 10. Jun 2006 18:31

Re: Bild nachträglich auf einem Canvas verschieben
 
Dazu müsstest du eine Liste programmieren, die Bitmaps und deren Positionen beinhaltet. dann schreibst du dir eine Methode, mit der du diese Bilder nacheinander auf das Canvas zeichnest. Ich habe neulich an so etwas gearbeitet, und dann im MouseDown-ereignis eines TImage die Koordinaten der Maus ausgewertet und mit den Koordinaten der Bilder in der Liste verglichen. Wenn die Mauskoordinaten zutreffen, wird der index der for-Schleifen-Variable in einer variable abgespeichert. Im MouseMove-Ereignis wird dann das Bild mit diesem Index verschoben, und anschließend wird alles neu gezeichnet.

Hier ist ein teil des Codes: (vereinfacht und Verallgemeinert)


OnMouseDown:
Delphi-Quellcode:
pressed := false; //Zur Sicherheit: es kann ja auch sein, dass man ins "leere" klickt, dann wird das MosueMove-Ereignis nicht ausgeführt
  for i := 0 to BilderListe.Count-1 do
  begin
    if (X > Bilderliste[i].x) and (X < Bilderliste[i].x+Bilderliste[i].width) and
       (X > Bilderliste[i].y) and (y < Bilderliste[i].y+Bilderliste[i].height) then //Wenn Cursor- Position im Bereich des Bildes
    begin
      BildIndex := i;
      pressed := true; //Wenn Objekt gefunden, dann darf MouseMove auch ruhig ausgeführt werden
      break; //Es muss nicht mehr gesucht werden, denn ein Objekt wurde gefunden
    end;
  end;
  startpoint := point(x-Bilderliste[BildIndex].x, y-Bilderliste[BildIndex].y); //Anfangskoordinaten merken
OnMouseMove:
Delphi-Quellcode:
 
Bilderliste[Bildindex].x := X-startpoint.x; //X-Koordinate des Bildes ändern
Bilderliste[BildIndex].y := y-startpoint.y; //Y-Koordinate des bildes ändern
draw; //Oder wie die Zeichen-Methode halt heißt
Ich hoffe, das stimmt so auch!

sniper_w 11. Jun 2006 10:04

Re: Bild nachträglich auf einem Canvas verschieben
 
Siehe http://www.dsdt.info/tutorials/tlisttut/

Xyres 11. Jun 2006 11:57

Re: Bild nachträglich auf einem Canvas verschieben
 
vielen dank für eure bemühungen ich werde mir das tut und deinen code mal zu herzen nehemen und hoffe, dass ich es dann hinbekommen.

MfG


Xyres

Luzzifus 12. Jun 2006 19:01

Re: Bild nachträglich auf einem Canvas verschieben
 
Oder du nimmst Graphics32.
Damit kannst du jedes Bild in einen Layer einer Image32- oder ImageView32-Komponente laden und diese auf recht einfache Art wie Objekte behandeln, also verschieben, einfügen, löschen etc. Kein Wunder, denn die Layer selbst sind Objekte. ^^ Beispiel-Codes sind auch dabei.


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