Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   progressbar/dateien (https://www.delphipraxis.net/159815-progressbar-dateien.html)

Heinziheinz 13. Apr 2011 22:02


progressbar/dateien
 
hi leute ich habe einen code zusammengebastelt der mir erlaubt auf meinem pc mittels FindAllfiles rekursiv nach datein zu suchen, die links der gefundenen dateien werden bei mir in einer combobox ausgegeben und ich möchte diesen vorgang gerne entweder in einer progressbar darstellen oder zumindest den fortschritt angezeigt bekommen wie viele dateien schon gefunden wurden wobei ich das finden der dateien life miterleben will. ich möchte nicht nur das endergebnis wissen wie viele datein gefunden wurde, sondern beim programmlauf sehen dass die zahl der gefundenen dateien größer wird.über eine der beiden mögligkeiten würd ich mich freuen am besten natürlich über beide. Ich bin noch ein programmieranfänger deshalb wäre ein codeschnipsel nicht schlecht. am besten gleich mit erklärung wie ich das auszuführen habe und welche sachen ich dafür brauch

delphi code:


Delphi-Quellcode:
procedure GetFilesInDirectory(Directory: string; const Mask: string;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);

procedure ScanDir(const Directory: string);
var
  SR: TSearchRec;
begin
  if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try
    repeat
    counter := counter +1;
      List.Add(Directory + SR.Name)
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;

  if WithSubDirs then begin
    if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
      repeat
        if ((SR.attr and faDirectory) = faDirectory) and
           (SR.Name <> '.') and (SR.Name <> '..') then
          ScanDir(Directory + SR.Name + '\');
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
end;

begin
  List.BeginUpdate;
  try
    if ClearList then
      List.Clear;
    if Directory = '' then Exit;
    if Directory[Length(Directory)] <> '\' then
      Directory := Directory + '\';
    ScanDir(Directory);
  finally
    List.EndUpdate;
  end;
end;


{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetFilesInDirectory(edit1.text, '*.'+edit2.text, Listbox1.Items, checkbox1.Checked, True);
  if counter >1 then
  begin
  label1.caption := 'Es wurden '+inttostr(counter)+' '+edit2.text+' Dateien gefunden.';
  end
  else
  label1.caption := 'Es wurde '+inttostr(counter)+' '+edit2.text+' Datei gefunden.';
  counter:=0;
end;

Sir Rufo 13. Apr 2011 22:29

AW: progressbar/dateien
 
Erst mal ein Willkommen in der DP :)

Das von dir gewünschte wirst du nur über einen separaten Thread vernünftig hinbekommen.
Der Thread kümmert sich um das Suchen der Dateien und meldet dann immer wieder an den Hauptthread wie weit er schon ist.

Schau mal über die SuFu nach Threads - da wirst du einiges finden.

Heinziheinz 13. Apr 2011 22:36

AW: progressbar/dateien
 
ach tu kage das is ja viel zu lesen xD...dannke fürs wilkommenheißen =) naja ich wühl mich ma durch, aba wen du ma zeit hast kanste mir ja ne zusammfassung schreiben was ich brauch ums das so zu machn und wie ichs dann umsetz =) dankö im voraus

Sir Rufo 13. Apr 2011 22:48

AW: progressbar/dateien
 
Zitat:

Zitat von Heinziheinz (Beitrag 1094960)
ach tu kage das is ja viel zu lesen xD...dannke fürs wilkommenheißen =) naja ich wühl mich ma durch, aba wen du ma zeit hast kanste mir ja ne zusammfassung schreiben was ich brauch ums das so zu machn und wie ichs dann umsetz =) dankö im voraus

Hier im Forum gibt es so einige Beiträge, wo ich mich zum Thema Threads geäußert habe.
(allerdings bin ich nicht der einzige)
Weiterhin gibt es auch Tutorials dazu.

Wenn du eine konkrete Frage hast, wirst du die auch konkret beantwortet bekommen.
Eine Anfrage wie du sie gestellt hast (mach da mal was für mich), wird hier nicht gern gesehen - Ausnahme in der Sparte Jobangebote

Grund: Dir ist es freigestellt hier Fragen zu stellen und allen anderen ist es freigestellt zu antworten ;)

Heinziheinz 13. Apr 2011 22:53

AW: progressbar/dateien
 
