Newsgroup: it.comp.lang.delphi
Titolo: Drag and Drop

Ciao a tutti!
Come faccio ha trascinare un componente delphi con il mouse?
Grazie a tutti quelli che mi risponderanno!

se vuoi creare un componente a run-time allora devi eseguire una procedura
un pò complessa..
se invece vuoi gestire il drag & drop sui valori o proprietà di un
componente devi usare gli eventi ad esso associati (sempre che sia
possibile).. per il primo caso non posso risponderti adesso, ma lo farò
lunedì
--
Posted from 
twingo.tiscalinet.it
 [195.130.224.85] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

"Alessio Lauria":
| Ciao a tutti!
| Come faccio ha trascinare un componente delphi con il mouse?
| Grazie a tutti quelli che mi risponderanno!
non so se ho capito,
ma avevo trovato una tips in giro, provala:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
end;
questo pezzo di codice permette di muovere un TPanel a runtime
(caruccio!:-))
Ciao,
Alan Solo

 wrote in message
8q0iis$e7nlj$1...@ID-44131.news.cis.dfn.de...


 wrote in message
NEBBIKOAILFEOOHKCK...@tiscalinet.it...


   Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
Ma che cosa fa ReleaseCapture ?

"Alberto Gori":
| >   ReleaseCapture;
| >   Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
| Ma che cosa fa ReleaseCapture ?
e perchè Perform(WM_SYSCOMMAND, $F012, 0);
cosa fa'??...;-)) cos'e' quel $F012? bohh
ripeto l'ho trovata in giro su internet,
ma il *come* faccia sinceramente non lo so! ;-)
ho dato un'occhiata all'help ma non ci ho capito molto
mah, eppure se si toglie quell'istruzione non funzia...
se non avessi trovato quella tips io avrei fatto qualcosa di + 'manuale'
tipo:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 start_x := x;
 start_y := y;
 Muovi := True;
end;
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Muovi:=False;
end;
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if Muovi then begin
   Panel1.Left:= Panel1.Left-(start_x-x);
   Panel1.Top := Panel1.Top -(start_y-y);
 end;
end;
un po' piu' di codice ma il risultato e' identico
(e questo *so* come fa!) ;-)
Ciao,
Alan Solo

 end;
FIIIIIIIIIIIIIIIGOOOOOOOOOOOOO !!!!
Una domanda.... il codice $F012 a cosa corrisponde ? è SC_MOVE+2 ... ma non
corrisponde
a nessun comando dichiarato in windows.pas (uso Delphi 5 ent, nessuna patch)
(non dovrò mica consultare la msdn ? sigh sob il mio modem non reggerebbe il
colpo! :_(  )
Ciao!! Davide DG

> un po' piu' di codice ma il risultato e' identico
Mmm... non proprio... il ReleaseCapture serve per "interrompere" l'evento
onMouseDown
prevenendo quindi la generazione di eventi OnMouseMove.
Il TControl.Perform ... beh quello è un "modo veloce" per fare qualcosa del
tipo :
SendMessage (wm_messaggio, TControl.Handle, wparam,lparam)
In pratica, sull'evento onmousedown, si interrompe la catena "normale" di
eventi mouse e
si dice (penso) al componente di muoversi ($f012 = sc_move + 2 ... ?) alle
coordinate attuali
del mouse.
Resto comunque perplesso sul significato del $F012 ... che non appare nel
(mio) help
del messaggio wm_syscommand. Presumo sia un "muovi la finestra alle
coordinate *attuali* del
mouse"
Boh... dopo proverò a vedere su msdn.
ciao! Davide DG

"Davide DG":
| > un po' piu' di codice ma il risultato e' identico
|
| Mmm... non proprio... il ReleaseCapture serve per "interrompere" l'evento
| onMouseDown
| prevenendo quindi la generazione di eventi OnMouseMove.
??
a parte il fatto che non ho capito
(OnMouseMove viene generato anche se viene 'interrotto'
o meno l'OnMouseDown, o sbaglio?...e poi perchè
interromperlo?...)
con "il risultato e' identico" intendevo
lo spostare oggetti a run-time con il drag and drop...
[...]
| Boh... dopo proverò a vedere su msdn.
| ciao! Davide DG
nench'io ho capito come, fammi sapere!
(cavolo, il tipo che aveva messo quel codice
poteva mettere due righe di commento no? ;)
per la cronaca e' su torry, sez. tips)
Ciao!
Alan Solo

a proposito di drag'n'drop beccatevi sto codice che ho trovato da qualche
parte (sinceramente non ricordo dove), magari a qualcuno può essere utile.
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  shellapi;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  procedure OnDropFiles (var Msg : tmessage); message WM_DROPFILES;
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.OnDropFiles(var Msg: tmessage);
var
  s : string;
  hDrop: Integer;
  Buffer: Array[0..255] of Char;
begin
  hDrop := Msg.wParam;
  DragQueryFile(hDrop,0,Buffer,255);
  s := Buffer;
  DragFinish(hDrop);
  ShowMessage(s);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle,True);
end;
end.
--
Gna...@Wappi.com
bmq...@tin.it
ICQ# 76488613
http://gnaffy.tripod.com/