Event - Ermitteln des Array-Elements



  • Hallo,

    ich hab aus dem Forum Code übernommen. 5 Image-Objekte werden zur Laufzeit erzeugt. Ich habe Events zugewiesen. Wie bekomme ich aber raus welches Image angeklickt wurde ..?

    Auch kann ich beim Starten die Anzahl noch nicht festlegen. Also entweder ich erweitere den Array dynamisch (?) oder welchen Ansatz gäbe es da ?

    Vielen Dank !

    void __fastcall TfrmMain::Button1Click(TObject *Sender)
    {
       for (int i = 0; i < 5; i++)
       {
          img[i] = new TImage(this);
          img[i]->Parent = this;
          img[i]->Width = 32;
          img[i]->Height = 32;
          img[i]->Top = i * 35;
          img[i]->OnClick=Image1Click;
          img[i]->OnMouseDown=Image1MouseDown;
          img[i]->OnMouseMove=Image1MouseMove;
          img[i]->OnMouseUp=Image1MouseUp;
          img[i]->Show();
          img[i]->Canvas->Brush->Color = clWhite;
       }
    }
    
    void __fastcall TfrmMain::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       scX = X;
       scY = Y;
       scDyn = 1;
       if (Button == mbRight)
       {
          int iX = img[0]->Left + img[0]->Width + X + 100;
          int iY = img[0]->Top + Y + 150;
          objPopup->Popup(iX, iY);
       }
    }
    


  • Hallo,

    Nimm doch einen vector<TImage*>. Da kannst du beliebig Elemente hinzufügen. Schau auch mal in die FAQ.



  • Danke. Hab mal das unten probiert. Klappt auch. Nur beim Beschriften krieg ich eine Zugriffsverletzung.

    Ablauf: Ich erzeuge per Click jeweils ein neues Image und dazu ein Memo. Memo ist unsichtbar, wandert bei Drag&Drop mit. Wenn ich über das Kontextmenü Beschriften aufrufe wird das Memo eingeblendet.

    Oder kann ich von dynamisch erzeugten Objekten keine Funktion aufrufen, die beim Erstellen nicht definiert ist ? Dann wäre die Frage wie ich das machen muss.

    int iX = dynamic_cast<TImage*>(Sender)->Left + dynamic_cast<TImage*>(Sender)->Width + X + 10;
    
    void __fastcall TfrmMain::Beschriften1Click(TObject *Sender)
    {
       ShowMessage(dynamic_cast<TImage*>(Sender)->Name);
       scDyn = 0;
    }
    


  • Hab es anders gemacht. Den Wert lese ich beim Click aus und schieb ihn in eine Variable. Über diese greife ich dann beim Beschriften auf den Array zu.



  • Wenn du schon dynamic_cast verwendest, werte bitte auch das Ergebnis aus. Zu dynamische erstellten Objekten und Funktionen steht schon eine Menge in der FAQ Abteilung Komponenten benutzen.


Anmelden zum Antworten