jou ich wühl mich ma kurz duch n paar turtorials durch und dan stell ich ne konkrete frage =), da ich in diesem forrum neu bin nich pös sein wen ich was überlese =) außerdem bin ich ein programmieranfänger dat heist ich höre den begriff thread zum ersten mal xD..naja mal schaun eine frage kommt bald oder auch mehrere =)

Sir Rufo 13. Apr 2011 22:58

AW: progressbar/dateien
 
Zitat:

Zitat von Heinziheinz (Beitrag 1094963)
jou ich wühl mich ma kurz duch n paar turtorials durch und dan stell ich ne konkrete frage =), da ich in diesem forrum neu bin nich pös sein wen ich was überlese =) außerdem bin ich ein programmieranfänger dat heist ich höre den begriff thread zum ersten mal xD..naja mal schaun eine frage kommt bald oder auch mehrere =)

So schnell werden wir nicht böse :mrgreen:

Kleiner Tip Hier im Forum suchenThread FindFile

Heinziheinz 13. Apr 2011 23:10

AW: progressbar/dateien
 
okej es gibt gute und schlechte nachrichten xD
gute: ich weis jez was n thread is und wofür man ihn brauch
schlechte: i hab voll nich gerafft wie man son ding erstellt und wie es mir das liefern soll was ich von meinem programm brauche...um das mit der progressbar zu machen müsste ich dem 2tem thread theoretisch beibringen wärend mein hauptthread läuft die komplette festplatte zu scanen die anzahl der gesamtdateien zu bestimmen und dementsprechend die progressbar zu formen..klingt sehr kompliziert und wird mein programm warscheinlich unglaublich verlangsammen...die 2te mäöglichkeit ist: jedes mal wenn mein programm eine neue datei findet, schikt der 2te thread auf irgend eine art und weise dem hauptthread die anzahl der gefundenen dateien die auch noch aktualisiert werden müssen. soviel zum plan und da ich keine ahnung habe wie man das auch nur annärend passend zu meinem code umsetzt würde ich mich jetzt auf hilfe freuen...mist immer noch keine konkrete frage :P =)

Sir Rufo 13. Apr 2011 23:15

AW: progressbar/dateien
 
Zitat:

Zitat von Heinziheinz (Beitrag 1094968)
okej es gibt gute und schlechte nachrichten xD
gute: ich weis jez was n thread is und wofür man ihn brauch
schlechte: i hab voll nich gerafft wie man son ding erstellt und wie es mir das liefern soll was ich von meinem programm brauche...um das mit der progressbar zu machen müsste ich dem 2tem thread theoretisch beibringen wärend mein hauptthread läuft die komplette festplatte zu scanen die anzahl der gesamtdateien zu bestimmen und dementsprechend die progressbar zu formen..klingt sehr kompliziert und wird mein programm warscheinlich unglaublich verlangsammen...die 2te mäöglichkeit ist: jedes mal wenn mein programm eine neue datei findet, schikt der 2te thread auf irgend eine art und weise dem hauptthread die anzahl der gefundenen dateien die auch noch aktualisiert werden müssen. soviel zum plan und da ich keine ahnung habe wie man das auch nur annärend passend zu meinem code umsetzt würde ich mich jetzt auf hilfe freuen...mist immer noch keine konkrete frage :P =)

Sorry, aber bei dem Geschreibsel Krieg ich ja Augenkrebs :cyclops:
Kannst du mal etwas öfter die Return-Taste bemühen.
Auch das Verwenden der Shift-Taste zum GROSS und klein Schreiben trägt zur Lesbarkeit bei ;)

Ach ja, so dolle nutzen die auch nicht ab dabei :mrgreen:

So please dry again

Heinziheinz 13. Apr 2011 23:24

AW: progressbar/dateien
 
okej nochmal langamm und deutlich :

ich habe gut und schlechte Nachrichten (für mich):

1) ich weis jetzt was ein thread ist und wofür man ihn brauch

jetzt zu den schlechten:

zu meinen Fragen:

1) Progressbar: anscheint sehr schwer umzusetzen, da ich die Gesamtanzahl der Dokumente brauche und aus der Differenz dieser und der schon gefundenen Dateien die Position der Progressbar ermitteln kann. Verlangsamt mein Programm um ein vielfaches und für mich als Anfänger unmöglich umzusetzen.

2) Rückmeldung des threads: Schon eher mein Fall. Ich muss den code den ich da habe in einen 2ten thread packen, dieser soll dann Rückmeldungen an meinen hauptthread geben wie weit er ist und dabei meinen Hauptthread aktualisieren. Soviel zur theorie

