![]() |
DragDrop-Problemlösung
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 ![]()
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
Was haltet ihr davon? Kann man das so verwenden, oder könnte das zu Komplikationen führen?
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; |
AW: DragDrop-Problemlösung
Anstatt ApplicationEvents1Idle würde ich ein eigene Nachricht für das Form definieren und dann per SendMessage auslösen. Oder eine Form von asynchronen Methoden verwenden.
|
AW: DragDrop-Problemlösung
Besteht dann nicht (zumindest theoretisch) die Gefahr, dass die Dateibearbeitung asynchron möglicherweise bereits dann erfolgt, wenn der Drop-Event-Handler noch nicht verlassen wurde?
|
AW: DragDrop-Problemlösung
OnDrop wird ausgelöst, wenn der Vorgang "abgeschlossen" und die Dateien über dem eigenen Drop-Ziel losgelassen wurden.
Aber noch besser, in der Zwischenzeit kann die Drag-Quelle diese Dateien bereits wieder gelöscht haben. z.B. Drag&Drop aus dem Thunderbird, welcher zur Unterstützung von WM_DROPFILES die Mails/Anhänge ins Tempverzeichnis kopiert und danach natürlich brav wieder aufräumt. Entweder die Dateien sofort sperren (lesend öffnen) oder sie zumindestens kopieren, wenn man sie nicht sofort verarbeiten kann, bzw. wenn es länger dauern könnte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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