Newsgroup: it.comp.programmare.win32
Titolo: Drag&Drop 2

Ricordo che dovevo realizzare il drag&drop col BCB e Sly55 ha postato la
soluzione. Io l'ho implementata cosě:
volendo un oggetto TShape "autonomo" ho derivato una nuova classe in cui ho
direttamente implementato il drag&drop.
Questo č il codice:
//////////////////////////////////////////////////////
class miaTShape: public TShape
{
private:
     bool IsDown;
     int Xmou, Ymou, Xnew, Ynew;
public:
        __fastcall miaTShape(TComponent* Owner, int posx, int posy,
AnsiString nom);
        void __fastcall MClick(TObject * Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
        void __fastcall MMove(TObject * Sender, TShiftState Shift, int X,
int Y);
        void __fastcall MUp(TObject * Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
};
----------------------------------------------------------------------------
__fastcall miaTShape::miaTShape(TComponent* Owner, int posx, int posy,
AnsiString nom)
        : TShape(Owner)
{
      Name=nom;
      Parent=(TWinControl *)Owner;
      Shape=stRectangle;
      Width=30;
      Height=50;
      OnMouseDown=MClick;
      OnMouseMove=MMove;
      OnMouseUp=MUp;
      Left=posx;
      Top=posy;
      IsDown = false;
}
void __fastcall miaTShape::MClick(TObject * Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
          }
  if(Button == mbLeft) {
    IsDown = true;
    Xmou = X;
    Ymou = Y;
    Xnew = Left;
    Ynew = Top;
    ((TPanel *)Parent)->Canvas->DrawFocusRect(BoundsRect);    **
  }
}
void __fastcall miaTShape::MMove(TObject * Sender, TShiftState Shift, int X,
int Y)
{
  if(IsDown) {
    TRect rc = Rect(Xnew, Ynew, Xnew+Width,
                               Ynew+Height);
    ((TPanel *)Parent)->Canvas->DrawFocusRect(rc);     **
    Xnew = Left + X - Xmou;
    Ynew = Top + Y - Ymou;
    rc = Rect(Xnew, Ynew, Xnew+Width, Ynew+Height);
    ((TPanel *)Parent)->Canvas->DrawFocusRect(rc);     **
  }
}
void __fastcall miaTShape::MUp(TObject * Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
  if(IsDown) {
    IsDown = false;
    Top = Ynew;
    Left = Xnew;
    }
}
------------------------------------------------------------------
Nella form ho messo un pulsante che ogni qual volta viene premuto aggiunge
una miaTShape a Pannello (che č un TPanel).
void __fastcall Form::Bottone1Click(TObject *Sender)
{
new miaTShape(Pannello,100,30, "Prova"));
}
///////////////////////////////////////////////////////////////
Compilando il tutto mi dice che il campo Canvas del TPanel č inaccessibile
(nei punti **).
Questo codice funziona benissimo se invece del Pannello mando come Parent la
Form, dato che ha il membro Canvas pubblico.
Volevo solo chidervi un consiglio sull'approccio usato e su come risolvere
il problema.
Grazie.

 il problema.
Ho letto solo ora il tuo messaggio (ti ho gia' mandato qualcosa in e-mail).
Credo che la soluzione sia di usare, al posto di TPanel:
/*--- nell'header --- */
class TMyPanel : public TCustomControl
{
protected:
  virtual void __fastcall Paint(void);
public:
  __fastcall TMyPanel(TComponent* Owner);
  __property Canvas;
  /* altre proprietą, se servono ...*/
};
/*--- nel .cpp --- */
__fastcall TMyPanel::TMyPanel(TComponent* Owner)
  : TCustomControl(Owner)
{
}
/*--------*/
void __fastcall TMyPanel::Paint(void)
{ // minimo, fa solo il contorno
  Canvas->Pen->Color = clBtnHighlight;
  Canvas->MoveTo(Width,0);
  Canvas->LineTo(0,0);
  Canvas->LineTo(0,Height-1);
  Canvas->Pen->Color = clBtnShadow;
  Canvas->LineTo(Width-1,Height-1);
  Canvas->LineTo(Width-1,0);
}
Il tutto va adattato, naturalmente...
[PS] Perche' hai iniziato un nuovo thread invece di continuare il
precedente?
Ciao, Sly_55.