Image auf Panel erstellen



  • Hallo danke für die Antwort.

    Wiegesagt ich habe schon viel ausprobiert, mit unter auch dein Vorschlag nur dann sehe ich keine Images ! Ich möchte die Images auf den Panels erstellen damit ich die "Verschiebefunktion" verwenden kann. Der Link im Bezug auf Sender hilft mir nicht viel weiter, 1. ist dort leider kein kleines Beispiel und 2. bin ich mir nicht sicher ob das funktioniert denn, wenn ich ein Image verschieben will dann tut er es laut Funktion ja mit dem Panel. Also brauch ich dort eine Beziehung.
    Ich würde es ja auch gerne anders lösen, also nur mit den Images aber ein Image hat kein "Handle" ...

    mfg



  • hi,

    int OldMouseX, OldMouseY;
    

    im MouseDown-Event des Images;

    if (Button == mbLeft)
      {
        OldMouseX = X;
        OldMouseY = Y;
      }
    

    im MouseMove-Event des Images;

    int iDeltaX, iDeltaY;
      if (Shift.Contains(ssLeft))
      {
        NewX = X - OldMouseX;
        NewY = Y - OldMouseY;
        Image1->Top = Image1->Top + NewY;
        Image1->Left = Image1->Left + NewX;
      }
    


  • shadowmasta schrieb:

    Hallo danke für die Antwort.

    Wiegesagt ich habe schon viel ausprobiert, mit unter auch dein Vorschlag nur dann sehe ich keine Images ! (...)

    mfg

    Die Left und Top Positionen des Images solltest du z.B. mal auf 0 setzen,
    danach müsstest du dein Image sehen.



  • Ok natürlich wie dumm...
    Dankeschön alle Fragen geklärt dann benutze ich die MouseMovefunktion von dem Gast 🕶
    Vllt noch eine Frage wenn man zur Laufzeit Komponenten erstellt und ihnen eine Onclick-Ereignis zuweist dann muss ja schon eins da sein also müsste ich ja extra ein Image schon auf der Form haben oder ?

    Danke für alles 👍



  • Hallo

    wenn man zur Laufzeit Komponenten erstellt und ihnen eine Onclick-Ereignis zuweist dann muss ja schon eins da sein also müsste ich ja extra ein Image schon auf der Form haben oder ?

    Nein, du brauchst keine Image-Komponente dafür. Sondern nur die manuell angelegte Form-Methode. Erstell als Vorlage eine solche und schau die Parameter an, und vergiß den Header des Forms nicht.

    bis bald
    akari



  • Ich mach das meist so,
    1. Komponente (hier Image) auf die Form packen
    2. im Objektinspektor die Eventmthode erstellen
    3. Eventmethode umbenennen (Header und cpp)
    4. Komponente wieder von der Form entfernen
    Auf die Weise macht man zumindest bei der korrekten Parameterdeklaration keine Fehler.



  • Danke Braunstein diese Erklärung hat mir sehr gut geholfen, bin auch fast am Ziel, leide rmusste ich bei Fertigstellung feststellen das das Schieben nicht so will wie ich es will, sprich beim Versuch das Image zu verschieben geht es aus dem Bild bei einer kleineren Mausbewegung, wenn ich es langsam mache geht er immer invertiert diagonal aus der Form... Soweit ich das sehe ist das ekin Logikproblem ? ich verzweifle da ich es kurz bevor ich es implementiert habe noch einzeln getestet habe.

    // Codeausschnitt
        Ideck[i] = new TImage(this);  // Images erstellen
        Ideck[i]->Parent = this;
        Ideck[i]->Width = 71;
        Ideck[i]->Height = 96;
        Ideck[i]->Top = 0;
        Ideck[i]->Left = 0;
        Ideck[i]->Cursor = crHandPoint;
        // Zufälliges Bild laden
        Ideck[i]->Picture->Bitmap->LoadFromResourceID((int)HInstance,Zufall[i]);
        Ideck[i]->OnMouseDown = CardDown;  // Eventeigenschaften
        Ideck[i]->OnMouseMove = CardMove;
    
    // CardDown
    void __fastcall TForm1::CardDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
      if (Button == mbLeft)
      {
        OldMouseX = X;
        OldMouseY = Y;
      }
    }
    
    // CardMove
    void __fastcall TForm1::CardMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
      int NewX, NewY;
      if (Shift.Contains(ssLeft))
      {
        NewX = X - OldMouseX;
        NewY = Y - OldMouseY;
        dynamic_cast<TImage*>(Sender)->Top = dynamic_cast<TImage*>(Sender)->Top + NewX;
        dynamic_cast<TImage*>(Sender)->Left = dynamic_cast<TImage*>(Sender)->Left + NewY;
      }
    }
    

    Ich kannte das mit dem dynamic_cast garnicht ich dachte "TImage(Sender)" so in der Art aber geht nicht, glaube das war Delphi...
    Sorry wenn ich mit sowas "banalem" ankomme, ich wüsste nicht wie es es sonst lösen kann, also danke nochmal an die Helfer 🤡



  • So sieht es etwas übersichtlicher aus.

    void __fastcall TForm1::CardMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
      if (Shift.Contains(ssLeft))
      {
        int NewX = X - OldMouseX;
        int NewY = Y - OldMouseY;
        TImage* image = dynamic_cast<TImage*>(Sender);
        if( image != 0)
        {
           image->Top = image->Top + NewX;
           image->Left = image->Left + NewY;
        }
      }
    }
    

    Ansonsten noch was zu dynamic_cast
    http://tutorial.schornboeck.net/dynamic_cast.htm
    siehe dazu auch die FAQ des C++Forums.



  • Ok es geht habe X mit Y vertauscht ...
    Ich hoffe es bleibt die allerletzte Frage 😃
    Da ich nun 52 Karten frei bewegen kann und sie in 52 verschiedenen Ebenen sind bräuchte ich beim Onclick bzw. Onmousedown Event eine Eigenschaft die das gewählte Image nach vorne setzt in der hierarchie also das ich das gewählte Image auf eine andere Karte legen kann. Dann kann ich endlich mit dem Algorythmus beginnen :p

    Danke



  • Schau mal in der Hilfe nach BringToFront().



  • Dankeschön genau das was ich brauche 👍

    Ich wünschte es gebe so ein Online-Manual wie bei php das php.net 🙂


Anmelden zum Antworten