3) Mein gröstes Problem: ich habe keinen blassen Schimmer wie ich die 2te Möglichkeit anständig in einen PASSENDEN code umsetze und anwende. Jetzt kommt die Hilfe ins spiel =)

Sir Rufo 13. Apr 2011 23:43

AW: progressbar/dateien
 
1)
Bei den Links gab es einen charmanten Ansatz wie man den maximalen Wert für den Fortschritt ungefähr ermitteln kann.
Man ermittelt den belegten Speicherplatz der Festplatte und nimmt diesen als Max-Wert.
Als Fortschritt summiert man die Größe der gefundenen Dateien

2)
Suche hier im Forum mal nach den Schlagwörtern Hier im Forum suchenSynchronize bzw. hier wohl besser geeignet Hier im Forum suchenQueue

3)
Ein Thread ist eigentlich relativ einfach aufgebaut.
http://www.delphipraxis.net/1081121-post39.html da ein Beispiel mit einem Thread in einem kompletten Programm (Source und Exe)

Heinziheinz 13. Apr 2011 23:52

AW: progressbar/dateien
 
1) wie genau xD
2) grad dabei
3) relativ einfach!!!????!!!! ich mach informatik seit m halben jahr iner schule... o.o das is nich relativ einfach...aber ich schaus mir mal an, ich versuchs mal zu verstehen

Heinziheinz 14. Apr 2011 00:15

AW: progressbar/dateien
 
okej i hab mir mal deinen code über die verschiedenen threads angeguckt. Stimmt so schwer ist es nicht den tread zu bauen, das schwierige ist es wohl in den thread das reinzu bekommen was man drin haben will...
und in meinem fall ist es diese doofe funktion die mir sagt wie viele dateien gefunden worden sind...
kanste mir da behilflich sein?

Luckie 14. Apr 2011 01:12

AW: progressbar/dateien
 
Bitte, bitte tue uns allen einen gefallen und versuche mal vernünftiges Deutsch zu schreiben und zwar inklusive Groß- und Kleinschreibung und Zeichensetzung.

Das Problem ist doch folgendes: Ohne zu wissen, wie viele Dateien es gibt, kannst du auch keinen Fortschritt anzeigen, da du die maximale Anzahl an Dateien nicht kennst. Wenn du dem Benutzer visualisieren willst, dass noch was passiert, kannst du einfach die Anzahl der gefundenen Dateien anzeigen. Oder du machst es wie ich in der Unit MpuDriveTools.pas (http://www.michael-puff.de/Programmierung/Delphi/Units/) und zählst zu erst nur die Verzeichnisse. Das geht relativ schnell, da meist bedeuten weniger Verzeichnisse existieren, wie Dateien. dann führst du Dateisuche durch und zählst die Verzeichnisse mit. Da du jetzt einen Maximalwert hast, kannst du eine prozentuale Fortschrittsanzeige steuern.

himitsu 14. Apr 2011 05:42

AW: progressbar/dateien
 
Man mag es kaum Glauben, aber die SuFu lebt noch.
FindAllFiles mit FortschrittFindAllFiles mit Fortschritt
Hier im Forum suchenDateisuche mit Fortschritt

http://www.delphipraxis.net/142669-f...iterative.html
http://www.delphipraxis.net/147309-p...dallfiles.html
http://www.delphipraxis.net/144461-d...-rekursiv.html
http://www.delphipraxis.net/76285-fo...estplatte.html

In dem Callback meiner Funktionen kann man die aktuellen Infos anzeigen.

PS:
- die Combobox ist beim Befüllen sehr langsam, da sie sich bei jedem neuen Eintrag aktualisiert
> Combobo.Items.BeginUpdate Delphi-Referenz durchsuchenBeginUpdate

- das Durchsuchen geht recht schnell und die Anzeige jeder einzelnen Datei (vorallem bei vielen Dateien) bremst die Suche sehr aus
> also nicht jedes einzelnes Verzeichnis oder gar jede Datei als Fortschritt anzeigen
so alle 100 bis 250 ms eine neue Anzeige ist vollkommen ausreichend, um dennoch flüssig zu wirken und nicht zu sehr zu Bremsen

Heinziheinz 14. Apr 2011 08:27

AW: progressbar/dateien
 
oke vielen dank erstmal ich schau mir jez mal die gesamten Links an =)

Heinziheinz 14. Apr 2011 09:16

