PDA

Visualizza la versione completa : [DELPHI] Riconoscere oggetto sotto il mouse su drag & drop


123delphi321
08-04-2011, 14:34
Ciao,

in una listbox voglio trascinare dei file selezionati dall'explorer do windows.

ho trovato del codice in rete che funziona bene ad eccezione di un controllo:

in pratica quando rilascio i file trascinati questi devono essere copiati nella listbox solo se il mouse e' sul componente listbox e non se sulla restante parte della form.

grazie

il codice e' questo:


procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
i, x, cnt : integer;
buffer, F : string;

begin
//If you only want ListBox1 to accept the files
//if they are being dropped directly on it...


questo e' il controllo che non mi funziona,
quando rilascio il mouse sulla listbox questa ferifica non e' valida (false)
se tolgo l' 'IF' i file vengono trascritti anche se li rilascio sul resto della form.

if WindowFromPoint(mouse.CursorPos) = cxListBoxFileWord.Handle then


begin
cnt := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, MAX_PATH);
SetLength(buffer, MAX_PATH *2);

for i := 0 to cnt -1 do
begin
x := DragQueryFile(Msg.Drop, i, nil, MAX_PATH *2);
if (x > 0) and (x < MAX_PATH *2) then
begin
DragQueryFile(Msg.Drop, i, @buffer[1], x +1);

F := Copy(buffer, 1, x);
// do something with F...
if cxListBoxFileWord.Items.IndexOf(F) < 0 then
cxListBoxFileWord.Items.Add(F);
end;
end;

end;

DragFinish(Msg.Drop);
Msg.Result := 0;
end;

123delphi321
08-04-2011, 15:18
riesco ad ottenere il nome del componente sottostante tranne nel caso di un componente di terze parti (cxlistbox devexpress)....

ora vediamo cosa mi rispondono...

grazie comunque

deleted_29
08-04-2011, 16:04
manco l'ho letto, ma se non riesci ti basta fare un evento che controlla la posizione del cursore, e quando sul controllo che vuoi lo flagga (es. cambia tag), e nel "drop" controlli se il componente ha tag=1

o cose del genere

zamu91
11-04-2011, 10:18
Volendo puoi usare il componente jvdragdrop dove puoi indicare il componente che ti serve per l'evento. In alternativa prova a sfruttare gli eventi on mousemove o dragover dei componenti.
Per utilizzare il jvdragdrop devi aver installato le librerie Jedi.

123delphi321
11-04-2011, 11:27
grazie, il problema dipendeva dal componente di terze parti....


ho risolto cosi:



The FindVCLWindow method returns the TcxInnerListbox object, which does not have a name. To access the TcxListBox control, please use the following code:

var
ctrl : TWinControl;
begin

ctrl := FindVCLWindow(Mouse.CursorPos);
if ctrl.Name = '' then
ShowMessage(ctrl.Owner.Name);

Loading