Newsgroup: it.comp.lang.delphi
Titolo: Muovere Oggetti a RunTime su una Form

Ciao a tutti,
ho la necessità di muovere gli oggetti su una form e sono riuscito a farlo
utilizzando il seguente codice che ho trovato su internet :
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
   if Source is TEdit then
   begin
    TEdit(Source).Left := X;
    TEdit(Source).Top := Y;
  end;
end;
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; State:
TDragState; var Accept: Boolean);
begin
  if Source is TEdit then
    Accept := (Source is TEdit);
end;
procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
  if ssCtrl in Shift then
    Edit1.BeginDrag(True);
end;
Il Sorgente sopra riportato consente di spostare un oggetto di tipo TEdit
(TEdit1 in questo caso) semplicemente tenendo premuto il
Tasto CTRL, clickando sul TEDIT e trascinando il mouse sulla posizione
desiderata.
Il mio problema è che gli spostamenti sono troppo grossolani e non si riesce
a piazzare l'oggetto nella posizione precisa in cui si desidera.
Ci vorrebbe qualcosa che mi consentisse di fare degli spostamenti
micrometrici, allo stesso modo di come avviene quando spostiamo gli
oggetti su una form a Designe Time con l'IDE di Delphi.
C'è qualcuno che mi può aiutare ?
Grazie.
Donato Di Tullio

procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DragMove = $F012;
begin
  ReleaseCapture;
  (edit1 as TWinControl).perform(WM_SysCommand, SC_DragMove, 0);
end;
Questo sicuramente fà al caso tuo!
Togli tutto quello che hai messo tu e inserisci solo questo.
Ovviamente puoi condizionare lo spostamento con il control, come hai fatto
tu.

In C++ Builder ho fatto così con i piccoli cambiamenti per Delphi penso che
tu non abbia problemi
Enrico
 Boolean fd;
void __fastcall TForm43::Button1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   fd = True;
   frect.Left = nx;
   frect.Top = ny;
   frect.Right = nx + Button1->Width;
   frect.Bottom = ny + Button1->Height;
   Canvas->DrawFocusRect(frect);
}
//--------------------------------------------------------------------------
-
void __fastcall TForm43::Button1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  if (fd)
  {
    Canvas->DrawFocusRect(frect);
    frect.Left = nx+X;
    frect.Top = ny+Y;
    frect.Right = nx+X + Button1->Width;
    frect.Bottom = ny+Y + Button1->Height;
    Canvas->DrawFocusRect(frect);
  }
}
//--------------------------------------------------------------------------
-
void __fastcall TForm43::Button1MouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
   if (fd)
   {
     fd = False;
     nx = nx+X;
     ny = ny+Y;
     Invalidate();  // Aggiorna il disegno
   }
}
//--------------------------------------------------------------------------
-
void __fastcall TForm43::FormPaint(TObject *Sender)
{
  Button1->Left = nx;
  Button1->Top = ny;
}
//--------------------------------------------------------------------------
-
void __fastcall TForm43::FormShow(TObject *Sender)
{
  nx=Button1->Left;
  ny=Button1->Top;
}
//--------------------------------------------------------------------------
-

 ha scritto nel messaggio
news:EKbeb.142310$hE5.4...@news1.tin.it...

Grazie !!! E' perfetto !
Mi piacerebbe però capirne anche il significato. Non voglio disturbarti
oltre chiedendomi
di spiegarmi il codice, però potresti almeno dirmi dove posso trovare della
documentazione
al riguardo ?
Grazie ancora.
Donato Di Tullio

 ha scritto nel messaggio
news:EKbeb.142310$hE5.4...@news1.tin.it...

Mi sono accorto che TwinControl non è compatibile con le TLabel.
Come posso ovviare a questo visto che ho la necessità di spostare
anche le Label ?


 anche le Label ?
Io ho usato, invece delle label, gli statictext (in additional), che sono
praticamente uguali. (poi dipende dall'utilizzo!)
Ciao.