AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Listview schläft ein

Ein Thema von HomerGER · begonnen am 22. Jun 2004 · letzter Beitrag vom 22. Jun 2004
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von HomerGER
HomerGER

Registriert seit: 8. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#1

Listview schläft ein

  Alt 22. Jun 2004, 12:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.248 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:02
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 von Die Online-Hilfe:
Die Methode BeginUpdate verhindert die Aktualisierung des TListItem-Objekts, bis die Methode EndUpdate aufgerufen wird.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Tom

Registriert seit: 7. Jan 2003
318 Beiträge
 
RAD-Studio 2009 Pro
 
#3

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:03
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?
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:03
Man könnte aber auch ein Application.ProcessMessages einbauen, oder?

[edit] Warum bin ich immer der letzte... [/edit]
Julian J. Pracht
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:06
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.

Aber ich glaube, man könnte wohl irgendwie auch auf die Stringlisten verzichten.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:08
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.ä.
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 8. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#7

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:09
@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
  Mit Zitat antworten Zitat
Benutzerbild von HomerGER
HomerGER

Registriert seit: 8. Jun 2003
390 Beiträge
 
Delphi 7 Professional
 
#8

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:11
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.248 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:14
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: Listview schläft ein

  Alt 22. Jun 2004, 13:15
Also, das try/finally kannst du dir hier schon mal sparen:
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);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf