AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi routine aendern(speichern in listbox>speichern in hashtable)
Thema durchsuchen
Ansicht
Themen-Optionen

routine aendern(speichern in listbox>speichern in hashtable)

Ein Thema von nimmersattXD · begonnen am 10. Jun 2009 · letzter Beitrag vom 16. Jun 2009
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von nimmersattXD
nimmersattXD

Registriert seit: 1. Jun 2009
Ort: Sangerhausen
65 Beiträge
 
Delphi 7 Personal
 
#1

routine aendern(speichern in listbox>speichern in hashtab

  Alt 10. Jun 2009, 15:29
Hallo zusammen!

ich habe mal wieder ein problem

ich habe im EasyDelphiHelper eine schoene routine gefunden, die rekursiv nach dateien in ordnern sucht:

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 - faDirectory, SR) = 0 then try
    repeat
      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;
die ergebnisse speicher ich in listboxes:

Delphi-Quellcode:

procedure TForm1.BtnSearchPicClick(Sender: TObject);
var direct:string;
begin
direct:=EdpathP.Text;

GetFilesInDirectory2(direct,'*.jpg',LiBoPathOfPics.Items,true,true);
GetFilesInDirectory2(direct,'*.png',LiBoPathOfPics.Items,true,false);
GetFilesInDirectory2(direct,'*.pdf',LiBoPathOfPics.Items,true,false);
GetFilesInDirectory2(direct,'*.bmp',LiBoPathOfPics.Items,true,false);
GetFilesInDirectory2(direct,'*.gif*',LiBoPathOfPics.Items,true,false);

GetFilesInDirectory1(direct,'*.jpg',LiBoPic.Items,true,true);
GetFilesInDirectory1(direct,'*.png',LiBoPic.Items,true,false);
GetFilesInDirectory1(direct,'*.pdf',LiBoPic.Items,true,false);
GetFilesInDirectory1(direct,'*.bmp',LiBoPic.Items,true,false);
GetFilesInDirectory1(direct,'*.gif*',LiBoPic.Items,true,false);

LbPic.Caption:=(IntToStr(LiBoPic.Count));

end;
ihr seht ich suche nach bildern!

so nun hab ich aber von meinem chef erfahren das mein programm mit hashtabellen viel schneller sein wuerde. nach ein bisschen suchen habe ich auch eine schoene unit csDictionary.pas von alzaimar gefunden.

Ich hab zuerst versucht mit einer zaehlschleife einfach alle items der listbox in die hashtabelle zu laden, aber es sind inkompatible typs pointer und string. Ich weiss das es am schnellsten waer wenn ich es anstatt in die listbox lade gleich in eine hashtabelle, leider weiss ich nicht so recht wie ich die routine umstellen soll!

kann mir da vielleicht jemand helfen?
Sorry an alle fuer die es schwerfaellt meine texte zu lesen! ich bin im moment in england und hab nur eine englische tastatur, also leider keine umlaute usw.!

http://nimmersatt-xd.mybrute.com
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 15:46
Verwende den Dateinamen als Key und 'nil' für 'Data'. Die Unit stellt ein Wörterbuch dar, bzw. einen Container, der zu einem String (Key) Informationen (Data) liefert.

Wesentlich schneller geht das dann aber auch nicht, denn eine StringList ist schon recht flott. Du musst bei den ListBox.items nur daran denken, 'BeginUpdate' VOR und 'EndUpdate' NACH dem Aufruf aufzurufen, denn sonst wird die Listbox bei jeder Einfügeoperation nue gezeichnet.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von nimmersattXD
nimmersattXD

Registriert seit: 1. Jun 2009
Ort: Sangerhausen
65 Beiträge
 
Delphi 7 Personal
 
#3

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 15:53
mmh ich wollte eigentlich das ganze ohne listboxes machen und mit der GetFilesInDirectory() routine gleich in einer hashtabelle speichern! Da die routine aber mit TStrings arbeitet und das woerterbuch mit strings oder integers, muss ich sie aendern, oder?
Sorry an alle fuer die es schwerfaellt meine texte zu lesen! ich bin im moment in england und hab nur eine englische tastatur, also leider keine umlaute usw.!

http://nimmersatt-xd.mybrute.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 15:54
ich würde es garnicht erst in eine ListBox eintragen, sondern eine TStringList verwenden und diese dann für die HashList auslesen und an die ListBox übergeben.

oder gleich List: TStrings; durch die Hashlist ersetzen.


PS: was sollst du denn, laut Chäffe, damit beschleunigen können?
soeine Liste macht ja wirklich nur viel sinn, wenn du in der Liste etwas suchen willst,

also wenn die Liste entweder sehr groß ist oder du sehr schnell viel finden willst/mußt.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von nimmersattXD
nimmersattXD

