OnClick per Quelltext aufrufen



  • Sind bei dir die Labels und die Buttons in unterschiedlichen Forms ?



  • ne die sind in der gleichen form
    sogar in der gleichen funktion.



  • hunter0707 schrieb:

    ne die sind in der gleichen form
    sogar in der gleichen funktion.

    😕
    Ich glaube, es wäre an der Zeit, etwas Code zu zeigen. Für mich ist das nur
    schwer zu verstehen.

    Gruß,

    Alexander



  • Genau!
    Wenn Label und Button zur gleichen Form gehören muss er auch Zugriff auf beide habe, es sei denn seine OnClick Funktion gehört nicht zur Form, was ein bischen seltsam wäre.



  • void TForm1::BCreate(int bombs, int bpzeile, int bpspalte)
    {
     for (int i = Form1->ComponentCount - 1; i >= 9; i--)//alle Objekte
        delete Form1->Components[i];         //löschen
    //**************************************************
    //****************Buttons und Labels****************
    //**************************************************
     int bpixel=16, spalte=0, zeile=0, maxbutton=bpzeile*bpspalte;
     bleft=maxbutton-bombs-1;
    
     const int x=480;      //Array von Buttons und Labels erstellen
     TButton *button[x];
     TLabel *label[x];
    for (int i = 0; i < maxbutton; i++)
     {
      button[i] = new TButton(this);
      label[i] = new TLabel(this);
      ...         //Eigenschaften zuweisen
      button[i]->OnMouseDown=Button1MouseDown;
     }
    }
    //-----------------------------------------------------
    void __fastcall TForm1::Button1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     if(Button==mbRight)
      {
       if(dynamic_cast<TButton*>(Sender)->Caption == "B")
        dynamic_cast<TButton*>(Sender)->Caption = "";
       else
        dynamic_cast<TButton*>(Sender)->Caption = "B";
      }
     if(Button==mbLeft)
     {
      if(dynamic_cast<TButton*>(Sender)->Tag == 1)
       {
        Application->MessageBox("Leider Verloren", NULL, MB_OK);
        FormCreate(0);
       }
      else
       {
        dynamic_cast<TButton*>(Sender)->Visible = false;
        bleft--;
        if(bleft==0)
         Application->MessageBox("Gewonnen", NULL, MB_OK);
       }
      }
    }
    

    Das Programm heisst minessweeper 😛
    glaub dann kann sichd a jeder was drunter vorstellen

    und das problem besteht halt darin, dass ich die buttons, die um ein label herum liegen prüfen muss ob sie ne bombe enthalten. wenn das nicht der fall ist sollen die buttons um das label automatisch aufgedeckt werden. an sonsten funktioniert das prog schon



  • Und was spricht dagegen, die Buttons und Labels als Membervariablen der Form zu deklarieren?

    Gruß,

    Alexander





  • Hast Du auch schon mal über die Verwendung von TList oder Vektoren nachgedacht?

    Gruß,

    Alexander



  • hmmm glaub ich hab mein problem gelöst. wenn ich die buttons und labels einfach außerhalb der funktion deklariere gehts ja eigentlich 😛

    hatte irgendwie wohl ne denkblokade

    Trotzdem danke für die Hifle



  • hab aber noch nen kleines problem

    ich hab greife ja in der Ereignisbehandlungsroutine für das OnMouseDown ereignis über den Sender auf das jeweilige Objekt zu.
    Wie komm ich denn jetzt an die Index Nummer von dem Objekt für das das Ereignis aufgerufen wurde.

    button[i]->OnMouseDown = Button1MouseDown;
    ...
    void __fastcall TForm1::Button1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     ...// hier brauch ich den Index des Objekts
        // also das i
    }
    


  • Wie wäre es, wenn Du Dein Array durchgehst (z.B. for-Schleife) und auf
    Gleichheit prüfst?
    Oder ich wiederhole mich:

    Alexander Kempf schrieb:

    Hast Du auch schon mal über die Verwendung von TList oder Vektoren nachgedacht?

    Gruß,

    Alexander



  • oder du schreibst den Index in die Tag Eigenschaft.
    Noch was zu dem casten in deiner MouseDown Routine. Erzeuge dir lieber eine temporäre TButton Variable, lege den gecasteten Wert dahin und verwende dann diese. So sieht das mit dem häufigen dynamic_casts doch sehr unübersichtlich aus. Desweiteren solltest du überprüfen ob der cast geklappt hat (auf NULL prüfen).

    Ciao


Anmelden zum Antworten