ListView zwingt meinen Rechner in die Knie



  • Hallo zusammen, ich habe da ein Problem.Mein code sieht folgendermassen aus:

    TListItem *ListItem;
    for(int i=0;i<FormHauptmenu->Reihenanzahl-1;i++)
          {
             if(x[f]<x[FormHauptmenu->Zahlenanzahl-1])
             {
                ListItem=FormHauptmenu->ListView1->Items->Add();
                ListItem->Caption=IntToStr(i+2);
                f=f+1;
                ListItem->SubItems->Add(IntToStr(x[a]));
                ListItem->SubItems->Add(IntToStr(x));
                ListItem->SubItems->Add(IntToStr(x[c]));
                ListItem->SubItems->Add(IntToStr(x[d]));
                ListItem->SubItems->Add(IntToStr(x[e]));
                ListItem->SubItems->Add(IntToStr(x[f]));
             }
             else
             {
                if(x[e]<x[FormHauptmenu->Zahlenanzahl-2])
                {
    
                   ListItem=FormHauptmenu->ListView1->Items->Add();
                   ListItem->Caption=IntToStr(i+2);
                   e=e+1;
                   f=e+1;
                   ListItem->SubItems->Add(IntToStr(x[a]));
                   ListItem->SubItems->Add(IntToStr(x[b]));
                   ListItem->SubItems->Add(IntToStr(x[c]));
                   ListItem->SubItems->Add(IntToStr(x[d]));
                   ListItem->SubItems->Add(IntToStr(x[e]));
                   ListItem->SubItems->Add(IntToStr(x[f]));
                }
                else
                {
                   if(x[d]<x[FormHauptmenu->Zahlenanzahl-3])
                   {
                      ListItem=FormHauptmenu->ListView1->Items->Add();
                      ListItem->Caption=IntToStr(i+2);
                      d=d+1;
                      e=d+1;
                      f=e+1;
                      ListItem->SubItems->Add(IntToStr(x[a]));
                      ListItem->SubItems->Add(IntToStr(x[b]));
                      ListItem->SubItems->Add(IntToStr(x[c]));
                      ListItem->SubItems->Add(IntToStr(x[d]));
                      ListItem->SubItems->Add(IntToStr(x[e]));
                      ListItem->SubItems->Add(IntToStr(x[f]));
                   }
                   else
                   {
                      if(x[c]<x[FormHauptmenu->Zahlenanzahl-4])
                      {
                         ListItem=FormHauptmenu->ListView1->Items->Add();
                         ListItem->Caption=IntToStr(i+2);
                         c=c+1;
                         d=c+1;
                         e=d+1;
                         f=e+1;
                         ListItem->SubItems->Add(IntToStr(x[a]));
                         ListItem->SubItems->Add(IntToStr(x[b]));
                         ListItem->SubItems->Add(IntToStr(x[c]));
                         ListItem->SubItems->Add(IntToStr(x[d]));
                         ListItem->SubItems->Add(IntToStr(x[e]));
                         ListItem->SubItems->Add(IntToStr(x[f]));
                      }
                      else
                      {
                         if(x[b]<x[FormHauptmenu->Zahlenanzahl-5])
                         {
                            ListItem=FormHauptmenu->ListView1->Items->Add();
                            ListItem->Caption=IntToStr(i+2);
                            b=b+1;
                            c=b+1;
                            d=c+1;
                            e=d+1;
                            f=e+1;
                            ListItem->SubItems->Add(IntToStr(x[a]));
                            ListItem->SubItems->Add(IntToStr(x[b]));
                            ListItem->SubItems->Add(IntToStr(x[c]));
                            ListItem->SubItems->Add(IntToStr(x[d]));
                            ListItem->SubItems->Add(IntToStr(x[e]));
                            ListItem->SubItems->Add(IntToStr(x[f]));
                         }
                         else
                         {
                            ListItem=FormHauptmenu->ListView1->Items->Add();
                            ListItem->Caption=IntToStr(i+2);
                            a=a+1;
                            b=a+1;
                            c=b+1;
                            d=c+1;
                            e=d+1;
                            f=e+1;
                            ListItem->SubItems->Add(IntToStr(x[a]));
                            ListItem->SubItems->Add(IntToStr(x[b]));
                            ListItem->SubItems->Add(IntToStr(x[c]));
                            ListItem->SubItems->Add(IntToStr(x[d]));
                            ListItem->SubItems->Add(IntToStr(x[e]));
                            ListItem->SubItems->Add(IntToStr(x[f]));
    
                         }
                       }
                    }
                 }
              }
    

    **

    sobald ich die schleife durchlaufen lasse merke ich wie mein rechner sich zu tode rechnet. Der Speicherverbrauch steigt permanent an.
    Vorher habe ich das problme anstatt eines ListView mit einem ListBox gelöst. Das lief super schnell. Ich würde aber aus schönheitsgründen lieber ein ListView haben. Kann es sein dass ListView so die performance kaputt macht. sollte ich liebe doch auf ListBox zurückkehren? Habe ich ihm code einen fehler gemacht? Kann mir vieleicht jemand helfen?

    **Edit:
    Bitte die Code-Tags benutzen. Danke!



  • also dein code ist ganz schön aufgeblasen und unübersichtlich

    ich helf dir jetzt zwar nicht bei deinem problem, aber hier trotzdem ein paar tips:

    folgender code kommt 6 mal vor:

    ListItem=FormHauptmenu->ListView1->Items->Add(); 
    ListItem->Caption=IntToStr(i+2); 
    .
    .
    .
    ListItem->SubItems->Add(IntToStr(x[a])); 
    ListItem->SubItems->Add(IntToStr(x[b])); 
    ListItem->SubItems->Add(IntToStr(x[c])); 
    ListItem->SubItems->Add(IntToStr(x[d])); 
    ListItem->SubItems->Add(IntToStr(x[e])); 
    ListItem->SubItems->Add(IntToStr(x[f]));
    

    was spricht dagegen, den code einmal ans ende zu stellen, da er eh auf jeden fall einmal ausgeführt wird
    (damit meine ich natürlich ans ende der zahlreichen if-bedingungen, trotzdem noch innerhalb der schleife)
    dann rate ich dir dringend deine krassen verschachtelungen einzurücken, da sieht ja kein schwein durch

    und benutze bitte beim nächsten post die code-tags



  • danke schön. du hast recht. Das sah ja echt zu schreien aus. Ich habe das jetzt so korrigiert. Doch leider bringt das nicht viel an geschwindigket. wie gesagt. Wenn ich das ganze nicht mit ListView sondern mit ListBox löse dann geht das so schnell wie ich es möchte. Woran kann es liegen? Ich habe mal im netz gefunden da stand dass ListView allgemein sehr langsam sein soll sobald die anzahl der Zeile rapide ansteigt. Bei meiner schleife können es mehrere Tausende zeile geben. ListBox kommt damit aber problemlos klar.
    Hier nochmal mein Code nochmal überarbeitet.

    TListItem *ListItem;
    for(int i=0;i<FormHauptmenu->Reihenanzahl-1;i++)
    {
       if(x[f]<x[FormHauptmenu->Zahlenanzahl-1])
       {
          f=f+1;
       }
       else
       {
          if(x[e]<x[FormHauptmenu->Zahlenanzahl-2])
          {
             e=e+1;
             f=e+1;
          }
          else
          {
             if(x[d]<x[FormHauptmenu->Zahlenanzahl-3])
             {
                d=d+1;
                e=d+1;
                f=e+1;
             }
             else
             {
                if(x[c]<x[FormHauptmenu->Zahlenanzahl-4])
                {
                   c=c+1;
                   d=c+1;
                   e=d+1;
                   f=e+1;
                }
                else
                {
                    if(x[b]<x[FormHauptmenu->Zahlenanzahl-5])
                    {
                        b=b+1;
                        c=b+1;
                        d=c+1;
                        e=d+1;
                        f=e+1;
                    }
                    else
                    {
                        a=a+1;
                        b=a+1;
                        c=b+1;
                        d=c+1;
                        e=d+1;
                        f=e+1;
                     }
                  }
               }
            }
         }
         ListItem=FormHauptmenu->ListView1->Items->Add();
         ListItem->Caption=IntToStr(i+2);
    
         ListItem->SubItems->Add(IntToStr(x[a]));
         ListItem->SubItems->Add(IntToStr(x[b]));
         ListItem->SubItems->Add(IntToStr(x[c]));
         ListItem->SubItems->Add(IntToStr(x[d]));
         ListItem->SubItems->Add(IntToStr(x[e]));
         ListItem->SubItems->Add(IntToStr(x[f]));
         FormHauptmenu->ProgressBar1->Position++;
      }
    

    Was ist mit verschachtelung gemeint?



  • schreib mal vor der for-schleife folgendes

    FormHauptmenu->ListView1->Items->BeginUpdate();
    

    und nach der for-schleife dieses hier

    FormHauptmenu->ListView1->Items->EndUpdate();
    

    mit verschachtelung meinte ich deine if-bedingungen
    folgt nach einer if ein nächstes, so ist dies eine verschachtelung von zwei if-bedingungen

    aber du hast es ja bereits eingerückt



  • Hmmm auf so ein einfaches Gemüt wie das Meine wirkt das Ganze sowieso etwas mmh, verwirrend? Was willste denn eigentlich erreichen?

    -junix



  • hab auch versucht dahinterzusteigen was der code eigentlich bewirken soll
    ist mir auch nicht so ganz gelungen 😉
    aber dass war nicht sein problem, deswegen hab ichs dann auch sein gelassen



  • Jester2000 schrieb:

    hab auch versucht dahinterzusteigen was der code eigentlich bewirken soll
    ist mir auch nicht so ganz gelungen 😉

    mir auch nicht, aber es riecht irgendwie rekursiv ...



  • Hallo, es ist einfach ein kleines Lotto programm dass zb. 14 zahlen in jeder möglichen 6er kombination ausgeben soll. Mein problem ist halt dass ich das gerne in listview ausgeben möchte. Vorher hatte ich die ausgabe der zahlne in einer listbox und es lieft wunderbar. doch leider möchte ich das in listview haben da ich dann später besser auf die einzelnen zahlen zugreifen kann denn diese haben ja eigene zellen. Nur leider will listview nicht ganz, denn ab eine gewissen zeileanzahl hängt sich das programm so gut wie auf. Was ich aber mal im netz gelesen habe, ist dass listview ab einer gewissen anzahl von zeilen rapide an geschwindigkeit verlieren. Kann mir das vieleicht jemand bestätigen? Oder sollte ich dann doch bei Listbox bleiben ( oder gibt es noch andere alternativen?)



  • Ein TStringGrid wäre wohl eher angebracht hierfür.

    Wobei mir immernoch schleierhaft ist, was der ganze Code da soll... nur um ein paar Zahlen zu generieren kanns ja wohl nicht sein?

    Anders ausgedrückt: Vielleicht solltest du deinen Code mal kommentieren? Also wenn ich mehr als eine Bildschirmseite Code sehe und weit und breit keine einzige Zeile kommentar, kommt mir persönlich das Grausen...

    -junix


Anmelden zum Antworten