Announcement

Collapse
No announcement yet.

Probleme mir FindFirst / FindNext

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mir FindFirst / FindNext

    Hallo,

    folgendes Problem: ich will aus einem Ordner alle *.pas Files durchlaufen
    und Teilstrings herauskopieren.
    --------------CODE ANFANG-----------------------------------
    begin
    str_path:='\\Ntserver\Delphi-Klassen\Windows\';
    Findfirst(str_path+'*.pas',faAnyFile,SearchRec);
    meo_such.Lines.Clear;
    str_nummer:=1;
    while (FindNext(SearchRec)=0) do
    begin
    meo_such.Lines.Add(SearchRec.Name);
    FindNext(SearchRec);
    INC(str_nummer);
    end;
    showmessage(inttostr(str_nummer));
    FindClose(SearchRec);
    end;
    --------------CODE ENDE-----------------------------------
    das Problem ist, daß nicht alle Files gefunden werden, von 19 Stück
    werden mit nur 10 angegeben und ich finde den Fehler einfach nicht.
    Ich bin für jede Hilfe dankbar!

    Mit besten Grüßen,
    Stefan Walter

  • #2
    Hallo Stefan,<br>könntest Du Deine Frage etwas leserlicher gestalten?<br> :-) Jens Schuman

    Comment


    • #3
      Hallo Stefan,

      ich würde mal das FindNext in der While-Schleife rausnehmen. Da Du in der Bedingung für die While-Schleife das Findnext drin hast wird es bei jedem Schleifendurchlauf <b>zweimal</b> ausgeführt und in Deiner Auflistung erscheint nur jede zweite gefundene Datei.

      Gruß Fal
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hi

        Falk hat Recht, ich würde sogar auf eine Kopfschleife (while) zu einer Fussschleife (repeat) wechseln:

        <pre>

        procedure Scan;
        var
        SR: TSearchRec;
        begin
        if FindFirst(Path + '*.pas', faAnyFile, SR) = 0 then
        begin
        repeat
        .. Hier Deine Auswertungen
        until FindNext(SR) <> 0;
        FindClose(SR); // niemals vergessen, sonst MemoryLeaks
        end;
        end;

        </pre>

        Gruß Hage

        Comment


        • #5
          Vielen Dank für eure hilfe, jetzt funkts.<br>
          Dazu folgenden Artikel:<br>
          http://buglist.jrsoftware.org/generated/entry0218.htm
          Allerdings hab ich gleich ein neues Problem:<br>
          Ich will auch unterordner auf die files durchsuchen, aber wie bekomme
          ich mit FindFirst / FindNext die Ordnernamen? Mit der Option<br>
          faDirectory klappt es nicht.

          vielen Dank,
          Stefa

          Comment


          • #6
            Hi

            <pre>

            procedure Scan(const Path: String);
            var
            SR: TSearchRec;
            begin
            if FindFirst(Path + '*.pas', faAnyFile, SR) = 0 then
            begin
            repeat
            .. Hier Deine Auswertungen
            until FindNext(SR) <> 0;
            FindClose(SR); // niemals vergessen, sonst MemoryLeaks
            end;
            if FindFirst(Path + '*.*', faDirectory or faHidden, SR) = 0 then
            begin
            repeat
            if (SR.Name <> '.') and (SR.Name <> '..') and
            (SR.Attr and faDirectory <> 0) then
            Scan(Path + SR.Name + '\');
            until FindNext(SR) <> 0;
            FindClose(SR);
            end;
            end;

            </pre>

            Gruß Hage

            Comment


            • #7
              Vielen Dank!!
              Stefa

              Comment


              • #8
                Finde ich auch

                Comment


                • #9
                  Hallo Hagen, oder wer sonst noch einen Rat weiß,
                  <PRE>
                  &gt; begin
                  &gt; repeat
                  &gt; .. Hier Deine Auswertungen
                  &gt; until FindNext(SR) <> 0;
                  &gt; FindClose(SR); // niemals vergessen, sonst MemoryLeaks
                  &gt; end;
                  </PRE>
                  An dieser Stelle ".. Hier Deine Auswertungen" würde ich gerne<br>
                  etwas flexibel sein ;-)<br>
                  Ok also den Aufruf vielleicht mit einem PROCEDURE-Parameter erweitern<br>
                  der dann mit entsprechenden Werten weiterhilft.<br>
                  <br>
                  Allso so vieleicht:
                  <PRE>
                  TYPE
                  TFileInfoProc = PROCEDURE (sPath:String; aFileInfo:TSearchRec);
                  <br>
                  PROCEDURE MyFileInfoProc(sPath:String; aFileInfo:TSearchRec);
                  BEGIN
                  // zum Beispiel anzeigen oder schreiben in Datei oder, oder, oder
                  ShowMessage(sPath+#10+aFileInfo);
                  END;
                  <br>
                  procedure Scan(const Path:String; FileInfoProc:TFileInfoProc);
                  begin
                  ...
                  begin
                  repeat
                  >> .. Hier Deine Auswertungen
                  <I>// etwas mit einer Datei tun</I>
                  <B>FileInfoProc(sSourcePath, SearchRec);</B>
                  until FindNext(SR) <> 0;
                  FindClose(SR); // niemals vergessen, sonst MemoryLeaks
                  end;
                  ...
                  end;

                  procedure TForm1.Btn1Click(...);
                  begin
                  Scan('c:\TestFolder\', MyFileInfoProc);
                  end;
                  </PRE>
                  Soweit kein Problem<BR>
                  aber wie mache ich das ganze bei einer Komponente?<BR>
                  Da bekomme ich die Meldung:<BR>
                  Inkopatible Typen: Reguläre Procedure und Methodenzeiger<BR>
                  Denn mein Aufruf soll natürlich auf eine Procedure der Komponente <BR>
                  zeigen die alle Eigenschaften der Komponente kennt!<BR>
                  <BR>
                  Gruß Stefa

                  Comment


                  • #10
                    Hallo Stefan,<br>schau doch mal dort nach: http://www.entwickler-forum.de\webx?14@@.ee87e08/0 Vielleicht hilft Dir das ja weiter.<bR>Jens Schuman

                    Comment


                    • #11
                      Hallo Jens,<br>
                      <br>
                      ich hab's mir mal angesehen,<br>
                      doch leider trifft es nicht so ganz mein Problem.<br>
                      <br>
                      Wenn ich innerhab einer Komponente eine Private Funktion bzw. <br>
                      Procedure deklariere und diese eine anderen Funktion mitgeben möchte, <br>
                      dann kann ich nicht deren Adresse mit @ ermitteln da dafür eine <br>
                      Variable nötig ist. <br>
                      <br>
                      Nun könnte ich ja auch die Funktion die ich da mitgebe als lokale von <br>
                      der Komponente ungebundene Funktion aufbauen, aber zum einen passt <br>
                      mir das aus OPP-Sicht nicht und zum anderen soll die Funktion auch <br>
                      über private Dinge der Komponente Kenntnis haben so dass sie darauf <br>
                      lesend und/oder schreibend zugreifen kann <br>
                      <br>
                      Aber dennoch danke für den Vorschlag ;-)
                      <br>
                      Gruss Stefa

                      Comment


                      • #12
                        <pre>

                        TYPE
                        TFileInfoEvent = <b>procedure</b>(const APath: String; const AFileInfo: TSearchRec); <b>of Object</b>;

                        </pre>

                        Nun muss TFileInfoEvent einem Object als Methode zugeordnet sein, also so z.B.

                        <pre>

                        type
                        TMyObject = class
                        procedure MyCallback(const APath: String; const AFileInfo: TSearchRec);
                        end;

                        </pre>

                        Ich empfehle Dir die beiden Parameter als <b>const</b> zu übergeben. Das mach die Sache schneller und verhindert unnötige Änderungen.

                        Gruß Hage

                        Comment


                        • #13
                          Hallo Hagen,<br>
                          <br>
                          ...) <B>of Object;</B>
                          Na Klar, mache ich bei normalen Methodenzeigen ja auch!<br>
                          <br>
                          Danke

                          Comment

                          Working...
                          X