CheckBox Matrix nach arry



  • Hi,
    ich möchte folgendes machen,

    x x x x CheckBox1.1 - 1.4
    x x x x CheckBox2.1 - 2.4
    x x x x CheckBox3.1 - 3.4
    x x x x CheckBox4.1 - 4.4

    char checkstate[4];

    Es sollen nun die bits 0-3 in checkstate[0] die Zustände der
    Checkboxen 1.1 - 1.4 annehmen, die CheckBoxen 2.1 - 2.4 ->checkstate[1]
    unsw..
    Da ich 20 CheckBox Zeilen a 4 CheckBoxen brauche und ich alle OnClick
    Ereignisse auf CheckBox1.1 lege müsste ich nur noch eine Möglichkeit
    haben anhand des Senders einen Index zu initialisieren und dann die ganze
    CheckBox Zeile in die entsprechenden Stringspeicher zu schreiben.
    Gibt es da eine Möglichkeit.

    Gruß
    Johann



  • Schau dir mal die Tag-Eigenschaft an und suche mal hier im Forum nach dynamic_cast



  • Hallo,

    kannst Du mir nichts genaueres sagen.

    Borland Hilfe:
    Die Eigenschaft Tag speichert eine Ganzzahl als Teil der Komponente.
    __property int Tag = {read=FTag, write=FTag, default=0};

    Beschreibung

    Tag hat keine vordefinierte Bedeutung. Sie können in dieser Eigenschaft zusätzliche Informationen über die Komponente in Form einer Ganzzahl speichern oder die Eigenschaft in einen 32-Bit-Wert, wie z.B. in eine Komponentenreferenz oder einen Zeiger, umgewandelt werden.

    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {
    char index;
    index = Sender->Tag;
    }
    funktioniert nicht;
    Gruß
    Johann



  • Der Tag-Property der CheckBoxes eine fortlaufende Nummer zuweisen, im OnClick dann den Sender nach TCheckBox casten und die Tag-Property auslesen.
    Siehe auch die FAQ unter "Komponenten - Zugriff nicht üer Namen".



  • char index

    index = (TCheckBox)Sender->Tag;

    Funktioniert nicht.



  • Funktioniert nicht

    Natürlich nicht 👎

    int index
    
    index = ((TCheckBox*)Sender)->Tag;
    


  • Dasd schrieb:

    suche mal hier im Forum nach dynamic_cast

    Muss man wirklich noch mehr dazu sagen?



  • blöde frage:
    kann man, wenn man sich selber ein objekt von checkbox ableitet ein ereignis nicht als static deklarieren? dann könnte man doch mit dem this-pointer arbeiten oder irre ich mich da?



  • void __fastcall TForm1::alarm_Click(TObject *Sender)
    {
        char mask;
        int  index;
        if (!dont_draw)
        {
           index = ((TCheckBox*)Sender)->Tag;
           mask  = index & 0xff;
           index = index >> 8;
           if(((TCheckBox*)Sender)->Checked)
           {
               alarme[index] = alarme[index] | mask;
           }
           else
           {
             mask  = mask ^ 0xff;
             alarme[index] = alarme[index] & mask;
           }
           if (!write_relay_data(index,alarme[index]))  //write to RS232
           {
             ask(&mede1[0]);                            //RS232 TIMEOUT? 
           }
        }
    }
    

    Funktioniert, ich habe nun 20 CheckBox-Zeilen a 5 CheckBoxen wobei die erste
    CheckBox Zeile die Tags 0x0001 - 0x0010 bekommen, die zweite die Tags
    0x0101 - 0x0110 unsw....Das Highbyte ist der Index und das Lowbyte die Maske.
    Vorher hatte ich für Jede CheckBox das OnClick Ereigniss benutzt was den
    Code natürlich erheblich verlängert.

    Würde soetwas auch umgekehrt gehen, das CheckBox Feld steht für 20 Alarme
    die 5 CheckBoxen für 5 Relays die Pro Alarm wählbar sind diese werden dann
    via RS232 zu einer Controllerkarte übertragen und dort im EEPROM gespeichert.
    Nun lade ich mir nach dem Windows Programmstart alle eingestellten Alarme vom Controller in das arry alarme[20]. Als erstes muss ich nun entsprechend der
    gesetzten bits im Arry alarme meine CheckBoxen setzen

    alarm1_r1->Checked = alarme[0] & 0x01;
    alarm1_r2->Checked = alarme[0] & 0x02;
    alarm1_r3->Checked = alarme[0] & 0x04;
    alarm1_r4->Checked = alarme[0] & 0x08;
    alarm1_r5->Checked = alarme[0] & 0x10;

    alarm2_r1->Checked = alarme[1] & 0x01;

    unsw.................

    alarm20_r1->Checked = alarm[19] & 0x01;

    Was ein bischen umständlich ist.

    Muss gestehen das ich mit dem Casten noch so meine Probleme habe.

    Vielen Dank


Anmelden zum Antworten