Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   dragdrop (https://www.delphipraxis.net/170075-dragdrop.html)

EWeiss 29. Aug 2012 15:40

dragdrop
 
Einfache frage wie komme ich an das Fensterhandle
auf dem die Datei fallen gelassen wurde?

GetWindowFromPoint
ChildWindowFromPoint

funktionieren leider nicht.

gruss

himitsu 29. Aug 2012 15:55

AW: dragdrop
 
Kommt drauf an, womit du es Dragst, bzw. Dropst. :roll:

EWeiss 29. Aug 2012 16:24

AW: dragdrop
 
Zitat:

Zitat von himitsu (Beitrag 1180531)
Kommt drauf an, womit du es Dragst, bzw. Dropst. :roll:

Was hat das damit zu tun?
Ich möchte das Handle des Fensters erfahren auf das die Datei abgelegt wurde.

Dabei spielt es doch keine rolle was für eine das ist.

gruss

Bummi 29. Aug 2012 16:30

AW: dragdrop
 
himi's Frage dürfte darauf basieren wann/wo in Deinem Code
WindowFromPoint ausgeführt wird, da folgendes funktioniert.
Delphi-Quellcode:
procedure TForm5.Timer1Timer(Sender: TObject);
var
 hwnd:THandle;
begin
  hwnd := WindowFromPoint(mouse.CursorPos);
  Caption := IntToHex(HWND,8);
end;

himitsu 29. Aug 2012 16:34

AW: dragdrop
 
Und dann noch, ob es absolute Positionen sind, oder Relative und wenn relativ, zu was sind sie relativ.

EWeiss 29. Aug 2012 17:00

AW: dragdrop
 
Zitat:

Zitat von himitsu (Beitrag 1180538)
Und dann noch, ob es absolute Positionen sind, oder Relative und wenn relativ, zu was sind sie relativ.

Delphi-Quellcode:
    WM_DROPFILES:
    begin
      nFilesDropped := DragQueryFile(wP, LongWord(-1), '', 0);
      sFileName := '';

      if nFilesDropped = 1 then
      begin
        SetLength(sFileName, DragQueryFile(wP, 0, nil, 0));
        DragQueryFile(wP, 0, @sFileName[1], Length(sFileName) + 1);
        sFileName := LowerCase(sFileName);

        goProgBar.Dirty := True;
        oButton.BmpFile := sFileName;
        IconHandle := GetHIconFromFile(sFileName);
        img := SKAERO_GetButImageBackProperty(ButtonHandle); // GetWindowFromPoint wird in WM_MOUSEMOVE eingelesen , ButtonHandle
      end;
      DragFinish(wP);
      SetForegroundWindow(WinHandle);
    end;
Ich ziehe irgendeine Datei über meinen Button extrahiere daraus das Icon
anschließend will ich dieses mit dem Image des Button Kombinieren.
Das geht aber nicht da ich so nicht an das Handle des Button komme.

EDIT:
Bin ja heute wieder so was von bescheuert... :wall:
Ohne das einholen der CursorPos kann es ja auch nicht gehen.

gruss

Bummi 29. Aug 2012 17:22

AW: dragdrop
 
-Hat der Button ein Handle (nur um sicher zu gehen)
-müsste dann nicht in seinem Messagehandler o.g. Code abgefackelt werden (quasi Self) ?

EWeiss 29. Aug 2012 17:29

AW: dragdrop
 
Zitat:

Zitat von Bummi (Beitrag 1180540)
-Hat der Button ein Handle (nur um sicher zu gehen)
-müsste dann nicht in seinem Messagehandler o.g. Code abgefackelt werden (quasi Self) ?

Danke..
Schau mal mein Edit an ;)

gruss

shmia 29. Aug 2012 17:55

AW: dragdrop
 
In deinem Codebeispiel vermischen sich Dinge, die nicht zusammengehören. :warn:

Folgende Prozedure liefert alle gedroppten Dateien in einer Stringliste und zusätzlich (aber optional) den Punkt relativ zum Desktop Ursprung.
Delphi-Quellcode:
procedure GetDroppedFiles(HDrop:THandle; filelist:TStrings; Point:PPoint);
var
   i, filecount, size : Integer;
   s : string;
begin
   Assert(Assigned(filelist));

   filecount := DragQueryFile(HDrop, $FFFFFFFF, nil, 0);
   for i:= 0 to filecount-1 do
   begin
      size := DragQueryFile(HDrop, i, nil, 0);
      SetLength(s, size);
      DragQueryFile(HDrop, i, PChar(s), size+1);
      filelist.Add(s);
   end;

   if Assigned(Point) then
      if not DragQueryPoint(HDrop, Point^) then
      begin
         // Punkt war ausserhalb des Fensters
         Point^.x := -1;
         Point^.y := -1;
      end;

   DragFinish(HDrop);
end;

EWeiss 29. Aug 2012 18:13

AW: dragdrop
 
Zitat:

die nicht zusammengehören.
Dann sag mir mal bitte welche das sein sollen ;)
Ich möchte nur einen eintrag zulassen daher habe ich mir die abfrage nach filecount gesparrt.

