Schul Projekt Wer Wird IT Champingnon



  • Hallo alle zusammen.

    Ich hatte vorgestern einen Thread gestartet mit der frage wie man das mit den dynamischen labels löst. DAnke nochmal wegen der antworten. haben mir schon sehr weitergeholen nur habe ich ein nächstes problem da diese variante meinen code nicht wirklick kleiner macht. und zwar habe ich wie bei Wer wird millionär rechts die 15 stufen von 50 € - 1 Million.

    Nun zur problematik. Ich möchte das programm starten und die unterste stufe also
    1. € 50 grau hinterlegen und die schriftfarbe auf gelb verändern. Wenn ich nun auf die frage eine antwort gebe und diese richtig ist, wird dieses feld wird in die ursprungsfarbe zurück versetzt und die zweite stufe wird grau hinterlegt und farbe wird verändern. bei der 5. 10. und 15. stufe ist die farbe generell gelb da es sich dort um stufen handelt bei denen man das geld sicherhat. also nochma zusammenfassend.

    1-4 stufe sollen sich nach einander verändern. 1. stufe grauer hintergrund schrift gelb. button wird geklickt und 1 stufe wieder normal 2 stufe verändert.

    nun habe ich das problem gehabt das wenn ich immer drauf prüfe welchen counter ich habe, muss ich 14 if's aufmachen und immer prüfen. Nun habe ich hier nachgefragt und erfahren das es dynamische labels gibt. also ein dynamisches array aus labels gemacht und die if's waren überflüssig. Nur kam jetzt hinzu das ich die labels auf dem formular nun mit jedem aus dem dynamischen array gleich setzen musste. sowohl hintergrund als auch font->color. das dann in etwa so aussah.

    Label1->Color=LblArray[0]->Color;
    Label1->Font->Color=LblArray[0]->Font->Color;

    und das nun für alle 14 labels. das ist dann zwar kürzer als 14 ma if zu setzen aber immer noch viel zu lang und sieht einfach nicht gekonnt aus. kann mir jemand helfen?

    hoffe ihr habt es verstanden.

    was sehr helfen würde wäre wenn mir jemand sagen könnte, wie man ein label feld mit einem dynamischen label verknüpft. das bedeutet wenn ich das dyn label verändere das ich das label auf dem formular auch direkt mit verändert. falls es was hilft ich benutze borland c++ builder 5



  • nimm ein array aus pointern auf deine Labels...dann ist label1 label_arr[0] usw...
    kannst schoen mit ner schleife durch loopen...



  • also pointer array like that:

    TLabel *label_arr[14];
    label_arr[0] = &Label1;
    label_arr[1] = &Label2;
    usw...
    
    for(int i=0; i<14; i++)
    { 
       label_arr[i]->Color = ...
       label_arr[i]->Font->Color = ...
       ...
    }
    


  • jop das war nicht das problem ^^ sry vielleicht wurde ich doch falsch verstanden. mein haupt problem liegt darin das

    label array lässt sich wunderbar hoch zählen verändern und so weiter nur

    habe ich auf meinem Formular 14 Labels -> Label1,Label2 .... Label14

    immer wenn die person nun eine antwort gibt wird das nächste label vberändert. einfach die counter 1 hoch und dynamische label ist verändert nur muss ich dann die labels auf dem formular mit dem des array gleich setzen damit die sich auf meinem formular auch verändern ich geh euch ma grad bissi code

    DynamicArray<TLabel*>lblArray;
    
    __fastcall TfrmMain::TfrmMain(TComponent* Owner)
            : TForm(Owner)
    {
    
      lblArray.Length = LblNum;
      edtArray.Length = EdtNum;
      for (int i = 0; i < lblArray.Length; i++){
        lblArray[i] = new TLabel(this);
        lblArray[i]->Color=clHighlight;
        lblArray[i]->Font->Color=clWhite;
        lblArray[i]->Font->Size=18;
      }
      lblArray[4]->Font->Color=clYellow;
      lblArray[9]->Font->Color=clYellow;
      lblArray[14]->Font->Color=clYellow;
    }
    
    // so nun sind die dynamischen labels initialisiert und schon fertig.
    
    void antwort(AnsiString zahl){ // zahl ist in dem fall A,B,C,D als 1,2,3,4
      if(zahl==richtig){           //richtig ist die Variable der Richtigen Antwort
        lblArray[counter]->Color=clActiveCaption;
        lblArray[counter]->Font->Color=clWhite;
        lblArray[counter+1]->Color=clSilver;
        lblArray[counter+1]->Font->Color=clBlack;             
        counter++;
        aktualisieren();
      }
      else{
        ShowMessage("Sie haben "+IntToStr(stand)+" € gewonnen!!!");
        reset();           //Funktion setzt alles zurück
      }
    
    void aktualisieren(){
        frmMain->lbl50->Color=lblArray[0]->Color;
        frmMain->lbl50->Font=lblArray[0]->Font;
        frmMain->lbl100->Color=lblArray[1]->Color;
        frmMain->lbl100->Font=lblArray[1]->Font;
        frmMain->lbl200->Color=lblArray[2]->Color;
        frmMain->lbl200->Font=lblArray[2]->Font;
        frmMain->lbl300->Color=lblArray[3]->Color;
        frmMain->lbl300->Font=lblArray[3]->Font;
        frmMain->lbl500->Color=lblArray[4]->Color;
        frmMain->lbl500->Font=lblArray[4]->Font;
        frmMain->lbl1000->Color=lblArray[5]->Color;
        frmMain->lbl1000->Font=lblArray[5]->Font;
        frmMain->lbl2000->Color=lblArray[6]->Color;
        frmMain->lbl2000->Font=lblArray[6]->Font;
        frmMain->lbl4000->Color=lblArray[7]->Color;
        frmMain->lbl4000->Font=lblArray[7]->Font;
        frmMain->lbl8000->Color=lblArray[8]->Color;
        frmMain->lbl8000->Font=lblArray[8]->Font;
        frmMain->lbl16t->Color=lblArray[9]->Color;
        frmMain->lbl16t->Font=lblArray[9]->Font;
        frmMain->lbl32t->Color=lblArray[10]->Color;
        frmMain->lbl32t->Font=lblArray[10]->Font;
        frmMain->lbl64t->Color=lblArray[11]->Color;
        frmMain->lbl64t->Font=lblArray[11]->Font;
        frmMain->lbl128t->Color=lblArray[12]->Color;
        frmMain->lbl128t->Font=lblArray[12]->Font;
        frmMain->lbl500t->Color=lblArray[13]->Color;
        frmMain->lbl500t->Font=lblArray[13]->Font;
        frmMain->lblMillion->Color=lblArray[14]->Color;
        frmMain->lblMillion->Font=lblArray[14]->Font;
    }
    

    und wie man sieht nimmt die sache mit dem AKTUALISIEREN der Formular labels am meisten platz weg. da ich für jede eigenschaft ne zeile schreiben muss.

    hoffe es ist jetzt klarer



  • frmMain->lbl50->Color=lblArray[0]->Color;

    was ist lbl50 ist das nicht im array? mach doch bitte auch ein array fuer das ganze geld zeug!



  • lol glaube wurde immer noch net verstanden. und zwar befinden sich

    15 Labels auf meinem FORMULAR
    &
    15 imaginäre Labels

    Imaginäre Labels werden verändert
    &
    Die Labels auf dem FORMULAR werden an die Imaginären Labels angepasst


  • Mod

    An irgendeiner Stelle musst du dem Compiler mitteilen, wie die Labels den Indizes des Arrays zugeordnet ist. Das kann man tatsächlich elegant durch ein weiteres Array machen, wobei die Zuordnung zwischen den beiden Arrays dann trivial über den gleichen Index erfolgt. Zweitens ist es nicht sinnvoll, jedes Attribut einzeln zuzuweisen, wenn es sich tatsächlich um einen einheitlichen Vorgang handelt. Ich weiß nicht, was ein TLabel ist, und will es auch gar nicht wissen. Möglicherweise kann man es trivial zuweisen:

    *frmMain->lblMillion=*lblArray[14]
    

    zumindest lohnt sich hierfür eine eigene Funktion, um jeweils aus zwei Zuweisungen einen Funktionsaufruf zu machen. Also:

    void aktualisieren(){
        // kann man auch nicht-statisch als normale Pointer haben, darauf kommt es nicht an
        static TLabel* TfrmMain::* const label_correlation[14]={
           &TfrmMain::lbl50,  &TfrmMain::lbl100, &TfrmMain::lbl200, &TfrmMain::lbl300, &TfrmMain::lbl500, &TfrmMain::lbl1000, &TfrmMain::lbl2000,
           &TfrmMain::lbl4000, &TfrmMain::lbl8000, &TfrmMain::lbl16t, &TfrmMain::lbl32t, &TfrmMain::lbl64t, &TfrmMain::lbl128t, &TfrmMain::lbl500t, &TfrmMain::lblMillion };
        struct {
            void operator()(TLabel& lhs, TLabel& rhs){
                lhs.Color = rhs.Color;
                lhs.Font = rhs.Font;
            }
        } aktualisiere;
        for (int i = 0; i < 14; ++i)
            aktualisiere(*(frmMain->*label_correlation[i]), *lblArray[i]);
        // wenn aktualisiere nicht gerade lokal ist, wäre ein for_each angebracht,
        // umgekehrt ist der Gewinn einer eigenen Funktion nat. geringer, wenn man sowieso
        // nur eine einfache Schleife hat
    }
    


  • also irgendwie kommt es mir so vor als wenn ich kein c++ kann. oder wir reden aneinander vorbei :D.
    bin noch net gut genug um das zu verstehen. ich bin erst in der 12ten klasse und habe programmieren erst fast einem jahr.

    was ich net verstehe ist das ihr zwei arrays machen wollt.
    warum denn zwei arrays wenn ich die labels auf dem formular net verändern kann im namen. ich weiß auch jetzt net mehr wie ich das anders ausdrücken soll. bin mit meinem latein am ende. 😞



  • hier das projekt. das was ich meine befindet sich in der uWerWirdMillionär.cpp und auf dem Formular dieser datei

    http://www.sharebigfile.com/file/146364/Projekt-rar.html



  • keiner eine idee?



  • nein. aber nicht weil das problem zu kompliziert ist, sondern weil niemand nachvollziehen kann, was dein problem überhaupt ist 🙄



  • Und weil es Borland ist ^^


Log in to reply