Alternative zu FindFirst



  • Hallo zusammen,

    ich suche eigentlich eine Routine die Bilder (*.gif; *.jpg; *.png; *.bmp) in einem angegebenen Verzeichnis sucht.

    Derzeitig benutze ich die Funktionen FindFirst, FindNext. Jedoch wenn in einem Verzeichnis 5000+ Bilder drin liegen, dauert das richtig lange bis er die in einem ListView anzeigt.

    Gibt es dafür vielleicht ne andere Alternative?



  • Nutzt du schon TStrings::BeginUpdate und ::EndUpdate? Solange sollte es eigentlich nicht dauern.



  • Dasd schrieb:

    Nutzt du schon TStrings::BeginUpdate und ::EndUpdate? Solange sollte es eigentlich nicht dauern.

    Nein, das mache ich noch nicht. Wofür sollte das denn gut sein?



  • Damit wird deine ListBox nicht bei jedem hinzufügen neu gezeichnet sondern erst nach EndUpdate(). Das sollte die Sache enorm beschleunigen.



  • Hallo,

    ich würde die Anzeige über die OnData-Ereignis machen, damit kannst du 5000+ Items ohne Verzögerung anzeigen.

    Wenn du willst kann ich Dir zeigen wie man das Ereignis nutzt ist nicht ganz einfach.

    MfG Koehler



  • Koehler schrieb:

    Hallo,

    ich würde die Anzeige über die OnData-Ereignis machen, damit kannst du 5000+ Items ohne Verzögerung anzeigen.

    Wenn du willst kann ich Dir zeigen wie man das Ereignis nutzt ist nicht ganz einfach.

    MfG Koehler

    Hi Koehler,

    klar kannst Du mir das Zeigen. Denn ich weiß nicht worauf Du mit dieser Funktion hinaus willst.



  • //---------------------------------------------------------------------------
    // Für das Beispiel brauchst du eine ListView-Komponente mit 2 Columns
    //---------------------------------------------------------------------------
    TList *pItems = new TList; // Eine Liste von Zeigern auf deine Daten
    struct anzeige // Deine Daten die du anzeigen willst
    {
       String spalte1;
       int Spalte2;
    };
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // Einstellungen
     ListView1->OwnerData = true;
     ListView1->ViewStyle = vsReport;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     // 5.000 Dummies erstellen
     for (int i=0;i<5000;i++)
     {
       anzeige *neu = new anzeige;
       neu->spalte1 = "Item " + IntToStr(i+1);
       neu->Spalte2 = i + 1;
       pItems->Add(neu);
     }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
    {
            if ((Item->Index < pItems->Count))
            {
              anzeige *ausgabe = (anzeige*)pItems->Items[Item->Index];
              Item->Caption =  ausgabe->spalte1;
              Item->SubItems->Add(IntToStr(ausgabe->Spalte2));
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    // Datenbanken anzeigen
            try
            {
                    ListView1->Items->BeginUpdate();
                    Screen->Cursor = crHourGlass;
                    //pItems->Sort(ListSortFunc);
                    ListView1->Items->Count = pItems->Count;
                    ListView1->Repaint();
            }
            __finally
            {
                    ListView1->Items->EndUpdate();
                    Screen->Cursor = crDefault;
            }
    }
    //---------------------------------------------------------------------------
    

    Dann einfach die Buttons nacheinander Drücken 1,2,3...


Anmelden zum Antworten