AW: progressbar/dateien
 
Luckie das was du da geschrieben hast ist genau das was ich brauche.
Das Ermitteln der Gesamtordner ist warscheinlich kein Problem, kriege ich nach n bischen Suche in Google raus. aber könnteste vielleicht mir beim 2ten teil helfen? Und zwar:
1) wie sage ich dem Programm, dass es die Ordner zälen soll in denen es drin war?
2) wie forme ich aus dem max Wert und der Anzahl der gefundenen Ordner eine Progressbar?

Luckie 14. Apr 2011 09:59

AW: progressbar/dateien
 
1) Siehe mein Code
2) Prozentrechnung, sechste Klasse. Du hast den Maximalwert und du hast den Prozentwert. Daraus die Prozente zu errechnen sollte kein Problem sein. Dann den Maximalwert der Fortschrittsanzeige auf 100 setzen. Fertig. Oder du sparst dir die Umrechnung in Prozent, setzt den Maximalwert auf die Anzahl der Verzeichnisse und zählst einfach so mit.

himitsu 14. Apr 2011 10:13

AW: progressbar/dateien
 
Für eine reine Dateisuche ist eine ProgressBar vollkommen kontraproduktiv.

Dafür müßter man ja erstmal alles durchsuchen und zählen, damit man den Max-Wert der ProgressBar rausbekommt.
Und dann soll man nocheinmal suchen?

Der erste Suchdurchlauf wird oftmals länger dauern, da beim zweiten Durchlauf die Verzeichnisse schon in der WindowsFileCache vorgeladen sind.
Somit dauert das Zählen wesentlich länger, als der eigentliche Suchdurchlauf und insgesammt dauern 2 Durchläufe auch noch länger.

Eine ProgressBar im Marquee-Style und die Anzeige des aktuellen Verzeichnisses sind also vollkommen ausreichend und auch noch am Schnellsten.
(abgesen davon, wenn man garkeinen Fortschritt anzeigt)


Wenn man nun noch lengere Verarbeitungen bei jeder Datei macht, also wärend der suche und im selben Thread, dann wäre das vorherige Zählen und eine prozentartige Fortschrittsanzeige sinnvoll.

PS: Wenn man eine gesamte Partition durchsucht (oder eine andere Speichereinheit, wo man die Größe der gesamt enthaltenen Dateien direkt kennt), dann kann man eine Fortschrittsanzeige über die Dateigrößen vornehmen. (Max = alle Dateien zusammen und aktuelle Position = Größe der bereits verarbeiteten Dateien + Offset für die Cluster/Sektoren)

shmia 14. Apr 2011 10:21

AW: progressbar/dateien
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hänge hier einfach nochmal mein FileScanner-Demo rein.
Dieses Demo zeigt, wie man ohne Thread dafür aber mit einem Event Verzeichnisse durchsuchen kann.
Es ist objekt-orientiert, wiederverwendbar und dennoch schnell.
Die Suche lässt sich jederzeit unterbrechen (die meisten Codeschnipsel mit FindFirst, FindNext können das nicht).
Die FileScanner-Klasse liefert die Informationen zu Verzeichnissen und Dateien Delphi-like aufbereitet (quasi auf dem Silbertablett), dass der Benutzer der Klasse kaum noch was zu tun braucht.

Heinziheinz 14. Apr 2011 10:26

AW: progressbar/dateien
 
du bist hammer =) genau das was ich gesucht habe vielen lieben dank jez noch ein wenig umändern 2/3 sahcen einfügen und feddig ist...dankeeeee

DeddyH 14. Apr 2011 10:34

AW: progressbar/dateien
 
Tust Du Dir und uns einen Gefallen und liest Dir das hier einmal durch (speziell Punkt 5)?

Heinziheinz 14. Apr 2011 14:48

AW: progressbar/dateien
 
xD hab ich :P

Heinziheinz 14. Apr 2011 17:10

AW: progressbar/dateien
 
Leute noch ne Frage:

das ist mein code:

procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Items.Remove(ListBox1.SelectedItem);
DeleteFile(label1.Caption);
end;

Dieser soll zuerst die Datei löschen und dann aus der listbox den Link der Datei löschen

und dann: Error idetifier idents no member "Remove"

was mache ich falsch?

(uses
messages,windows,ShellAPI, Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
Menus, StdCtrls, ComCtrls, ExtCtrls, Grids, DbCtrls;)

