Drag&Drop mit vielen Komponenten



  • Hallo!
    Ich möchte ca. 400 kleine, runde Dinger auf meinem Forumlar mit der Maus per Drag&Drop frei bewegen können. Ich habe bereits im Forum gesucht und auch einige Lösungen gefunden, aber bei diesen muss ich in die MouseEvents jedes einzelnen Dinges schreiben. Eleganter (ursprünglich hoffte ich auch auf eine Arbeitszeitersparnis, die mittlerweile aber hin ist) fände ich eine Möglichkeit, sie in der Laufzeit zu erzeugen und ihnen dann auch zuzuweisen, dass sie tun sollen, was die Maus sagt.
    Dinger sind übrigens in diesem Kontext erstmal TShape und später dann vielleicht TImage.
    Es wäre sehr nett, wenn mir jemand bei dem Problem weiterhelfen würde!
    Mit freundlichsten Grüßen,
    Annika



  • Annika schrieb:

    Eleganter (ursprünglich hoffte ich auch auf eine Arbeitszeitersparnis, die mittlerweile aber hin ist) fände ich eine Möglichkeit, sie in der Laufzeit zu erzeugen und ihnen dann auch zuzuweisen,

    Die FAQ, Abschnitt "Komponenten benutzen / zur Laufzeit erstellen, anzeigen und Events zuweisen" könnte Dir da weiterhelfen.



  • Du kannst auch einfach ein Methode für alle Objekte schreiben und dann mit dynamic_cast arbeiten. Steht glaube ich auch was in der FAQ drin.

    TDeinObjekt *temp = dynamic_cast<TDeinObjekt*>(Sender);
    temp->Left = X;
    temp->Top = Y;
    


  • Mach doch ne Ableitung von TImage (o.a.):

    class TSprite : public TImage
    {
    private:	// Anwender-Deklarationen
      int XPos,YPos;
      Boolean Moving;
    
    DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
    DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
    DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y);
    
    __published:	// Von der IDE verwaltete Komponenten
    public:		// Anwender-Deklarationen
            __fastcall TSprite(TComponent* Owner);
    };
    
    __fastcall TSprite::TSprite(TComponent* Owner)
                : TImage(Owner)
    {
      Moving=false;
      XPos=-MaxInt;
      YPos=-MaxInt;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TSprite::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
      XPos=X;
      YPos=Y;
      Moving=true;
      TImage::MouseDown(Button, Shift, X, Y);
    }
    void __fastcall TSprite::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
      Moving=false;
      TImage::MouseUp(Button, Shift, X, Y);
    }
    void __fastcall TSprite::MouseMove(Classes::TShiftState Shift, int X, int Y)
    {
      int DX,DY;
      static Updating=false;
      if (!Updating)
      {
        Updating=true;
        if (Moving)
        {
          if ((X!=XPos)||(Y!=YPos))
          {
            DX=X-XPos;
            DY=Y-YPos;
            XPos=X-DX;
            YPos=Y-DY;
            SetBounds(Left+DX,Top+DY,Width,Height);
          }
        }
        Updating=false;
      }
      TImage::MouseMove(Shift, X, Y);
    }
    

Anmelden zum Antworten