Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Listview schläft ein (https://www.delphipraxis.net/24512-listview-schlaeft-ein.html)

HomerGER 22. Jun 2004 12:59


Listview schläft ein
 
Hallo
ich lese vom System alle temp dateien ein und gebe sie in ein ListView aus
zusätzlich werden noch ein Icon, dateigrösse und der ort angegeben
nun hab ich folgenden effekt
alles steht (frozen - brrrrr kalt) und wenn die die function alles abgearbeitet hat ist alles mit einmal da!
ich wollte es gern das er sobald er eine datei gefunden hat sie sofort im Listview anzeigt und nicht das alles einschläft.
ich habe es mal so mit ca. 10000 Dateien laufen lassen
es dauert auch noch ein bischen lange - kann man da noch was drehen?

Delphi-Quellcode:

//******************************************************************************
//Haupt Function
Procedure TD_Dateien_Anzeigen_WHU();
var
laufwerke_sl : TStringList;
dateien_sl :  TStringList;
i : Integer;
laufwerk_s : String;
icon_list_il : HImageList;
file_info_fi : TSHFileInfo;
file_name_s : String;
file_groesse_e : Extended;
file_groesse_s : String;
file_verzeichnis_s : String;

begin
    //Icon laden
    icon_list_il := HImageList(SHGetFileInfo('', 0, file_info_fi, SizeOf(file_info_fi), SHGFI_SYSICONINDEX or SHGFI_ICON));

    if (icon_list_il <> 0) then
    begin
        Haupt_Form.Wartung_Temp_ImageList1.Handle := icon_list_il;
        Haupt_Form.Wartung_Temp_ImageList1.Height := 16;
        Haupt_Form.Wartung_Temp_ImageList1.Width := 16;
    end;

    //ListViewlöschen
    Haupt_Form.Wartung_ListView42.Items.BeginUpdate;
    laufwerke_sl := TStringList.Create;
    dateien_sl := TStringList.Create;
    laufwerke_sl.Clear;
    dateien_sl.Clear;
    try
        //Laufwerke übergeben
        for i := 0 to Haupt_Form.Wartung_ListView41.Items.Count - 1 do
        begin
            if (Haupt_Form.Wartung_ListView41.Items.Item[i].Checked = True) then
            begin
                laufwerk_s := '';
                laufwerk_s := Copy(Haupt_Form.Wartung_ListView41.Items.Item[i].Caption, 1, 3);

                laufwerke_sl.Add(laufwerk_s);
            end;
        end;          

        //Dateien in ListCheckBoxen
        if (laufwerke_sl.Count > 0) then
        begin
            //Checkboxenlöschen
            Haupt_Form.Wartung_ListView41.Visible := False;
            Haupt_Form.Wartung_ListView42.Clear;
            Haupt_Form.Wartung_ListView42.Visible := True;

            for i := 0 to laufwerke_sl.Count - 1 do
            begin
                Dateien_Suchen_GU(dateien_sl, laufwerke_sl.Strings[i], '*.tmp');
            end;

            for i := 0 to dateien_sl.Count - 1 do
            begin

                file_name_s := ExtractFileName(dateien_sl.Strings[i]);

                file_groesse_e := Datei_Groesse_GU(dateien_sl.Strings[i]);
                file_groesse_s := Datei_Groesse_Format_GU(file_groesse_e);

                file_verzeichnis_s := ExtractFilePath(dateien_sl.Strings[i]);

                Haupt_Form.Wartung_ListView42.Items.Add;
                Haupt_Form.Wartung_ListView42.Items.Item[i].Caption := file_name_s;
                Haupt_Form.Wartung_ListView42.Items.Item[i].SubItems.Add(file_groesse_s);
                Haupt_Form.Wartung_ListView42.Items.Item[i].SubItems.Add(file_verzeichnis_s);

                //Icon
                SHGetFileInfo(PChar(dateien_sl.Strings[i]), 0, file_info_fi, SizeOf(file_info_fi), SHGFI_SYSICONINDEX or SHGFI_ICON);
                Haupt_Form.Wartung_ListView42.Items.Item[i].ImageIndex := file_info_fi.iIcon;

            end;
        end;
    finally
        laufwerke_sl.Free;
        dateien_sl.Free;
        Haupt_Form.Wartung_ListView42.Items.EndUpdate;
    end;

end;
Warung_ListView41 sind die Laufwerk
Wartung_ListView42 sind die Dateien

Sharky 22. Jun 2004 13:02

Re: Listview schläft ein
 
Hai HomerGER,

wenn ich deinen Code richtig verstehe sagst Du der ListView ja mit .BeginUpDate das sie nicht neu Zeichnen soll wenn ein neuer Eintrag gemacht wurde.
Delphi-Quellcode:
.
.   Haupt_Form.Wartung_ListView42.Items.BeginUpdate;
.
    finally
        Haupt_Form.Wartung_ListView42.Items.EndUpdate;
    end;
Nachtrag:

Zitat:

Zitat von Die Online-Hilfe
Die Methode BeginUpdate verhindert die Aktualisierung des TListItem-Objekts, bis die Methode EndUpdate aufgerufen wird.


Tom 22. Jun 2004 13:03

Re: Listview schläft ein
 
Application.ProzessMessages heißt das Zauberwort ..., allerdings bin ich mir nicht sicher, ob es wirklich Sinn ergibt 10000 Dateien im Listview anzuzeigen. Dauert ein bißchen lange, oder?

Ultimator 22. Jun 2004 13:03

Re: Listview schläft ein
 
Man könnte aber auch ein Application.ProcessMessages einbauen, oder?

[edit] Warum bin ich immer der letzte... [/edit]

MathiasSimmack 22. Jun 2004 13:06

Re: Listview schläft ein
 
Zitat:

Zitat von HomerGER
nun hab ich folgenden effekt
alles steht (frozen - brrrrr kalt) und wenn die die function alles abgearbeitet hat ist alles mit einmal da!

Ja, das liegt am "BeginUpdate"/"EndUpdate". Der Hintergedanke ist ja eben der, dass die Ausgabe solange blockiert wird, bis alles fertig ist. Dieser Weg ist auch IMHO etwas schneller, weil das Control nur ein einziges Mal (nämlich am Ende) aktualisiert werden muss.

Zitat:

ich wollte es gern das er sobald er eine datei gefunden hat sie sofort im Listview anzeigt und nicht das alles einschläft.
Lass die o.g. beiden Befehle weg und probier mal, inwieweit das noch vernünftig geht.

Zitat:

es dauert auch noch ein bischen lange - kann man da noch was drehen?
Das Laden der System-Imageliste und das Zuweisen kannst du IMHO einmal beim Start des Programms machen ("OnCreate", als Beispiel). Ansonsten lässt sich das recht schwer sagen, wenn man nicht sieht, auf welche Weise du die Dateien scannst (dürfte wohl "Dateien_Suchen_GU" sein).
Aber komme jetzt bitte nicht auf die Idee, die komplette Unit zu posten. ;) Anhängen wäre evtl. der bessere Weg. :stupid:

