WMDropfiles (Var MSG: TMessage)
Moin an Alle.
Ich benötige 'mal Eure Hilfe. foldenden Code benutze ich schon seit längerer Zeit.
Delphi-Quellcode:
...hat bisher auch immer funktioniert (allerdings - schon ein paar Jahre her - XP-Zeiten).
procedure TfrmMain.WMDropFiles (Var Msg: TMessage);
var Idx, Size, FileCount: Integer; FileName: PChar; begin FileCount := -1; DragList.Clear; Inherited; FileCount := DragQueryFile(Msg.WParam, $FFFFFFFF, Nil, 255); // File Count for Idx := 0 to FileCount -1 do begin Size := DragQueryFile (Msg.WParam, Idx, Nil, 0) + 1; FileName := StrAlloc(Size); DragQueryFile (Msg.WParam, Idx, FileName, Size); //ShowMessage(FileName); //<-------------- Kontrolle DragList.Add (FileName); // Liste füllen StrDispose(FileName); end; // end File Count DragFinish (Msg.WParam); //ShowMessage(IntToStr(FileCount)); //<-------------- Kontrolle //ShowMessage(IntToStr(DragList.Count)); //<-------------- Kontrolle if DragList.Count > 0 then SetDragging(Self) // Aktion on drop // CopyDrag(Self) else ShowMessage('keine Dateinamen in der Liste !'); end; Nun stellt sich folgendes Problem dar : lasse ich das erste ShowMessage(PChar(FileName)); weg bzw. als Kommentar ist die DragList (TStringList) leer, mit dem ShowMessage ist alles in Ordnung. Dieses Verhalten ist zu jeder Zeit bei mir nachstellbar. Delphi 7.0 Win 7 Prof. 64 Bit Das entspr. Programm wird mit Admin-Rechten gestartet, ProzessPriorität habe ich schon auf "ABOVE_NORMAL" gesetzt - bringt auch nichts, zumal das Programm zur Zeit obiger Prozedur sonst nichts zu tun hat. Hat jemand eine Idee ? Ich steh' zur Zeit ziemlich auf dem Schlauch . . . |
AW: WMDropfiles (Var MSG: TMessage)
Keine Ahnung ob das was bringt, aber die Casts auf
Delphi-Quellcode:
sind irgendwie überflüssig (siehe Deklaration von FileName) und sollten besser durch Casts auf
PChar
Delphi-Quellcode:
ersetzt werden.
string
Da mein Delphi 7 viel zu tief unten im Stapel der Zeit liegt, kann ich es gerade leider nicht ausprobieren. |
AW: WMDropfiles (Var MSG: TMessage)
o.k. die Casts auf PChar sind überflüssig, bringt aber auch nichts im Ergebnis - leider.
Danke für den Hinweis. |
AW: WMDropfiles (Var MSG: TMessage)
Wofür ist das
Delphi-Quellcode:
gut?
Application.ProcessMessages;
Es könnte eventuell die Messagebehandlung schrotten. Und ADMIN + Messages .. Nicht-Anminanwendungen haben da ein paar kleine Probleme, mit fehlenden Rechten eine Message an die Adminanwendung zu schicken, wobei z.B. der Desktop und Explorer meistens nicht als Admin laufen. Und ab D2009 würde es eventuell knallen, aufgrund der falschen Verwendung von Size. |
AW: WMDropfiles (Var MSG: TMessage)
... das Application.ProcessMessages hab' ich 'rausgeschmissen . . . war auch nur ein verzweifelter Versuch,
da beim Droppen noch ein MouseEnter und MouseMove abgearbeitet werden muss. Die Casts auf PChar im ersten Beitrag sind auch entfernt. Auch ohne Admin-Rechte habe ich das gleiche Verhalten. Die Dateinamen kommen ja an (richtige Verzeichnisse, korrekte Anzahl) - landen nur eben ohne den Umweg über das ShowMessage nicht in der DragList. |
AW: WMDropfiles (Var MSG: TMessage)
Nur mal zum Test: Versuche es mit einer 2. Filename-Variable vom Typ String, in der Du den Inhalt von
Delphi-Quellcode:
kopierst und dann in die Stringlist kopierst:
Filename
Delphi-Quellcode:
var
... sFileName: string; ... sFileName := FileName; DragList.Add (sFileName); // Liste füllen |
AW: WMDropfiles (Var MSG: TMessage)
Zitat:
|
AW: WMDropfiles (Var MSG: TMessage)
... leider auch nicht,
was allerdings funktioniert : FileName in ein TMemo schreiben - ohne Probleme. Stellt sich mir die Frage, warum dies (scheinbar) nur bei visuellen Komponenten funktioniert . . . |
AW: WMDropfiles (Var MSG: TMessage)
Hast du mal versucht, mit dem Debugger das nachzuverfolgen?
Ich kann das Problem unter XE8 jedenfalls nicht nachvollziehen. Es kann dann eigentlich nur noch an Delphi 7 liegen. |
AW: WMDropfiles (Var MSG: TMessage)
... scheint ein Timing-Problem zu sein,
mit einem Delay(250) in der nachfolgenden Prozedur läuft's ohne Probleme - kann ich erst mal mit leben
Delphi-Quellcode:
. . . procedure Delay(Milliseconds: Integer); var Tick: DWord; Event: THandle; begin Event := CreateEvent(nil, False, False, nil); try Tick := GetTickCount + DWord(Milliseconds); while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do begin Application.ProcessMessages; if Application.Terminated then Exit; Milliseconds := Tick - GetTickcount; end; finally CloseHandle(Event); end; end; . . . procedure TfrmMain.SetDragging(Sender: TObject); var i : Integer; begin Application.ProcessMessages; Delay(250); if DragState < 25 then begin . . . vielen Dank für die Denkanstöße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 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