ich brauche alle uses...fehlt eine vielleicht?

Aphton 14. Apr 2011 17:15

AW: progressbar/dateien
 
Ich schätze mal, du sprichst kein Englisch.

Remove() existiert nicht! Verwende Delete()

Heinziheinz 14. Apr 2011 17:23

AW: progressbar/dateien
 
er ist n schritt weiter doch jetzt sagt er: no member "SelectedItem"

himitsu 14. Apr 2011 17:36

AW: progressbar/dateien
 
Zitat:

SelectedItem...
Weil es das nicht gibt?

Schau doch mal selber in der OH nach, welche Methoden die Delphi-Referenz durchsuchenTListBox hat.
(wobei die Codevervollständigung auch hilfreich sein kann)

Es gibt Selected, aber da wirst du über eine Schleife selber nachsehn müssen welcher Eintrag/welche Einträge selektiert ist/sind.

Heinziheinz 14. Apr 2011 17:45

AW: progressbar/dateien
 
ah okej danke ich les mal
noch ne kleine Frage:
nachdem meine listbox voll ist, kan ich die Zeilen zälen wie viele diese dann hat?

DeddyH 14. Apr 2011 18:16

AW: progressbar/dateien
 
Die Zeilen stehen in ListBox.Items. Schau doch mal nach, was es da für Eigenschaften gibt.

Aphton 14. Apr 2011 18:20

AW: progressbar/dateien
 
...Count

DeddyH 14. Apr 2011 18:23

AW: progressbar/dateien
 
Wer muss schon in die Hilfe schauen, wenn einem im Forum selbst die einfachsten Dinge vorgekaut werden? :roll:

Heinziheinz 14. Apr 2011 18:25

AW: progressbar/dateien
 
hab keine zeilenzähleigenschaft gefunden... =(

himitsu 14. Apr 2011 19:06

AW: progressbar/dateien
 
Zitat:

Zitat von Heinziheinz (Beitrag 1095163)
hab keine zeilenzähleigenschaft gefunden... =(

Ich bin mir ganz sicher, daß es sowas gibt.
In der OH werden alle Eigenschaften und Methoden/Funktionen aufgezählt und bei jedem kann man reinsehn und dann steht da was dieses macht.


http://translate.google.de/#de|en|z%C3%A4hlen , abgesehn, daß es 5 Minuten vorher schonmal genannt wurde.

Heinziheinz 14. Apr 2011 19:29

AW: progressbar/dateien
 
mile grazie =)

label1.caption := inttostr(listbox1.items.count);

Heinziheinz 14. Apr 2011 22:45

AW: progressbar/dateien
 
sou xD mal wieder ich =) ich schreibe einfach ma weiter
hab nämlich noch eine Frage:
ich habe eine ganz normale openoffice text Datei (odt)
ich möchte an diese eine delphi exe dranhängen, sodass beim öffnen dieser odt Datei, auch die exe ausgeführt wird.
Nein ich möchte keinen Trojaner basteln =) ist nur für mich. Reines interesse.

Luckie 14. Apr 2011 22:48

AW: progressbar/dateien
 
Für eine neue Frage, mache bitte einen neuen Thread auf.

Davon mal abgesehen, ist eine odt Datei nicht ausführbar. Man kann sie nur mit einem entsprechenden Programm öffnen und anzeigen lassen.

mkinzler 15. Apr 2011 06:43

AW: progressbar/dateien
 
Zitat:

Davon mal abgesehen, ist eine odt Datei nicht ausführbar. Man kann sie nur mit einem entsprechenden Programm öffnen und anzeigen lassen
Zum Glück!

Daniel 15. Apr 2011 07:20

AW: progressbar/dateien
 
@Heinziheinz:
Das hat so keinen Wert - wir können Dir jetzt nicht Zeile für Zeile, Eigenschaft für Eigenschaft Deinen Code schreiben.

Lerne die Grundlagen - und dazu gehört auch, wie man sich souverän im Code und in der Hilfe bewegt. Am Anfang gehört es dazu, zu erforschen und zu erkunden und das geht leider nur mit Fleiß und unter Umständen -wenn es ganz arg blöd kommt- wird man sogar etwas Dokumentation lesen müssen.

Bevor Du das nicht getan hast, ist es wertlos hier Code zu generieren. Eine gute Sammlung an Tutorials findest Du zum beispiel unter http://www.delphi-treff.de/tutorials/grundlagen/.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.

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