dynamische Labels mit individueller Funktion?



  • Moin Leute!

    Folgendes Problem:

    Bevor ich was von dynm. Objekt Erstellung gehört hab, war ich immer dabei manuell z.B. Spielfelder aufzubauen. Also bei einem Damespiel hab ich das 8x8 Feld per Hand mit Labels gestaltet. Dazu noch ein int Array (zweidimensional) als "virtuelles" Spielfeld wo die Daten der aktuellen Züge gespeichert wurden. Das was ungefähr so aufgebaut:

    [00][01][02][03][04][05][06][07]
    [10][...]

    etc.

    [60][...]
    [70][71][72][73][74][75][76][77]

    Jedes Label Feld gab bei OnClick seine "x/y" Koordinate an eine Funktion über, in Übereinstimmung mit dem virtuellen Spielfeld. Also Label1 ruft die Funktion so auf: spielen(0,0); oder Label8: spielen(0,7); etc.

    Nun bin ich auf den Trichter mit der dynm. Objekt Erstellung gekommen und baue mittlerweile das Spielfeld dynamisch auf. Nun möchte ich es wieder so haben das Label1 die Funktion spielen(0,0); aufruft und Label8 spielen(0,7); und so weiter. Wie realisiere ich das bei einem dynamischen Spielfeld Aufbau.

    Meine Funktion für den Aufbau:

    for(p=0; p<8; p++)
    {
    for(q=0; q<8; q++)
    {
    lab[p][q] = new TLabel(this);
    lab[p][q]->Parent = this;
    lab[p][q]->Height = 32;
    lab[p][q]->Width = 32;
    lab[p][q]->AutoSize = false;
    lab[p][q]->Top = p * 32 + 8;
    lab[p][q]->Left = q * 32 + 8;
    lab[p][q]->Color = clBlack;
    lab[p][q]->Caption = "";
    }
    }
    

    Hoffe mir kann jemand weiterhelfen!

    Gruß,
    Johrtreel



  • Dazu erstellst du mal ein Formular wo du das OnClick Ereignis vergibst.
    Dann klickst du mal auf das Formular rechts und auf "Ansicht als Text", da wirst du etwas finden wie
    OnClick = Button1Click

    Jetzt liegt die Vermutung nahe das
    Button1 -> OnClick = Button1Click;

    bzw
    lab[p][q]->OnClick = Button1Click;
    dasselbe macht...

    edit: grauseligen Satzbau etwas entschärft 😃

    [ Dieser Beitrag wurde am 24.02.2003 um 10:13 Uhr von dreaddy editiert. ]



  • Du erstellst ein Ereignis für deine Labels und wertest dann den TObject *Sender aus.
    Damit weisst du dann, welches Element das Ereignis ausgelöst hat.

    Siehe dazu auch FAQ-Eintrag unter Komponenten "Zugriff, aber nicht durch Namen"



  • Wobei du nichtmal daran DENKEN solltest "if" zu benutzen(es seidenn du hast wirklich völlig unterschiedliche Werte von spielen(x,y).
    Ansonsten nimm stattdessen die Eigenschaft "Tag" und speicher deine Werte dort hinein.

    Ich hab mal ein kleines Beispielprogramm geschrieben das die AsciiTabelle ausgibt in Form von 255 Buttons und dir bei Druck auf einen dieser die x,y und das aktuelle Zeichen ausgibt:

    void spielen(int x, int y)
    {
       ShowMessage((AnsiString)"x ist:" +x + "y ist:" +y);
       ShowMessage((AnsiString)"gedruecktes Zeichen ist:" + (char)(x*16+y)); //und wieder zurückwandeln
    }
    
    void __fastcall TForm1::ButtonClick(TObject *Sender)
    {
      spielen(((TComponent*)Sender) -> Tag/16, ((TComponent*)Sender) -> Tag%16); // Tag wieder in x und y wandeln
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    
      Form1 -> ClientWidth = 16*20;
      Form1 -> ClientHeight = 16*20;
      Form1 -> BorderStyle = bsDialog;
    
      TButton* button_neu[16][16];
      for(int p=0; p<16; p++)
      {
        for(int q=0; q<16; q++)
        {
          button_neu[p][q] = new TButton(this);
          button_neu[p][q] -> OnClick =  ButtonClick;
          button_neu[p][q] -> Parent =  this;
          button_neu[p][q] -> Tag =  p*16+q;
          button_neu[p][q] -> Left = p*20;
          button_neu[p][q] -> Top = q*20;
          button_neu[p][q] -> Width = 19;
          button_neu[p][q] -> Height = 19;
          button_neu[p][q] -> Visible = true;
          button_neu[p][q] -> Caption = (char)(p*16+q);
        }
      }
    }
    //---------------------------------------------------------------------------
    

    [ Dieser Beitrag wurde am 24.02.2003 um 11:23 Uhr von dreaddy editiert. ]



  • Ich würde das Beispiel von dreaddy noch leicht abändern:

    void __fastcall TForm1::ButtonClick(TObject *Sender)
    {  
      if(Sender->ClassNameIs("TButton"))
      {
        TButton *PruefButton = dynamic_cast<TButton *>(Sender);
    
        spielen(PruefButton->Tag/16, PruefButton->Tag%16);
      }
    }
    

Anmelden zum Antworten