AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Drag & Drop: Dateien aus verschiedenen Ordnern verschieben

Drag & Drop: Dateien aus verschiedenen Ordnern verschieben

Ein Thema von martinf16 · begonnen am 8. Apr 2009 · letzter Beitrag vom 10. Apr 2009
Antwort Antwort
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#1

Drag & Drop: Dateien aus verschiedenen Ordnern verschieb

  Alt 8. Apr 2009, 14:55
Hallo,

ich habe noch einmal eine Frage zu Drag und Drop. Und zwar verschieben ich Dateien von einer ListView in den Explorer. Dazu habe ich mich der folgenden Unit bedient:

http://www.swissdelphicenter.ch/de/showcode.php?id=2335

Das funktioniert auch alles ganz gut, allerdings nur solange wie die Dateien alle im selben Ursprungsordner liegen, da der Ordner nur einmal übergeben wird.

Nun habe ich die procedure entsprechend umgeschrieben um eine Fallunterscheidung vorzunehmen. Das geht auch alles ganz gut bis auf den Bereich der als problematisch gekennzeichnet ist.

Delphi-Quellcode:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
const
  Threshold = 5;
var
  SelFileList, hilfsliste: TStringlist;
  i: Integer;
  path: string;
  DataObject: IDataObject;
  Effect: integer;

begin
  with Sender as TListView do
  begin

    if (SelCount > 0) and (csLButtonDown in ControlState)
      and ((Abs(X - FDragStartPos.x) >= Threshold)
      or (Abs(Y - FDragStartPos.y) >= Threshold)) then
      begin
      Perform(WM_LBUTTONUP, 0, MakeLong(X, Y));
      SelFileList := TStringList.Create;
      Effect := DROPEFFECT_NONE;
      try
   //auslesen der dateinamen die zu kopieren sind
        SelFileList.Capacity := SelCount;
        for i := 0 to Items.Count - 1 do
          if Items[i].Selected then SelFileList.Add(listview1.Items[i].SubItems[0]);

        if selfilelist.Count = 1 then
          begin //ein element
            path:=extractfilepath(selfilelist[0]);
            selfilelist[0]:=extractfilename(selfilelist[0]);
            DataObject := GetFileListDataObject(path, SelFileList);
            DoDragDrop(DataObject, Self, DROPEFFECT_COPY, Effect);
          end else //mehrere elemente
          begin
            selfilelist.Sort;
            //alle gleicher stammordner
            if extractfilepath(selfilelist[0]) = extractfilepath(selfilelist[selfilelist.count-1]) then
            begin
              path:=extractfilepath(selfilelist[0]);
              for i:=0 to selfilelist.count-1 do selfilelist[i]:=extractfilename(selfilelist[i]);
              DataObject := GetFileListDataObject(path, SelFileList);
              DoDragDrop(DataObject, Self, DROPEFFECT_COPY, Effect);
            end else
            begin
            // unterschiedliche stammordner
//BEGINN problematischer Bereich
              hilfsliste:=tstringlist.Create;
              hilfsliste.add('');
              for i := 0 to selfilelist.count - 1 do
                begin
                  path:=extractfilepath(selfilelist[i]);
                  hilfsliste[0]:=extractfilename(selfilelist[i]);
                  DataObject := GetFileListDataObject(path, hilfsliste);
                  DoDragDrop(DataObject, Self, DROPEFFECT_COPY, Effect);
                end;
              hilfsliste.Free;
//ENDE problematischer Bereich
            end;

          end;

      finally
        SelFileList.Free;
      end;

    end;
  end;
end;
Nun funktioniert das Kopieren einer einzigen Datei, das Kopieren von mehreren Datein aus dem gleichen Ursprungsordner aber nicht das Kopieren von Dateien aus unterschiedlichen Ursprungsordnern. Das Problem liegt also anscheinend in dem kopierten Bereich oben. Die Schleife wird vollständig durchlaufen, aber nur die erste Datei der Schleife wird kopiert.

