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!