ListView Itemsanzahl vorher festlegen



  • hi leutz,

    ich hab da mal ne Frage. Ich lese in meinem Programm eine Datei aus und schreibe den Inhalt einer Zeile aufgeteilt in verschiedene Spalten einer ListView. Da ich auch Dateien hab mit mehreren tausend Zeilen, brauch ich auch mehrere tausend zeilen (Items) im ListView. Und bei der Ausführung dauert das je nach Datei eine kleine Ewigkeit. Hab schon probiert mit ListView->Item->EndUpdate() oder mit clear() am Anfang es schneller zu gestalten. Fehlanzeige.

    Jetzt hab ich gehört, das der ListView immer für eine kleine Menge von Items Speicher resevieren würde und wenn der nicht ausreicht neuen Speicher anfordert und das würde Zeit kosten. Und wenn man vorher wüsste wieviel Zeilen man benötigt, könne man den Speicher oder Itemsanzahl vorher festlegen. Dieses Verfahren würde erheblich an Zeitaufwand einsparen.

    Nur wie mach ich das?



  • BCB-Hilfe->TListView->Eigenschaften. Dort mal den Eintrag "AllocBy" anschauen!



  • @JeGr
    ok, danke!

    wird aber dennoch nicht wirklich schneller! hat jemand vielleicht noch ne andere Idee, was ich noch versuchen kann?



  • Was du machen könntest wäre folgendes:

    Ermittle die Anzahl der Einträge, die in deinem ListView angezeigt werden können, ohne dass gescrollt werden muss (=Anzeigebereich).

    Dann würde ich die Datei stückweise auslesen, also mit der Anzahl von Zeilen, die angezeigt werden können.

    Sobald du dann in deiner ListView scrollst, musst du dann die nächsten Zeilen aus der Datei einlesen usw.

    Damit sollte die Last verteilt sein.

    Allerdings steckt bei solch einem Ansatz mehr an Überlegungen und Programmlogik dahinter.

    Wenn du die Datei nicht ständig im Zugriff haben möchtest, dann kannst du ja zu Beginn den Inhalt in eine Stringliste laden und danach dann von dieser Stringliste aus die Daten entsprechend in die ListView schreiben.



  • Hi,

    versuch Virtual TListView

    ListView->OwnerData = true;
    und OnData, [OnDataFind, OnDataHint, OnDataStateChange]

    example:

    ListView[vsReport] = 3 Columns
    ListView->OwnerData = true;
    DynamicArray == meine Datei

    /* --------------- *.h -------------- */
    
    class TData : public TObject
    {
    private:
            AnsiString FData[3];
            AnsiString FGetData(AIndex)
              { return AIndex < 0 || AIndex > 2 ? AnsiString("") : FData[AIndex]; };
    public:
            __fastcall TData(AnsiString ACol1, AnsiString ACol2, AnsiString ACol3)
              { FData[0] = ACol1; FData[1] = ACol2; FData[2] = ACol3; };
            __property AnsiString Data[int Index] = { read=FGetData };
    };
    
    class TForm1 : public TForm
    {
    ...
    private:
            DynamicArray<TData *>DArray;
            void __fastcall ClearDynamicArray();
    ...
    };
    
    /* --------------- *.cpp -------------- */
    
    void __fastcall TForm1::ClearDynamicArray()
    {
     for (int i = 0; i < DArray.Length; i++)
      delete DArray[i];
     DArray.Length = 0;
    }
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
     ListView1->Items->Count = 0;
     ClearDynamicArray();
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     ListView1->Items->Count = 0;
     ClearDynamicArray();
    
     Screen->Cursor = crHourGlass;
     try
      {
       DArray.Length = 1000000; //Items Count
       for (int i = 0; i < DArray.Length; i++)
        DArray[i] = new TData(AnsiString("Col 1, Row ") + (i + 1), "Col 2", "Col 3");
      }
     __finally
      {
       Screen->Cursor = crDefault;
      }
    
     // Set ListView
    
     ListView1->Items->Count = DArray.Length;
     ListView1->Refresh();
    }
    
    void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
    {
     if (DArray.Length)
      {
       TData *Data = DArray[Item->Index];
       Item->Caption = Data->Data[0];
       Item->SubItems->Add(Data->Data[1]);
       Item->SubItems->Add(Data->Data[2]);
       Item->ImageIndex = 0;
      }
    }
    

    [ Dieser Beitrag wurde am 21.02.2003 um 12:53 Uhr von Blazek Jaroslav editiert. ]



  • Ein VirtualListView-Beispiel findet sich übrigens auch im \examples-Verzeichnis des BCB.


Anmelden zum Antworten