Es macht auch keinen sinn auf einen Button mehr als ein Bitmap ziehen zu wollen.

gruss

shmia 29. Aug 2012 18:39

AW: dragdrop
 
Zitat:

Zitat von EWeiss (Beitrag 1180548)
Dann sag mir mal bitte welche das sein sollen ;)

Delphi-Quellcode:
// kommentierter Sourcecode
WM_DROPFILES:
    begin
      // es geht los
      // ganz offensichtlich soll die Namen von gedroppten Dateien ermittelt werden
      nFilesDropped := DragQueryFile(wP, LongWord(-1), '', 0);
      sFileName := ''; // <= überflüssiger Code

      // Wenn es nur eine Datei gab, dann ist das ein Spezialfall des allgemeinen Falls
      // dass mehrere Dateien möglich sind.
      // Entweder verarbeitet man nur die 1. Datei oder man muss dem User sagen,
      // dass er nur eine Datei droppen darf
      if nFilesDropped = 1 then
      begin
        SetLength(sFileName, DragQueryFile(wP, 0, nil, 0));
        DragQueryFile(wP, 0, @sFileName[1], Length(sFileName) + 1);

        // Nanu, weshalb wird jetzt der Dateiname verfälscht?
        // das macht doch keinen Sinn
        sFileName := LowerCase(sFileName);

        // was nun folgt hat nix mit Drag & Drop zu tun ***
        goProgBar.Dirty := True; // Hä?
        oButton.BmpFile := sFileName; // ein Dateiname wird einem Button zugewiesen
        IconHandle := GetHIconFromFile(sFileName); // was passiert mit dem IconHandle?
       
        GetCursorPos(p); // falsch, DragQueryPoint() muss benützt werden
        img := SKAERO_GetButImageBackProperty(Windowfrompoint(p));
        // hier endet der Code, der nix mit Drag & Drop zu tun hat ***
      end;
      DragFinish(wP); // ok, Drag & Drop ist fertig
      SetForegroundWindow(WinHandle); // wozu ?
    end;
Der Code zwischen den Zeilen die mit *** markiert sind hat dort nichts verloren.
Stattdessen dürfte dort nur ein Funktionsaufruf stehen:
Delphi-Quellcode:
// sauberer Sourcecode
WM_DROPFILES:
    begin
      // es geht los
      // ganz offensichtlich soll die Dateinamen von gedroppten Dateien ermittelt werden
      nFilesDropped := DragQueryFile(wP, LongWord(-1), '', 0);
      if nFilesDropped >= 1 then
      begin
        // 1. Dateiname holen
        SetLength(sFileName, DragQueryFile(wP, 0, nil, 0));
        DragQueryFile(wP, 0, @sFileName[1], Length(sFileName) + 1);
        DragQueryPoint(wP, p);
       
        ChangeButtonPicture(sFileName, p);
      end;
      DragFinish(wP); // ok, Drag & Drop ist fertig
    end;

EWeiss 29. Aug 2012 18:50

AW: dragdrop
 
Delphi-Quellcode:
sFileName := ''; // <= überflüssiger Code
Ok.

Delphi-Quellcode:
sFileName := LowerCase(sFileName);
kann ich auch noch nachvollziehen.

Zitat:

// was nun folgt hat nix mit Drag & Drop zu tun ***
Delphi-Quellcode:
ChangeButtonPicture(sFileName, p);

Ob ich nun innerhalb DragDrop meine Dateien verarbeite oder innerhalb von dragdrop
auf eine function außerhalb dragdrop verweise ist letztendlich das gleiche.
Denn auch hier wird dragdrop dann unterbrochen bzw.. meine funktionen verarbeitet.

Da muss ich also gegenhalten
// was nun folgt hat nix mit Drag & Drop zu tun ***
Delphi-Quellcode:
ChangeButtonPicture(sFileName, p);

Aber Ok ist eine saubere lösung.

Delphi-Quellcode:
GetCursorPos(p); // falsch, DragQueryPoint() muss benützt werden
img := SKAERO_GetButImageBackProperty(Windowfrompoint(p));
Hatte ich im Sample oben schon korrigiert.

Delphi-Quellcode:
SetForegroundWindow(WinHandle); // wozu ?

Kann man sich auch sparen korrekt.
Delphi-Quellcode:
if nFilesDropped >= 1 then


Mehr auf keinen Fall.
Zumal das dann hier ein Zähler von nöten wäre..
Delphi-Quellcode:
SetLength(sFileName, DragQueryFile(wP, Zähler, nil, 0));
DragQueryFile(wP, Zähler, @sFileName[1], Length(sFileName) + 1);

mehr als 1 wäre dann auch unnötig ;)

EDIT:
Delphi-Quellcode:
DragQueryPoint(wP, p);

Ist unnötig.
Bekomme damit zwar die koordinaten innerhalb des Button
aber nicht zum Screen daher kann ich damit nicht das Handle ermitteln.

Danke für die doku..

gruss


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