Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Windows Explorer DragNDrop auf TImage (DragAcceptFiles) (https://www.delphipraxis.net/203081-windows-explorer-dragndrop-auf-timage-dragacceptfiles.html)

DieDolly 10. Jan 2020 17:05


Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
Ich benutze in einem Programm Drag n Drop schon seit sehr langer Zeit für Edits was immer funktioniert.
Jetzt kommt aber noch ein TImage hinzu und da komme ich nicht weiter.

Das hier rufe ich beim Programmstart auf. Alles was unnötig ist (alle anderen Komponenten die angesteurt werden) habe ich entfernt.
Delphi-Quellcode:
procedure TDragDropHandler.DragDropAcceptFilesGlobal(const aForm: TForm; const Accept: LongBool);
begin
 DragAcceptFiles(MainForm.Image1.Canvas.Handle, Accept);
end;
Ausgewertet wird hier
Delphi-Quellcode:
procedure TDragDropHandler.DragDropHandleProcess(Wnd: HWND; Path: string);
begin
 if Assigned(MainForm) and (Wnd = MainForm.Image1.Canvas.Handle) then
  MainForm.X := Y;
end;
Und hier wird DragDropHandleProcess angesteuert
Delphi-Quellcode:
procedure TComponents.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
const
 BufferLength = 255;
var
 QtyDroppedFiles, FileIndex: Integer;
 pDroppedFilename: array [0 .. BufferLength] of Char;
begin
 Handled := False;

 case Msg.message of
  WM_DROPFILES:
   begin
    QtyDroppedFiles := DragQueryFile(Msg.WParam, Cardinal(-1), nil, 0);

    try
     for FileIndex := 0 to QtyDroppedFiles - 1 do
      begin
       DragQueryFile(Msg.WParam, FileIndex, @pDroppedFilename, BufferLength);

       TDragDropHandler.DragDropHandleProcess(Msg.HWND, PChar(@pDroppedFilename));
       Break;
      end;
    finally
     DragFinish(Msg.WParam);
     Handled := True;
    end;
   end;
 end;
end;
TImage hat kein Handle und das vom Canvas scheint nicht zu funktionieren. Ich könnte das umschreiben, sodass ich kein Handle mehr übergebe sondern die Komponente selber, also TWinControl oder vielleicht TComponent als Parameter.

Jetzt aber die Frage. Was schreibe ich in DragDropAcceptFilesGlobal, damit Drag n Drop akzeptiert wird? Bei einem Edit zum Beispiel wäre das Edit1.Handle.

Als kleinen Pfusch könnte man ein StaticText über das Image legen, ohne Caption. Das hat ein Handle.

Rolf Frei 10. Jan 2020 17:26

AW: Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
Hast du schon versucht das Form.Handle zu nutzen oder Applicaiton.Handle. Du müsstest dann noch festellen was auf der Form an der besagten DROP-Position für ein Control liegt und gegebenfalls was machen oder halt ignorieren, wenn es sich da nicht um das TImage handelt.

DieDolly 10. Jan 2020 17:37

AW: Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
Auf die idee bin ich noch gar nicht gekommen.

Ich habe es jetzt etwas anders gemacht, aus zweierlei Gründen. Als erstes habe ich ein TImage. Auf dem TImage ist ein TLabel.
Vorher war es so, dass man auf eine der zwei Komponenten klicken konnte, und es ging ein Dialogfenster auf. Etwas umständlich.
Ich habe über alle zwei Komponenten jetzt ein TStaticText ohne Caption gelegt. Drag and Drop funktioniert da drauf wunderbar.

Look and Feel ist nach wie vor benutzerfreundlich und Windows-typisch.

Delbor 11. Jan 2020 11:10

AW: Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
Hi zusammen

Auf die Gefahr hin, dass ich das Problem nicht wirklich verstanden habe: wieso legst du das Image nicht einfach auf ein Panel, setzt dessen Bevelinner und Bevelouter auf none und Autosize auf true? Das Image hat auch dann kein Handle, aber Image.Parent schon.

Gruss
Delbor

himitsu 11. Jan 2020 15:05

AW: Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
TImage, TLabel, TBevel sind keine "Windows"-Komponenten und besitzen keine eigenen HWND und Canvas/DC auf der Form.

Sie hängen sich in das Zeichenereignis ihres Parents ein und zeichnen sich auf dessen Canvas.


Also, wie schon mitbekommen, kannst du die Form und dessen Handle nutzen,
oder z.B. ein Panel (ohne Rahmen) hinter dein Image und dort dann das aktivieren.



Nur TLabel hat eine "eigene" Lösung, denn die "echte" TEXT-Komponente vom Windows ist im Delphi enthalten und nennt sich TStaticLabel, welches dann ein eigenes HWND/DC besitzt.
Der Gund ist: einsparung von Handles, denn die ersten Windowsen hatten nicht Viele und so kann die Komponente auch sehr einfach transparent werden, indem sie nicht alle Pixel ihres Parents unter sich übermalt.

DieDolly 11. Jan 2020 18:52

AW: Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
Zitat:

Auf die Gefahr hin, dass ich das Problem nicht wirklich verstanden habe: wieso legst du das Image nicht einfach auf ein Panel, setzt dessen Bevelinner und Bevelouter auf none und Autosize auf true? Das Image hat auch dann kein Handle, aber Image.Parent schon.
Wie würdet ihr es denn eher machen. Image auf Panel oder StaticText auf Image ?

Delbor 12. Jan 2020 00:36

AW: Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
Hi DieDolly

Legst du das Image aufs Panel, brauchst du Platz für Image.Parent.Boundsrect (oder so). Beim StaticText(oder was auch immer, solange es TWinControl ist), auch - aber du musst zusätzlich StaticText.Boundsrect auf die Masse des Image bringen, das Statictext unsichtbar (und wohl auch disabled) machen. Und wie willst du das Image anklicken, wen es vom Staic verdeckt wird? Und wie willst du das Static anklicken, wenn es disabled und unsichtbar ist?

Gruss
Delbor

DieDolly 12. Jan 2020 20:16

AW: Windows Explorer DragNDrop auf TImage (DragAcceptFiles)
 
Zitat:

das Statictext unsichtbar (und wohl auch disabled) machen. Und wie willst du das Image anklicken,
Das Image ist nicht klickbar. Klickbar ist das StaticText und es ist auch Enabled.


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