Hallo! Ich möchte euch eine eigene Problemlösung vorstellen und euch zugleich fragen, was ihr davon haltet.
Ich verwende eine
TDropFileTarget-Komponente aus der
The new Drag and Drop Component Suite for Delphi, um Dateien aus dem Windows Explorer mit der Maus auf mein Programm zu ziehen und einzufügen. Dabei verarbeitete ich die gedroppten Dateien zuerst im
OnDrop Event-Handler der TDropFileTarget-Komponente:
Delphi-Quellcode:
procedure TForm1.DropFileTarget1Drop(Sender: TObject; ShiftState:
TShiftState; APoint: TPoint; var Effect: Integer);
var
Strings: TStringList;
begin
Strings := TStringList.Create;
try
Strings.Assign(DropFileTarget1.Files); // UnicodeStrings nach Strings transferieren
ProcessFiles(Strings);
finally
Strings.Free;
end;
end;
Das führte jedoch zu dem Problem, dass bei dieser Verarbeitung evtl. erscheinende Dialoge von dem zu diesem Zeitpunkt immer noch existierenden Drag-Bild teilweise verdeckt wurden, was sehr hässlich aussah. Da ich keine Möglichkeit fand, das Drag-Bild schon im OnDrop-Event-Handler auszublenden, überlegte ich mir, dass die Verarbeitung der Dateien dann eben NACH dem Verlassen des OnDrop-Event-Handlers erfolgen sollte, wobei nach Beendigung des OnDrop-Events das Drag-Bild natürlich von der Komponente selbst ausgeblendet wurde. (Ich wollte auch nicht im Quelltext der Komponente herumpfuschen, weil dadurch ein Update auf neuere Versionen dann umständlich und fehleranfällig sein würde). So kam ich auf folgende Lösung:
Delphi-Quellcode:
implementation
var
DroppedFiles: TStringList;
procedure TForm1.FormCreate(Sender: TObject);
begin
DroppedFiles := TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DroppedFiles.Free;
end;
procedure TForm1.DropFileTarget1Drop(Sender: TObject; ShiftState:
TShiftState; APoint: TPoint; var Effect: Integer);
begin
DroppedFiles.Assign(DropFileTarget1.Files);
end;
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
if DroppedFiles.Count > 0 then
begin
ProcessFiles(DroppedFiles);
DroppedFiles.Clear;
Done := True;
end;
end;
Was haltet ihr davon? Kann man das so verwenden, oder könnte das zu Komplikationen führen?