listboxen sortieren



  • Ich habe in meinem Programm zwei listboxen.
    Beide sollen den sellben Index haben.

    int i = ListBox1->ItemIndex;
    Label1->Caption = ListBox1->Items->Strings[index];
    Label2->Caption = ListBox2->Items->Strings[index];
    

    so wenn ich jetzt die liste sortiere
    [/cpp]
    Listbox1->Sorted=true;
    [cpp]
    verändert sich der index von Listbox1 der von Listbox2 bleibt jedoch gleich aber wie kriege ich es hin das beide den index wechseln.



  • Indem du beide sortierst!? Oder nach dem Sortieren der ersten Box den ItemIndex der zweiten auf denselben Wert setzt wie den der ersten!?

    Woher soll die zweite ListBox wissen, dass sich etwas geändert hat bzw. ändern soll, wenn du ihr das nicht sagst?



  • in der ersten listbox sind beispielweise Firmen in der 2 ist das berühmteste produkt.
    wenn ich beide sortiere verändert sich ja die zugehölrigkeit.
    wie sage ich das die items der listbox2 sich dem index der listbox anzpassen haben.



  • In dem du es programmierst?
    Sorry wenn das jetzt schnippisch ist, aber du nimmst irgendwie keine Ratschläge an dich mal in die Programmierung unter dem BCB einzuarbeiten.

    Benutz doch einfach mal die Taste F1.. das würde schon viel helfen...

    Um mal wieder OnTopic zu werden...

    schau mal bei deinen Listboxen nach einem OnChange-Event oder soetwas ähnlichem.. da kannst du dann deinen Code reinpacken bzw. Funktionsaufrufe durchführen und die andere Listbox sortieren...



  • bei der listbox gibt es kein onchange



  • MikeSPK schrieb:

    ..... einem OnChange-Event oder soetwas ähnlichem..

    Du hast ein OnExit.. du hast ein OnClick..

    Edit:
    Ops... habe mir das Problem nochmal durchgelesen.... aber "F1"-Aussage bleibt bestehen und ich schließe mich Peter an.



  • Ausserdem brauchst du hier kein Event. Wie schon gesagt, setz nach dem Sortier-Aufruf einfach den ItemIndex der zweiten Box.



  • Wenn sich in einer Listbox Firmen und in der anderen Listbox zugehörende Produkte stehen, ergibt sich zunächst einmal eine Relation über den gemeinsamen Index. Sortiert man eine Listbox um, zerstört man automatisch die entsprechende Referenz.
    Um das Problem zu lösen ist erst einmal der eigene Hirnschmalz gefordert um überhaupt einen Lösungsansatz zu finden, denn in den meisten Fällen bestimmt Kreativität das Handwerk !



  • wo kann ich das denn genauer nahlesen in der hilfe.
    damit sind wir doch alle zufrieden oder ich mach was und ihr braucht mir nicht den code zugeben.



  • Ich wage mal zu behaupten, dass du in der Hilfe wohl kaum unterstützung für deinen speziellen Fall finden wirst. Die Lösung sollte schon von dir selbst kommen.



  • Es geht uberhaupt nicht darum, Dir keinen Code geben zu wollen, aber ...
    Du hst 2 Listen, Liste 1 = Firmen, Liste 2 = Produkte. Position 1 aus Liste 1 enthält einen Firmennamen und Position 1 aus Liste 2 enthält das dazugehörende Produkt. Deine Relation ist also der ItemIndex. Jetzt sortierts Du die Produktliste um und zerstörts somit Deine Relation. Die Firma an Position 1 aus Liste 1 hat jetzt ihr Produkt nicht mehr an Position 1 aus Liste 2.
    Du hast ein Problem ! Denk Dir also was aus um dieses Debakel zu lösen. Sag jetzt nicht Du bist noch Anfänger, das hat erst mal mit Programmierung primär nichts zu tun. Wie würdest Du eine Lösung angehen wollen um durch eine Sortierung den Zusammenhang zwischen Produkt und Firma nicht zu zerreissen ?

    Nachtrag:
    Dasd sagte das auch schon treffend. Hatte nur zu lange getippt 🙂



  • nur das thema (genauer sagen reicht schon)



  • Erarbeite einen Lösungsansatz, wenn dieser Probleme bereitet, poste ihn hier und wir schauen ihn uns an. Hier werden keine abstrakten Probleme behandelt. Zumindest nicht derart Grundlegende.



  • währe aber ein gutes programm für die FAQ



  • gibt es für die listbox so etwas wie move.
    somit könnte ich das problem mit einer if anweifung lösen.
    if index of listbox1 move = move index of listbox2 mit.
    würde so etwas gehen??



  • zu Move und ListBox gibst sogar ein Beispiel in der BCB-Hilfe 😉



  • aber würde es aucgh funktionieren so wie ich es mir dachte?



  • Warum probierst Du es nicht einfach mal aus?



  • [cpp]
    int e = ListBox1->ItemIndex;
    if (ListBox1->ItemIndex==ListBox2->ItemIndex)
    ListBox2->Items->Move(ListBox1->ItemIndex,e);
    ListBox1->Sorted=true;cpp]

    So hab ich mir das ungefehr zusammen geschuster aber es geht nicht ? wiso.



  • Vorschlag: Um eine "Relation" auch nach der Sortierung zu behalten, brauchst du zwei dazugehörige TStringLists (Für jede TListBox eine). Hier mal zwei kurze Funktionen:

    // Funktion sucht Item aus einem TStrings-Objekt
    int __fastcall TForm1::FindItem(TStrings* sl,String sCaption)
    {
        for(int i=0;i<sl->Count;++i)
            if(sl->Strings[i]==sCaption)
                return i;
        return -1;
    }
    // Funktion sortiert eine Listbox (lb1)
    // und sucht danach die dazugehörigen Items aus der zweiten.
    bool __fastcall TForm1::SortListBoxes(TListBox* lb1,TListBox* lb2)
    {
        // Sollten Unterschiedlichkeiten der Anzahl der Items
        // auftreten, false zurückgeben,
        // wenn lb1 schon sortiert, true.
        if(lb1->Items->Count!=lb2->Items->Count)
          return false;
        else if(lb1->Sorted)
          return true;
    
        // Zwei TStringLists zum Zwischenlagern
        TStringList* sl1=new TStringList;
        TStringList* sl2=new TStringList;
        sl1->Assign(lb1->Items);
        sl2->Assign(lb2->Items);
    
        // ListBox1 sortieren
        lb1->Sorted=true;
    
        // Alle Items von sl1 durchlaufen
        for(int i=0;i<sl1->Count;++i)
        {
            // Item in ListBox1 finden
            int pos=FindItem(lb1->Items,sl1->Strings[i]);
    
            // Bei Fehler Speicher freigeben und false zurückgeben,
            // ansonsten Item aus sl2 dem entsprechenden Item der ListBox2 zuweisen
            if(pos==-1)
            {
                delete sl1;
                delete sl2;
                return false;
            }
            else
                lb2->Items->Strings[pos]=sl2->Strings[i];
        }
    
        // Speicher freigeben und true zurückgeben
        delete sl1;
        delete sl2;
        return true;
    }
    

    Und in den Header der Unit innerhalb der Klasse "TForm1" oder wie sie auch sonst heißen mag folgendes:

    class TForm1: public TForm
    {
        __published: //...
        private: //...
        public:
            __fastcall TForm1(TComponent* Owner);
            int __fastcall FindItem(TStrings* sl,String sCaption);
            bool __fastcall SortListBoxes(TListBox* lb1,TListBox* lb2);
    };
    

    Problem: ListBox1 sollte möglichst nur eindeutige Items haben, keine doppelten, da können dann Probleme auftauchen.


Log in to reply