AGB  ·  Datenschutz  ·  Impressum  







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

WMDropfiles (Var MSG: TMessage)

Ein Thema von markus5766h · begonnen am 23. Jun 2015 · letzter Beitrag vom 24. Jun 2015
Antwort Antwort
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#1

WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 20:21
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 . . .
Markus H.

Geändert von markus5766h (23. Jun 2015 um 22:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 21:18
Keine Ahnung ob das was bringt, aber die Casts auf PChar sind irgendwie überflüssig (siehe Deklaration von FileName) und sollten besser durch Casts auf string ersetzt werden.

Da mein Delphi 7 viel zu tief unten im Stapel der Zeit liegt, kann ich es gerade leider nicht ausprobieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#3

AW: WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 21:24
o.k. die Casts auf PChar sind überflüssig, bringt aber auch nichts im Ergebnis - leider.
Danke für den Hinweis.
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 21:36
Wofür ist das 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.
$2B or not $2B

Geändert von himitsu (23. Jun 2015 um 21:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#5

AW: WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 22:12
... 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.
Markus H.
  Mit Zitat antworten Zitat
rwalper

Registriert seit: 6. Sep 2006
48 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 22:33
Nur mal zum Test: Versuche es mit einer 2. Filename-Variable vom Typ String, in der Du den Inhalt von Filename kopierst und dann in die Stringlist kopierst:
Delphi-Quellcode:
var
  ...
  sFileName: string;
...
      sFileName := FileName;
      DragList.Add (sFileName); // Liste füllen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 22:36
Nur mal zum Test: Versuche es mit einer 2. Filename-Variable vom Typ String, in der Du den Inhalt von Filename kopierst und dann in die Stringlist kopierst:
Das wäre ungefähr das, was ich durch den Cast auf string erreichen wollte...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#8

AW: WMDropfiles (Var MSG: TMessage)

  Alt 23. Jun 2015, 22:51
... 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 . . .
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: WMDropfiles (Var MSG: TMessage)

  Alt 24. Jun 2015, 00:05
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#10

AW: WMDropfiles (Var MSG: TMessage)

  Alt 24. Jun 2015, 11:10
... 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
Markus H.
  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 08:21 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