Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   erkennen ob Verzeichnis oder Datei bei dragover (https://www.delphipraxis.net/187278-erkennen-ob-verzeichnis-oder-datei-bei-dragover.html)

alfold 13. Nov 2015 20:43

erkennen ob Verzeichnis oder Datei bei dragover
 
Gibt es überhaupt die Möglichkeit schon beim DragOver zu erkennen, was über der jeweiligen Komponente schwebt?
Beim Drop ist es ja kein Problem aber schon zu spät.

Grund: Ich möchte, wenn ein Verzeichnis auf die falsche Komponente gezogen wird dropen verbieten bzw. wenn Datei dann erlauben!

Geht das überhaupt? Gefunden hab ich bis jetzt nichts!

Gruss alf

CarstenB 13. Nov 2015 21:09

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Ja, das geht. Du musst das Interface "IDropTarget" einbauen.

Dann kannst du mit RegisterDragDrop/RevokeDragDrop deine Komponente als Ziel an-/abmelden und in den entsprechenden Events filtern.

alfold 13. Nov 2015 22:32

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Erstmal Danke für die Antwort.
Verstehen tu ich es noch nicht. :gruebel:
Leider sind die Beispiele die ich gefunden habe nicht allgemein, um es gleich zu kapieren. Aber übung macht den Meister :coder2:
Mal sehen ob ich es verstehe?

Gruß alfold

CarstenB 13. Nov 2015 23:17

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
http://development.mwcs.de/shelldropper.html

Hab's nicht ausprobiert, aber vielleicht hilft dir das weiter.

alfold 13. Nov 2015 23:51

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Habs gerade im Test IDropTarget. Funct auch, aber im Dragover mH:gruebel:
Keine Ahnung wie ich da abfragen soll. Dort werden keine IDataObject übergeben nur im Drop!
Woher nehme ich die Information was da drüber schwebt?

Ich befürchte das dies nie vorgesehen ist und war und demzufolge auch niemand in DrogOver einbezogen hat. So auch bei Shelldropper, habs mir gerade angeschaut.
Auch ander Componenten haben so was nicht drin.

Ich gehe nun davon aus das ich das selber in der funktion DragOver einarbeiten muss.
Ich teste das mal mit Shelldropper. Ich hoffe das Martin nichts dagegen hat.

ringli 14. Nov 2015 10:25

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Wenn du sonst keine andere Lösung findest, könntest du den Pfad - den du per Drag & Drop erhältst - selber prüfen ob es sich hier um eine Datei oder ein Verzeichnis handelt. Einen Ansatz dazu findest du bspw. hier: http://www.delphi-treff.de/tipps-tri...ute-ermitteln/

alfold 14. Nov 2015 10:31

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Gefunden!
Im DragEnter kan man das abfragen.
Ich wusste nicht das DragEnter vor Drop ausgeführt wird:mrgreen:
Wieder was gelernt:wink:
Danke für die Hilfe.

CarstenB 14. Nov 2015 10:47

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Sorry das ich dir da ad-hoc keine genaueren Infos geben konnte... Ist schon eine Weile her, dass ich das eingebaut habe.

Helmi 15. Nov 2015 20:09

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Hallo,

ich stand mal vor einem ähnlichen Problem
Ich wollte/musste rausfinden, ob via Drag&Drop eine Datei oder ein Pfad in ein Edit gezogen wird.

Hab dann das hier gefunden.

Hab´s dann für mich so geändert:
Delphi-Quellcode:
procedure TMainForm.ApplicationEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
const
  BufferLaenge = 255;

var
  i: Integer;
  Anzahl_Dateien: Integer;

  Dropped_Dateiname: array[0..BufferLaenge] of Char;

begin
//www.delphipraxis.net/1005177-post2.html

  If Msg.message = WM_DROPFILES then
    begin
      Anzahl_Dateien := DragQueryFile(Msg.wParam, Cardinal(-1), nil, 0);

      try
        for i := 0 to Pred(Anzahl_Dateien) do
          begin
            DragQueryFile(Msg.wParam, i, @Dropped_Dateiname, BufferLaenge);

            If Msg.hwnd = LabeledButtonEdit_NCUpgrade.Handle then
              begin

                If FileType(PChar(@Dropped_Dateiname)) = FT_File then
                  LabeledButtonEdit_NCUpgrade.Text := PChar(@Dropped_Dateiname);
              end;

            If Msg.hwnd = LabeledButtonEdit_Ablagepfad.Handle then
              begin
                If FileType(PChar(@Dropped_Dateiname)) = FT_Directory then
                  LabeledButtonEdit_Ablagepfad.Text := PChar(@Dropped_Dateiname);
              end;
          end;
      finally
        DragFinish(Msg.wParam);
        Handled := true;
      end;
    end;
end;

alfold 16. Nov 2015 10:06

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Danke. @Helmi

Aber auch hier wird nicht vor dem Drop geprüft.

Mir ging es ausschliesslich darum vor dem Drop die Prüfung zu machen, im Prinzip beim DragOver.

Gruß alfold

Helmi 16. Nov 2015 18:10

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Ich bin mir überhaupt nicht sicher, dass dein Vorhaben überhaupt geht.

Wenn ich mir vorstelle, ich nimm eine Datei aus dem Windows Explorer und zieh sie in meine Anwendung.

Wenn ich dich richtig verstanden habe, so müsste die Prüfung ja schon beim "Anpacken der Datei" passieren.
Da ist sie ja noch im Explorer - erst wenn ich sozusagen mit der Maus über meiner Anwendung bin, kann
ich prüfen was ich bekomme.

alfold 16. Nov 2015 20:07

AW: erkennen ob Verzeichnis oder Datei bei dragover
 
Ja es geht, zumindesten mit IDropTarget. Wenn man in der DropEnter Funktion
abfragt ob Datei oder Verzeichnis.
Delphi-Quellcode:
if DirectoryExists(szBuffer) then
        is_Dir:= True
      else
        is_Dir:= False;
Dann kann man bei DragOver mit
Delphi-Quellcode:
if is_Dir then
  dwEffect := DROPEFFECT_NONE
else
  dwEffect := DROPEFFECT_COPY ;

Result := S_OK;
das dann dementsprechend auswerten.
So funktioniert es jedenfals bei mir:thumb:

getestet mit WinXP. Auf Win7 bin ich noch nicht dazu gekommen.

EDIT: Wenn ich MS richtig verstehe(kann leider kein Engl) wird DropEnter vor allem ausgeführt. So kann die Applikation entscheiden was sie damit anfangen will.
Zumal DropEnter und Drop identisch in ihrem Aufruf sind!
Warum allerdings das nirgends in Delphi "OnDragEnter" oder in den Externen Dropper komponenten mit drin ist verstehe ich nicht!?

Gruß alfold


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