Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WMDropfiles (Var MSG: TMessage) (https://www.delphipraxis.net/185602-wmdropfiles-var-msg-tmessage.html)

markus5766h 23. Jun 2015 19:21

WMDropfiles (Var MSG: TMessage)
 
Moin an Alle.
Ich benötige 'mal Eure Hilfe.

foldenden Code benutze ich schon seit längerer Zeit.

Delphi-Quellcode:
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;
...hat bisher auch immer funktioniert (allerdings - schon ein paar Jahre her - XP-Zeiten).
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 . . .

Uwe Raabe 23. Jun 2015 20:18

AW: WMDropfiles (Var MSG: TMessage)
 
Keine Ahnung ob das was bringt, aber die Casts auf
Delphi-Quellcode:
PChar
sind irgendwie überflüssig (siehe Deklaration von FileName) und sollten besser durch Casts auf
Delphi-Quellcode:
string
ersetzt werden.

Da mein Delphi 7 viel zu tief unten im Stapel der Zeit liegt, kann ich es gerade leider nicht ausprobieren.

markus5766h 23. Jun 2015 20:24

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.

himitsu 23. Jun 2015 20:36

AW: WMDropfiles (Var MSG: TMessage)
 
Wofür ist das
Delphi-Quellcode:
Application.ProcessMessages;
gut?
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.

markus5766h 23. Jun 2015 21:12

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.

rwalper 23. Jun 2015 21:33

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:
Filename
kopierst und dann in die Stringlist kopierst:
Delphi-Quellcode:
var
  ...
  sFileName: string;
...
      sFileName := FileName;
      DragList.Add (sFileName); // Liste füllen

Uwe Raabe 23. Jun 2015 21:36

AW: WMDropfiles (Var MSG: TMessage)
 
Zitat:

Zitat von rwalper (Beitrag 1306333)
Nur mal zum Test: Versuche es mit einer 2. Filename-Variable vom Typ String, in der Du den Inhalt von
Delphi-Quellcode:
Filename
kopierst und dann in die Stringlist kopierst:

Das wäre ungefähr das, was ich durch den Cast auf string erreichen wollte...

markus5766h 23. Jun 2015 21:51

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 . . .

Uwe Raabe 23. Jun 2015 23:05

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.

markus5766h 24. Jun 2015 10:10

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