AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Empfänger bei WM_DROPPFILES unterscheiden
Thema durchsuchen
Ansicht
Themen-Optionen

Empfänger bei WM_DROPPFILES unterscheiden

Ein Thema von Luckie · begonnen am 5. Mär 2010 · letzter Beitrag vom 6. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 20:10
Ich habe viel gesucht, aber leider nichts zum Thema gefunden. Wie kann ich bei WM_DROPPFILES den Empfänger unterscheiden? Mein bisheriger Code:
Delphi-Quellcode:
procedure TfrmSteganosaur.AppMessage(var Msg: Tmsg; var Handled: Boolean);
const
  BufferLength: word = 255;
var
  DroppedFilename: string;
  FileIndex: word;
  QtyDroppedFiles: word;
  pDroppedFilename: array[0..255] of Char;
  DroppedFileLength: word;
begin
  if Msg.Message = WM_DROPFILES then
  begin
    FileIndex := $FFFF;
    QtyDroppedFiles := DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
    for FileIndex := 0 to (QtyDroppedFiles - 1) do
    begin
      DroppedFileLength := DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
      DroppedFilename := StrPas(pDroppedFilename);
      edtCarrierFile.Text := DroppedFilename;
      edtTrailerFile.Text := DroppedFilename;
    end;
    DragFinish(Msg.WParam);
    Handled := true;
  end;
end;
So wie er jetzt ist landet die Datei natürlich in beiden Edits, wenn ich sie über einem droppe.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 20:54
Könntest ja die Mausposition, an der losgelassen wurde, ermitteln und dann das dazugehörige VCL-Control...
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 20:57
Ja, das habe ich schon versucht mit DragQueryPt aber weder ClientRect noch BoundsRect von den Edit Komponenten liefert bei PtInRect true.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 22:28
Hallo Michael,

wenn das Formular die Nachricht WM_DROPFILES empfängt, bezieht sich der DropPoint auf den Client-Bereich des Formulars. Du musst also die Koordinaten auf die Client-Bereiche der Edit-Controls umrechnen (lassen):

Delphi-Quellcode:
var
  DropPoint: TPoint;
begin
  :
  DragQueryPoint(Msg.WParam, DropPoint);
  if IsDropPointInside(DropPoint, edtCarrierFile) then
    edtCarrierFile.Text := DroppedFilename
  else if IsDropPointInside(DropPoint, edtTrailerFile) then
    edtTrailerFile.Text := DroppedFilename;
  :
end;

function TfrmSteganosaur.IsDropPointInside (const aDropPoint: TPoint; const aControl: TControl): Boolean;
begin
  Result := PtInRect(aControl.ClientRect, aControl.ScreenToClient({Self.}ClientToScreen(aDropPoint)));
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 22:56
Leider liefert IsDragPointInside immer False.

Delphi-Quellcode:
function TfrmSteganosaur.IsDropPointInside(const aDropPoint: TPoint; const aControl: TControl): Boolean;
begin
  Result := PtInRect(aControl.ClientRect, aControl.ScreenToClient({Self.}ClientToScreen(aDropPoint)));
end;

procedure TfrmSteganosaur.AppMessage(var Msg: Tmsg; var Handled: Boolean);
const
  BufferLength: word = 255;
var
  DroppedFilename: string;
  FileIndex: Word;
  QtyDroppedFiles: Word;
  pDroppedFilename: array[0..255] of Char;
  DropPoint: TPoint;
begin
  if Msg.Message = WM_DROPFILES then
  begin
    FileIndex := $FFFF;
    QtyDroppedFiles := DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
    for FileIndex := 0 to (QtyDroppedFiles - 1) do
    begin
      DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
      DroppedFilename := StrPas(pDroppedFilename);
      DragQueryPoint(Msg.WParam, DropPoint);
      if IsDropPointInside(DropPoint, edtCarrierFile) then
        edtCarrierFile.Text := DroppedFilename
      else if IsDropPointInside(DropPoint, edtTrailerFile) then
        edtTrailerFile.Text := DroppedFilename;
    end;
    DragFinish(Msg.WParam);
    Handled := true;
  end;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 23:20
Zitat von Luckie:
Leider liefert IsDragPointInside immer False.
Nö, QtyDroppedFiles wird wohl den Wert 0 haben. Du solltest die Variable FileIndex mit dem Wert $FFFFFFFF initialisieren...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 23:24
Nein. QtyDroppedFiles hat den Wert eins, wenn ich eine Datei ziehe. Auch wenn ich sie mit FileIndex := $FFFFFFFF; initialisiere. Und DroppedFilename enthält auch den Dateinamen. Das passt also alles.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#8

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 5. Mär 2010, 23:52
Hast du es schon andersherum probiert? Also die Kontrollkoordinaten nach Screenkoordinaten umgerechnet?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 6. Mär 2010, 00:00
Noch nicht. Bin gerade an einer anderen Baustelle.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#10

Re: Empfänger bei WM_DROPPFILES unterscheiden

  Alt 6. Mär 2010, 00:11
Ich habe es mal korrigiert. So sollte es funktionieren:

Delphi-Quellcode:
function TForm1.IsDropPointInside(const aDropPoint: TPoint; const aControl: TControl): Boolean;
begin
  Result := PtInRect(aControl.ClientRect, aControl.ScreenToClient(aDropPoint));
end;

procedure TForm1.AppMessage(var Msg: Tmsg; var Handled: Boolean);
const
  BufferLength: word = 255;
var
  DroppedFilename: string;
  FileIndex: Word;
  QtyDroppedFiles: Word;
  pDroppedFilename: array[0..255] of Char;
  DropPoint: TPoint;
begin
  if Msg.Message = WM_DROPFILES then
  begin
    FileIndex := $FFFF;
    QtyDroppedFiles := DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
    for FileIndex := 0 to (QtyDroppedFiles - 1) do
    begin
      DragQueryFile(Msg.WParam, FileIndex, pDroppedFilename, BufferLength);
      DroppedFilename := StrPas(pDroppedFilename);
      //DragQueryPoint(Msg.WParam, DropPoint);
      DropPoint := Msg.pt;
      if IsDropPointInside(DropPoint, edtCarrierFile) then
        edtCarrierFile.Text := DroppedFilename
      else if IsDropPointInside(DropPoint, edtTrailerFile) then
        edtTrailerFile.Text := DroppedFilename;
    end;
    DragFinish(Msg.WParam);
    Handled := true;
  end;
end;
Das Problem war eigentlich, dass DragQueryPoint die Clientkoordinaten des Ziels zurückgibt. In Msg.hwnd ist das Handle des Ziels (hier das Edit).
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:14 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