AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DragDrop-Problemlösung

Ein Thema von PeterPanino · begonnen am 19. Mär 2015 · letzter Beitrag vom 20. Mär 2015
Antwort Antwort
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

DragDrop-Problemlösung

  Alt 19. Mär 2015, 20:22
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?
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.643 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: DragDrop-Problemlösung

  Alt 20. Mär 2015, 07:05
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.
Sven Harazim
--
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: DragDrop-Problemlösung

  Alt 20. Mär 2015, 08:39
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: DragDrop-Problemlösung

  Alt 20. Mär 2015, 08:46
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 01:10 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