ListBox Einträge durchgehen und von Timer ansprechen lassen



  • Hallo,
    ich habe ein kleines Problem und ich hoffe hier auf Hilfe.
    Ich habe in einer Form mehrere Labels (Label1, Label2, usw)
    In einer ListBox steht nun eine Auswahl an Labels, z.B Label4 und der nächste Eintrag wäre z.B Label8.
    Nun möchte ich das genau diese Labels anfangen zu blinke.
    Das ich dies mit einem Timer und der Funktion Visable->Enable/Disable realisiere ist mir schon klar. Mein Problem ist jetzt, wie ich automatisiert alle ListBox Einträge durchgehe und die von meinem Timer angesprochen werden.
    Hat jemand eine Idee?
    Vielen Dank!!!



  • Ich verstehe gerade nicht, wo genau das Problem liegt? Festzustellen, welche Einträge in der LB markiert sind? Oder wie du einen Bezug von den Einträgen in der LB zu den Labels herstellst?



  • In der Klasse TStrings gibt es die Eigenschaft Objects.

    Nach dem folgenden Muster kannst du die Zeiger auf die Objekte gemeinsam mit dem String eintragen:

    ListBox1->Items->AddObject("Label1", (TObject *)Label1);
    

    Das Abfragen später so; hier mit Klick in die Box:

    void __fastcall TMainForm::ListBox1Click(TObject *Sender)
    {
        int inx = ListBox1->ItemIndex;
        TLabel *LB;
        for (int i = 0; i < ListBox1->Items->Count; i++) {
            LB = dynamic_cast<TLabel *> (ListBox1->Items->Objects[i]);
            if (LB) {
                if ( i == inx )
                    LB->Font->Color = clRed;  // oder Enabled...
                else
                    LB->Font->Color = clBlack;
            }
        }
    }
    

    Den Klick kann man leicht durch einen Timer ersetzen.
    Hoffe, es hilft weiter.



  • @Joe_M:
    Beides ist mein Problem. Wie gesagt, in meiner Form sind mehrere Labels z.B. Label1 - Label9 und in der ListBox stehen 2-3 Einträge z.b Label5, Label7.
    In der ListBox stehen genau die Labels, die anfangen sollen WENN sie in der ListBox stehen.
    Ich weiß jetzt nur nicht, wie ich zu einem nach und nach automatisiert die ListBox durchgehen und diese mit meinen vorhandenen Labels vergleicht.
    In anderen Worten, der erste Eintarg ist Label4, also fängt Label4 an zu blinken, der zweite Eintrag ist Label6 also fängt Label6 an zu blinken. Entferne ich z.B Label4 wieder aus der ListBox, soll Label4 natürlich auch nicht mehr blinken!



  • Hallo

    Die Labels sollten in ein Array aufgenommen werden, dann kannst du mit einer einfachen Schleife über die ListBox-Einträge iterieren und direkt die passenden Labels auswählen. Sieh auch den FAQ-Beitrag "Dynamische Arrays von Komponenten".

    Oder du ergänzt die ListBox-Einträge gleich um die Adresse des zugehörigen Labels (Siehe TListBox::Items::Objects[] ), dann kannst du direkt von Eintrag zu Label springen.

    bis bald
    akari



  • Oder aber die Liste der Komponenten im Form verwenden. Schau dazu mal in die Hilfe zu Components. Da sollten sich auch Beispiele befinden.

    Sollte so in der Art funktionieren:

    for (int i = 0; i < ListBox1->Count; i++) // durch ListBox iterieren
    	{
    		AnsiString asGesucht = ListBox1->Items->Strings[i]; // Name des aktuell gesuchtes Label
    		for (int x = 0; x < Form1->ComponentCount; x++) // durch Komponentenliste iterieren
    		{
    			TLabel* pLabel = dynamic_cast <TLabel*> (Form1->Components[x]); // versuchen aktuelle Komponente nach TLabel* zu casten
    			if (pLabel) // falls Cast erfolgreich (heisst, es ist ein TLabel)
    				if (pLabel->Caption == asGesucht) // ist es das gesuchte TLabel?
    					pLabel->Visible = !pLabel->Visible; // wenn ja, Visible-Zustand ändern.
    		}
    	}
    

Anmelden zum Antworten