listboxen sortieren



  • 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.



  • erstmal danke windoof endlich einer der sich einsetzt danke.
    das programm macht sich bestimmt in der FAQ gut.
    aber eine andere lösung die kürzer ist wäre auch gut.
    danke trotzdem. darauf währe ich nie gekommen.



  • Warum nicht so?: 🕶

    Wenn ich 2 Listen mit Eintraegen SYNCHRON auch nach sortieren brauche, nehm ich ein ListView mit 2 (mehr) Spalten!

    Haupteintrag in Caption, alle anderen in SubStrings ... 😉



  • DerAltenburger schrieb:

    Warum nicht so?: 🕶

    Wenn ich 2 Listen mit Eintraegen SYNCHRON auch nach sortieren brauche, nehm ich ein ListView mit 2 (mehr) Spalten!

    Haupteintrag in Caption, alle anderen in SubStrings ... 😉

    ich habe ein paar fragen zu dem listview es sollen nähmlich 6-9 spalte sein.
    kann man die im list view alle unterbringen?



  • Hat dein Rechner keine F1 Taste ?



  • Nein, das ist die Tastatur passend zur BCB-Version, die ohne Hilfesystem ausgeliefert wird. Vermutlich war's ein Bundle....


Anmelden zum Antworten