Registriert seit: 1. Jun 2009
Ort: Sangerhausen
65 Beiträge
 
Delphi 7 Personal
 
#5

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 15:59
um das mal zu erklaeren: ich soll ein programm machen, das zum einen die bilder in einem ordner sucht und dann die urls von allen bildern die in htmls, htmlms und jsps auftreten. beides wird dann von dem programm verglichen, um so rauszufinden welche bilder noch benutzt werden und welche nicht.

ich hab das alles mit listboxes realisiert, also mit den namen der bilder die in den ordnern gefunden wurde und eine mit den namen die in den htmls gefunden wurden, die items hab ich dann einfach verglichen ... das geht schon ganz schnell wie ich finde, aber mein chef meinte hashtables sind wesentlich schneller im finden und so ...
Sorry an alle fuer die es schwerfaellt meine texte zu lesen! ich bin im moment in england und hab nur eine englische tastatur, also leider keine umlaute usw.!

http://nimmersatt-xd.mybrute.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 16:10
wenn du die VCL wegläßt und direkt TStringList verwendest, bekommst du auch noch schon "etwas" Zeit raus.


um wieviele Bilder handelt es sich denn, so im Durchschnitt
und wie schnell läuft es inzwischen?


ansonsten kommst du schneller, wenn du die Hashlist direkt in die Suchmethode reinbaust

bzw. darin gleich sofort das gesuchte vergleichst und und dann direkt di Liste mit den ungenutzten Bildern erstellst.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von nimmersattXD
nimmersattXD

Registriert seit: 1. Jun 2009
Ort: Sangerhausen
65 Beiträge
 
Delphi 7 Personal
 
#7

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 16:15
also es handelt sich um etwa 7600 bilder, aber da kommen viele doppelt vor ... noch ein grund warum ich hashlists benutzten wollte, um bevor ich ein bild hinzufuege erstmal suche ob es das nich schon in der liste gibt.

und die suchroutine mit hashlists umzubauen war ja genau meine idee, leider weiss ich nicht genau wie ich das anstellen soll ... deswegen das thema!
Sorry an alle fuer die es schwerfaellt meine texte zu lesen! ich bin im moment in england und hab nur eine englische tastatur, also leider keine umlaute usw.!

http://nimmersatt-xd.mybrute.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 16:48
Delphi-Quellcode:
procedure GetFilesInDirectory(const Directory, Mask: String;
    List: TStringDictionary; WithSubDirs, ClearList: Boolean);

  procedure ScanDir(const Directory: String);
    var
      SR: TSearchRec;

    begin
      if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then
        try
          repeat
            //if not List.Contains(Directory + SR.Name) then
              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
    if ClearList then
      List.Clear;
    if Directory = 'then Exit;
    ScanDir(IncludeTrailingPathDelimiter(Directory));
  end;
Das ganze könnte man dann noch so optimieren, das gleich mehere Masken übergeben werden könnte,
man nur noch eine Suchschleife in der Funktion hat und selber filtert.
Zusätzlich muß die Suchfunktion dann auch nur noch einmal aufgerufen werden.

[edit]
Prüfung auf doppelte Einträge wieder rausgemacht (auskommentiert), denn Doppeltes kann hier ja nicht vorkommen


[add]
http://www.delphipraxis.net/internal...034817#1034817
Delphi-Quellcode:
procedure GetFilesInDirectory(const Directory, Mask: String;
    List: TStringDictionary; WithSubDirs, ClearList: Boolean);

  procedure ScanDir(const Directory: String);
    var
      SR: TSearchRec;

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

  begin
    if ClearList then
      List.Clear;
    if Directory <> 'then
      ScanDir(IncludeTrailingPathDelimiter(Directory));
  end;



GetFilesInDirectory(direct, '*.jpg|*.png|*.pdf|*.bmp|*.gif*', Hashlist, True, True);
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von nimmersattXD
nimmersattXD

Registriert seit: 1. Jun 2009
Ort: Sangerhausen
65 Beiträge
 
Delphi 7 Personal
 
#9

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 17:17
mmh war ja ganz leicht

leider bekomm ich jetzt ne fehlermeldung wenn ich auf den button klicke:

Access violation at address ... in module '... .exe'. write to address .... .
Sorry an alle fuer die es schwerfaellt meine texte zu lesen! ich bin im moment in england und hab nur eine englische tastatur, also leider keine umlaute usw.!

http://nimmersatt-xd.mybrute.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: routine aendern(speichern in listbox>speichern in has

  Alt 10. Jun 2009, 17:29
also, ich hab den Code jetzt nicht getestet ... hab's nur so hingetippt und bin einfach davon ausgegangen, daß er so läuft


Hast du mal gedebugt und geschaut wo es knallt?

und du hast auch die Liste erstellt?
List := TStringDictionary.Create;
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 02:46 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