Kann es daran liegen dass die Funktion DoDragDrop nur einmal pro procedure aufgerufen werden darf - warum auch immer?! Ich habe auch schon mit dem Perform(WM_LBUTTONUP, 0, MakeLong(X, Y)); experimentiert und das zum Beispiel mit in die Schleife kopiert. Wieder wurde aber nur eine einzige Datei kopiert..

Vielleicht kann mir jemand von euch helfen... Vielen Dank schon mal!
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.163 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 8. Apr 2009, 22:00
Hallo martinf16,

evtl. liegt dein Problem in den Zeilen 55 und 56.
Müsste die Zuweisung deiner TStringList (hilfsliste) zum DataObject nicht außerhalb der Schleife erfolgen?
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 8. Apr 2009, 22:21
GetFileListDataObject benötigt als Parameter eine Stringliste, diese ändert sich aber in jedem Schleifendurchlauf, da sich ja der path ändert. Oder muss man das DataObject anschließend löschen, bevor man es wieder neu füllen kann? Schließlich funktioniert die Geschichte ja, eben nur bei einem Schleifendurchlauf und einer kopierten Datei.

Ich bin auch für andere Lösungen offen. Zum Beispiel habe ich daran gedacht in der Schleife das ganze mit CopyFile zu verwirklichen. Dafür weiß ich aber nicht wie man den Zielordner bestimmen kann.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.163 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 9. Apr 2009, 20:17
Hallo,

man kann den Directory-Parameter leer lassen und in der Stringlist zusätzlich den Pfad mit abspeichern.
(also ein ganz anderes Konzept)

DataObject := GetFileListDataObject('', SelFileList); Ansonsten beschreib mal bitte etwas genauer deine Anforderungen.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#5

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 9. Apr 2009, 20:23
du könntest notfalls vorher die Dateien auch erstmal in ein gemeinsames/temporäres Verzeichnis kopieren und Diese erst dann an das Drag&Drop-Kopieren/Verschieben übergeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 10. Apr 2009, 13:45
@juergen:
Genial, da bin ich jezt nicht drauf gekommen, das entspricht genau meinen Anforderungen und funktioniert perfekt.

@himitsu:
Eine ähnliche Idee hatte ich auch, aber sie doch als Notlösung wieder verworfen. Denn bei großen Dateimengen kann das doppelte Kopieren schon Probleme bereiten, falls nicht genug Speicherplatz vorhanden ist - mal abgesehen von der erforderlichen Zeit dafür.

Vielen Dank!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#7

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 10. Apr 2009, 13:49
man hätte auch statt Kopieren dieses verschieben können
und unter NTFS besteht die Möglichkeit Hard-Links

aber direkt wär wirklich besser/einfacher, vorallem im Falle das Programm stürzt mal ab, bzw. man vergißt dieses wieder aufzuräumen.
(der Tempordner wird ja so schon von zuvielen Programmen vollgemüllt )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.163 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 10. Apr 2009, 14:03
Hallo martinf16,

noch ein Tipp:
Deklariere die Variable Effect vom Datentyp her als LongInt
Effect: LongInt; Ich hatte mich etwas länger mit dieser Unit beschäftigt und war dabei an der o.g. Stelle auf die Nase gefallen...
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
martinf16

Registriert seit: 26. Aug 2007
99 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Drag & Drop: Dateien aus verschiedenen Ordnern versc

  Alt 10. Apr 2009, 20:33
Zitat von juergen:
Hallo martinf16,

noch ein Tipp:
Deklariere die Variable Effect vom Datentyp her als LongInt
Effect: LongInt; Ich hatte mich etwas länger mit dieser Unit beschäftigt und war dabei an der o.g. Stelle auf die Nase gefallen...
Was kann denn passieren wenn man nicht LongInt nimmt??
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:05 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