Aber ich glaube, man könnte wohl irgendwie auch auf die Stringlisten verzichten.

MathiasSimmack 22. Jun 2004 13:08

Re: Listview schläft ein
 
Zitat:

Zitat von Ultimator
Man könnte aber auch ein Application.ProcessMessages einbauen, oder?

Aber nur in Maßen. Vielleicht ist es auch nur ein Gerücht, aber irgendwer schrieb/sagte mal: Wenn man das zu oft aufruft, erreicht man das Gegenteil - die Anwendung wird etwas langsamer. Darum gibt es in einigen Foren Beispiele, in denen "ProcessMessages" innerhalb einer Schleife aufgerufen wird ... aber nur bei jedem 20. Durchlauf o.ä.

HomerGER 22. Jun 2004 13:09

Re: Listview schläft ein
 
@Sharky auch ohne Update schläft er ein

@Tom ja es dauert ein bischen lang - ein bischen sehr lang - es sollte aber schon ein ListView sein


mir geht es jetzt darum den code zu optimieren - wenn das geht
sprich die einträge, wenn er eine datei gefunden hat sofort zu aktualisieren
ich lese sie erst in eine stringlist und dann sollte er sie nach und nach in das Listview dranhängen - sortiert sind sie ja

und das auch noch schnell

HomerGER 22. Jun 2004 13:11

Re: Listview schläft ein
 
Datei suchen

Delphi-Quellcode:
//##############################################################################
//##############################################################################
//Dateien Suchen
//##############################################################################
//##############################################################################
//******************************************************************************
//Dateien suchen
Procedure Dateien_Suchen_GU(var filelist_sl : TStringList; laufwerk_s : string; mask_s : string);
var
SR: TSearchRec;
begin
    //Auf Backlash prüfewn
    if (AnsiLastChar(laufwerk_s)^ <> '\') then
    begin
        laufwerk_s := laufwerk_s + '\';
    end;

    //Alle Ordner
    if FindFirst(laufwerk_s + '*.*', faAnyFile, SR) = 0 then
        try
            repeat
                if (SR.Attr and faDirectory = faDirectory) then
                begin
                    if ((SR.Name <> '.') and (SR.Name <> '..')) then
                    begin
                        Dateien_Suchen_GU(filelist_sl, laufwerk_s + SR.Name, mask_s);
                    end;
                end;
            until FindNext(SR) <> 0;
        finally
        FindClose(SR);
    end;

    //Alle Dateien
    if FindFirst(laufwerk_s + mask_s, faAnyFile, SR) = 0 then
    try
        repeat
            if (SR.Attr and faDirectory <> faDirectory) then
            begin
                filelist_sl.Add(laufwerk_s + SR.Name);
            end;
        until FindNext(SR) <> 0;
    finally
        FindClose(SR);
    end;
end;

Sharky 22. Jun 2004 13:14

Re: Listview schläft ein
 
Hai HomerGER,

wie wäre es zu versuchen mit einem Timer z.b alle 500-ms diesen Code aufzurufen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  ListView1.Items.EndUpdate;
  ListView1.Items.BeginUpdate;
  Application.ProcessMessages;
end;

MathiasSimmack 22. Jun 2004 13:15

Re: Listview schläft ein
 
Also, das try/finally kannst du dir hier schon mal sparen:
Zitat:

Zitat von HomerGER
Delphi-Quellcode:
    if FindFirst(laufwerk_s + '*.*', faAnyFile, SR) = 0 then
        try
            repeat
                if (SR.Attr and faDirectory = faDirectory) then
                begin
                    if ((SR.Name <> '.') and (SR.Name <> '..')) then
                    begin
                        Dateien_Suchen_GU(filelist_sl, laufwerk_s + SR.Name, mask_s);
                    end;
                end;
            until FindNext(SR) <> 0;
        finally
        FindClose(SR);
    end;

Nötig wäre das IMHO nur wenn du die API-Kommandos direkt verwendest. Bei Borlands Variante aus der "SysUtils"-Unit ist das aber nicht erforderlich. Da genügt ein simples:
Delphi-Quellcode:
if FindFirst(...) = 0 then
repeat
  { ... }
until FindNext(SR) <> 0;
FindClose(SR);


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz