In ein TTreeView alle Verzeichnisse eintragen



  • Hallo zusammen,

    ich möchte gerne eine Art Windows-Commander programmieren in dem ich in einem TTreeView alle aktuellen Laufwerke und die Unterverzeichnisse aufgelistet bekomme.
    In einem TListView möchte ich dann nur Dateien anzeigen mit einer Bestimmten Extension.

    Mein Problem ist, das ich nicht so recht weis wie ich alle Laufwerke und SubDirs in das TTreeView bekomme. Mit FindFirst und FindNext??? Außerdem hab ich's nicht so mit Rekursiven Aufrufen.

    Vielleicht hat ja jemand schon einen Quellcode der genau das macht was ich will!?

    Vielen Dank!

    Gruß Nontschew



  • Siehe FAQ unter "Dateien+Verzeichnisse".



  • Hallo,

    zu diesem Thema sind leider keine Einträge vorhanden...

    Mirko



  • Na ja, irgendwie sind die Beiträge wohl verloren gegangen. Aber such mal hier im Forum in den Postings der letzten 3 Tage. Da war so etwas auch dabei.



  • Danke für den Hinweis, das Problem mit den verschwundenen FAQ-Einträgen wird untersucht.



  • OK, vielen Dank für den Hinweis. Ich hoffe Ihr bekommt das mit den Einträgen in den FAQ wieder hin! Ist sicher nicht schlecht. Übrigens sorry das ich da nicht gleich nach geschaut habe!

    Viele Grüße



  • Sorry aber die Einträge in der FAQ sind immer noch nicht da. 😕 Vielleicht kann mir ja jemand weiterhelfen der das Problem schon ausprogrammiert hat!? Vielleicht kann mir ja derjenige den Quelltext posten...? Wäre echt super!

    Vielen Dank und schöne Grüße
    Mirko



  • Klar geht das! 😉

    In Form1 brauchst Du
    1.) Button1 (TButton)
    2. LB1 (TListbox)
    3. LB2 (TListbox)

    Boolean __fastcall LikeString(AnsiString Text, AnsiString Mask,Boolean IC)
    {
      int i,j;
      int Min,Max;
      AnsiString CmpStr;
      if (IC)
      {
        Text=Text.UpperCase();
        Mask=Mask.UpperCase();
      }
      i=1;
      Min=0;
      if (Mask.Length()==0)
        return(false);
      Max=0;
      while (i<=Mask.Length())
      { if (Mask[i]=='?')
        { Min++;
          Max++;
        }
        else
        { if (Mask[i]=='*')
          { Max=255;
          }
          else
            break;
        }
        i++;
      }
      j=i;
      while ((j<=Mask.Length())&&(Mask[j]!='*')&&(Mask[j]!='?'))
      { j++;
      }
      CmpStr=Mask.SubString(i,j-i);
      if (CmpStr.Length()>0)
      { if ((Text.AnsiPos(CmpStr)<=Min)||
            (Text.AnsiPos(CmpStr)>Max+1))
          return(false);
        else
        { if (((Text.AnsiPos(CmpStr)+CmpStr.Length()-1)<Text.Length())||
              ((Mask.AnsiPos(CmpStr)+CmpStr.Length()-1)<Mask.Length()))
            return(LikeString(Text.SubString(Text.AnsiPos(CmpStr)+1,255),Mask.SubString(Mask.AnsiPos(CmpStr)+1,255),IC));
          else
            return(true);
        }
      }
      else
      { if ((Text.Length()>=Min)&&(Text.Length()<=Max))
          return(true);
        else
          return(false);
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FS(AnsiString P, AnsiString FileMask, AnsiString Extension)
    {
      Boolean Rekursion=true;
      AnsiString Verz;
      char drive[MAXDRIVE];
      char dir[MAXDIR];
      char file[MAXFILE];
      char ext[MAXEXT];
      AnsiString LnkFName;
      TSearchRec f;
      TStringList *SubDirs= new TStringList;
      int FFRes;
      int i,j;
    //  Priority=tpHigher;
      Verz=P;
      LB2->Items->Add(Verz);
      if (Verz.SubString(Verz.Length()-1,2).AnsiCompare(":\\")==0)
        Verz.operator +=( "*.*");
      else
        Verz.operator +=( "\\*.*");
      SubDirs->Clear();
      if (Rekursion)
        FFRes=FindFirst(Verz,0x30+7,f);   /* Dateien und Verzeichnisse suchen */
      else
        FFRes=FindFirst(Verz,0x20,f);   /* nur Dateien suchen               */
      Verz=P;
      if (FFRes==0)
      {
        while(FFRes==0)                   /* bis letzter Eintrag              */
        {
          if ((f.Attr&0x10)!=0x10)        /* kein Verzeichnis, Datei          */
          {
            if (true) //FSearchMode==smFile)
            {
              fnsplit(f.Name.c_str(),drive,dir,file,ext);
              if (LikeString(file,FileMask,true))
              {
                if (StrIComp(ext,Extension.c_str())==0)
                {
                   LB1->Items->Add(f.Name);
                }
              }
            }
          }
          else
          {
            if (f.Name.AnsiPos(".")!=1)
            {
              if (Rekursion)
                SubDirs->Add(f.Name);
            }
          }
          FFRes=FindNext(f);          /* naechstes Verzeichnis suchen */
        }
        FindClose(f);
      }
      for (i=0;i<SubDirs->Count;i++)
      {
        Verz=P;
        if (Verz.SubString(Verz.Length()-1,2).AnsiCompare(":\\")!=0)
          Verz.operator +=( "\\");
        Verz.operator +=(SubDirs->Strings[i]);
        FS(Verz,FileMask,Extension);
      }
      delete SubDirs;
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      AnsiString LW="C:\\";
      LB1->Clear();
      LB2->Clear();
      for (LW[1]='C';LW[1]<='Z';LW[1]++)
        FS(LW,"A*",".bmp");
    }
    //---------------------------------------------------------------------------
    


  • Nontschew,

    hier noch eine API Version.



  • Hi,

    also IMHO ist hier das selbständige Suchen und Eintragen der Verzeichnisse (Rekursion usw.) nicht nötig. Man verbessere mich wenn ich Mist rede 😉
    Es geht auch mit der IDE - Karteikarte Win 3.1:

    a) DriveComboBox1
    b) DirectoryListBox1
    c) FileListBox1
    d) FilterComboBox1

    im Objektinspektor:

    1. DriveComboBox1 Eigenschaft DirList auf DirectoryListbox1 setzen
    2. DirectoryListBox1 Eigenschaft FileList auf FileListBox1 setzen
    3. FilterComboBox1 Eigenschaft FileList auf FileListBox1 setzen und unter Filter die gewünschten eintragen.

    Voilà, das reicht eigentlich schon.

    Eventuell noch einen Button dazu um einen Pfad über einen OpenDialog auswählen zu können. Also Button und OpenDialog hinzufügen und

    void __fastcall TForm1::BitBtnTPathClick(TObject *Sender)
    {
      if(OpenDialog1->Execute()) DirectoryListBox2->Directory=ExtractFilePath(OpenDialog1->FileName);
    }
    //---------------------------------------------------------------------------
    

    Ggf Beim OpenDialog noch Title eintragen und Filter auf Verzeichnisse|*.

    Hoffe ich hab jetzt nix vergessen... is echt ein Kinderspiel. In der Borland-Hilfe ist auch irgendwo ein super Beispiele genau dazu gewesen.

    mfG

    robi1806



  • robi1806,

    robi1806 schrieb:

    Es geht auch mit der IDE - Karteikarte Win 3.1: ...

    ja, das hängt davon ab, was genau benötigt wird. Die DirectoryListBox hat den Nachteil, daß sie immer nur den Teilbaum anzeigt, in welchem man sich gerade befindet.


Anmelden zum Antworten