Announcement

Collapse
No announcement yet.

TImage Drag and Drop

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TImage Drag and Drop

    Hi,

    bin hier halb am verzweifeln, ich erzeuge dynamisch TIamges auf einer Zeichenoberfläche, diese möchte ich danach noch verschieben können.
    Mit dem jeweils zulezt erzeugtem TImage funktioniert das auch. Allerdings nicht mit den vorher erzeugten. Das liegt daran, das ich nicht weiß
    wie man über TImage->OnMousDown das jeweilige Element auswählt.

    Möglicherweise kann mir jemand auf die Sprünge helfen.


    <snip>
    TImage* test; (in test.h)
    <snip>
    void __fastcall TMDIChild::PaintBox1DragDrop(TObject *Sender, TObject
    *Source, int X, int Y)
    {
    if ((Sender == PaintBox1 && Source == MainForm->TreeView1)&&
    (MainForm->TreeView1->Selected->Level == 1))

    int X, int Y)
    test = new TImage(this);
    test->Parent = this;
    test->Top = Y;
    test->Left = X-10;
    test->Height = 61;
    test->Width = 60;
    test->DragKind = dkDrag;
    test->DragMode = dmAutomatic;
    test->DragCursor = crDrag;
    test->Canvas->Pen->Width = 2 ;
    test->Canvas->Brush->Color = (TColor) RGB(125,236,125);
    test->Canvas->Rectangle(10,3, 50,60);
    test->Update();
    <snip>

    else if (Sender == PaintBox1 && Source == test)
    {

    test->Top = Y;
    test->Left = X-10;
    test->Refresh();
    test->Update();
    }
    <snip>
    }


    Vielen Dank!
    Zuletzt editiert von Mr_Luke; 30.09.2008, 14:38. Reason: kleiner Fehler im Code

  • #2
    Wenn das Bild erst mal gezeichnet ist, kannst du imho nicht mehr drauf zu greifen. die beste methode ist, dynamisch TRect zu erzeugen, hierdrin die koordinaten der einzelnen images zu speichern und bei OnMousdown abchecken in welches Rechteck geklickt wurde. Dann neuzeichnen.

    Vielleicht gehts auch noch eleganter,, hab ich aber keine Kenntnis von.

    Gruß, Bodo

    Comment


    • #3
      Hmm,

      dann dürfte das zulezt gezeichnete ja auch nicht merh verschiebbar sein oder ?

      Gruß

      Sascha

      Comment


      • #4
        Bin ehrlich geagt auch nicht sooo tief in der Materie, aber wenn du für das letzte Bild free() aufgerufen hast, wird es ja auch nicht mehr neu gezeichnet... Irgendwie so würde ich das machen:
        TRect Temparea;
        TJPEGImage* NewJpg = new TJPEGImage(); //draw JPEG
        path=localPath+"Backgrd.JPG";
        NewJpg->LoadFromFile(path);
        Canvas->StretchDraw(Temparea,NewJpg);
        NewJpg->Free();

        Und zur not nochmal in grau über die alte Position zeichnen ;-)

        Naja, war nur so ne Idee, vielleicht gibts ne elegantere MEthode. Höchstwahrscheinlich sogar.

        Comment


        • #5
          Danke erstmal!

          Naja das ist irgendwie nicht ganz das was ich will. Ich brauch ne Oberfläche in
          der mehrere TImages (im TImage ist jeweils ein Canvas eingebettet) sichtbar sind und auf Mousevents reagieren (Menü, Drag and drop, etc.) Es gäbe die Möglichkeit sie in ein Panel einzubetten dsa ist mir aber eigentlich zuviel Overhead, ich denke das das auch einfacher gehen sollte, weiß nur nicht wie...

          Wozu und wie benutzt man TImage->OnMouseDown und was löst es aus?

          Gruß

          Sascha

          Comment


          • #6
            Originally posted by Mr_Luke View Post
            Hi,
            .. das ich nicht weiß
            wie man über TImage->OnMousDown das jeweilige Element auswählt.
            Was meinst du mit Element? Das actuelle TImage?

            void __fastcall TForm1::Image1MouseDown(TObject *Sender,
            TMouseButton Button, TShiftState Shift, int X, int Y)
            {
            // Sender ist das actuelle TImage.
            }

            Comment


            • #7
              [QUOTE=Mr_Luke;177861]
              else if (Sender == PaintBox1 && Source == test)
              {

              test->Top = Y;
              test->Left = X-10;
              test->Refresh();
              test->Update();
              }

              Da kannst du denk ik ohne mehr besser dies machen:

              else if (Sender == PaintBox1)
              {

              Source->Top = Y;
              Source->->Left = X-10;
              //Source->Refresh(); // was gibts zu refreshen?
              // Source->Update(); // was mus geupdate werden?
              }

              Aber jetzt sehe ich dass Source auch noch etwas anders sein kann als ein TImage.
              Wenn dass so ist dan besser:

              Code:
               if (Sender != PaintBox1)  // stelle dies gans am anfang deiner routine
                    return;
              
              
                 TImage *Image = dynamic_cast<TImage*>(Source);
              
                  if ( Image )
                       {
                        Image->Top = Y;
                        Image->Left = X-10;
                        }

              Noch eine Bemerkung;

              Eine variabele von Typ TImage test zu nennen is ein Beispiel von schwierig zu lesende code zu schreiben.

              Besser (wie du gesehen has) TImage *Image;
              Zuletzt editiert von Hans G; 01.10.2008, 10:21.

              Comment


              • #8
                Danke, das funktioniert hervorragend.

                Kleine Bemerkung, test steht das weil es nur ein test werden sollte, werde es jetzt direkt umbenennen in FUPImage.....so besser ?

                Vielen Dank nochmal Grüße

                Sascha

                Comment


                • #9
                  Noch ein kleines Problem,

                  wie kann ich dann bestimmte TImages wieder löschen?

                  Gruß

                  Sascha

                  Comment

                  Working...
                  X