Wyswietlanie zawartosci folderu w TListBox

dział ogólny

Wyswietlanie zawartosci folderu w TListBox

Nowy postprzez Bishamoth » Å›roda, 14 października 2009, 19:55

Witam
Mam pewien problem. Chcialbym wylistowac zawartosc danego folderu/dysku do komponentu TListBox. Ale z takim skutkiem jak robi to ten kod:
Kod: Zaznacz cały
IdFTP1->List(ListBox1->Items, "", false);

Wrzuca on do TListBox cala zawartosc danego folderu na serwerze FTP
Nastepnie w zdarzeniu OnDblClick komponentu TListBox wstawic to:
Kod: Zaznacz cały
AnsiString Dir;
Dir = ListBox1->Items->Strings[ListBox1->ItemIndex];
IdFTP1->ChangeDir(Dir);
IdFTP1->List(ListBox1->Items, "", false);

Tyle by zmienialo oczywiscie foldery/dyski na moim PC. A moze istnieje komponent, ktory to robi w ten sam sposob?
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wyswietlanie zawartosci folderu w TListBox

Nowy postprzez Cyfrowy Baron » Å›roda, 14 października 2009, 21:47

Ale ja już nie rozumiem!
1. Chcesz wyliczać dyski na koncie FTP i tam zmieniać im nazwy,
2. czy też chcesz wyliczać dyski na dysku lokalnym i tam zmieniać nazwy.



Jeżeli 1 to sam już sobie udzieliłeś odpowiedzi, więc czego jeszcze chcesz?!



Jeżeli 2 to do wyliczania musisz posÅ‚użyć siÄ™ funkcjÄ… wyszukiwania folderów - ► patrz serwis: Cyfrowy Baron dziaÅ‚: porady -> różne -> Wyszukiwanie folderów, podfolderów i plików.

Co do zmiany nazwy folderów to służy do tego ta sama funkcja co do zmiany nazwy plików:

Kod: Zaznacz cały
RenameFile("c:\\tymczasowy", "c:\\temp");   
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wyswietlanie zawartosci folderu w TListBox

Nowy postprzez Bishamoth » Å›roda, 14 października 2009, 22:37

Przepraszam, troche zamotanie to napisalem. Oczywiscie chodzi mi o wyliczanie folderow na dysku lokalnym.
Juz patrze, na ta porade.
Dziekuje.

//EDIT

Okej, wszystko ladnie pieknie. Tylko jak uzyc pierwszego sposobu (wyswietlanie bez podfolderow), aby po dwokrotnym kliknieciu na dowolny Item w TListBox, przejsc do tego folderu?
Wlasnie wczesniej napisalem (w pierwszym poscie), aby ta funkcja dzialala, podobnie do tej z IdFTP1 (a dokladnie o to: ChangeDir). Chcialbym tego ChangeDir uzyc w Twoim sposobie wyszukiwania folderow.
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wyswietlanie zawartosci folderu w TListBox

Nowy postprzez Cyfrowy Baron » czwartek, 15 października 2009, 11:51

To nie jest takie proste, trzeba cały czas wyliczać foldery, przy każdym kliknięciu. Nie poradzisz sobie z tym, wiec podam prostszy sposób.

Na zakładce komponentów Win 3.1 masz komponenty:

TDriveComboBox - wylicza wszystkie dyski lokalne.
TDirectoryListBox - wylicza wszystkie foldery na dysku lokalnym
TFileListbox - wylicza wszystkie piki w wybranym folderze.

Umieszczasz na formularzu komponent DiveComboBox1, następnie umieszczasz komponent DirectoryListBox1, potem umieszczasz FileListBox1.

We właściwości DirList obiektu DriveComboBox1 wybierasz DirectoryListBox1, w ten sposób DriveComboBox1 będzie sterował zawartością obiektu DirectoryListBox1, a konkretnie DriveComboBox1 będzie decydował na którym dysku DirectoryListBox1 będzie wyliczał foldery.

We właściwości FileList obiektu DirectoryListBox1 wybierasz FileListBox1, w ten sposób DirectoryListBox1 będzie sterował zawartością obiektu FileListBox1, czyli FileListBox1 będzie wyświetlał zawartość folderu wybranego w DirecotryListBox1.


Masz jeszcze inne obiekty, np. TFilterComboBox, który umożliwia filtrowanie zawartości obiektu TFileListBox.

W celu uruchomienia jakiegoś pliku wybranego w FileListBox1 w domyślnym programie wystarczy utworzyć zdarzenie OnDblClick dla tego obiektu i dodać taki kod:

Kod: Zaznacz cały
void __fastcall TForm1::FileListBox1DblClick(TObject *Sender)
{
ShellExecute(Form1->Handle, NULL , FileListBox1->FileName.c_str(),
  "", "", SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------


W celu otwarcia w Eksploratorze systemu Windows folderu wybranego w DirectoryListBox1 wystarczy utworzyć zdarzenie OnDblClick dla tego obiektu:

Kod: Zaznacz cały
void __fastcall TForm1::DirectoryListBox1DblClick(TObject *Sender)
{
  ShellExecute(Form1->Handle, NULL, DirectoryListBox1->Directory.c_str(),
  "", "", SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wyswietlanie zawartosci folderu w TListBox

Nowy postprzez Bishamoth » czwartek, 15 października 2009, 16:59

No to zle, bardzo zle :(
W takim razie nie zrobie projektu, gdyz mam nalozone wymagania, by zrobic to w komponencie TListBox.
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wyswietlanie zawartosci folderu w TListBox

Nowy postprzez Cyfrowy Baron » czwartek, 15 października 2009, 17:59

Możesz to zrobić w TListBox.

Najpierw uruchamiasz funkcję wyszukiwania folderów dla całego dysku. Gdy klikniesz w ListBox nazwę jakiegoś folderu to przekazujesz funkcji wyszukującej jaki katalog ma przeszukiwać pod kontem folderów i wynik znów wyświetlasz w tym ListBox. Prosta sprawa za każdym wybraniem folderu w ListBox musisz uruchomić funkcje wyszukiwania, gdyż nie ma żadnego magicznego sposobu na wyliczenie folderów.

Przecież to naprawdę proste:
Kod: Zaznacz cały
String Drive = "c:\\";
void __fastcall FindDir(TListBox *lista, String Dir)
{
  lista->Items->Clear();
  int x = Dir.Pos(":");
  String tmp = Dir.SubString(x + 1, Dir.Length());

  if(tmp.Length() > 2) lista->Items->Add("[...]");
 
  TSearchRec sr;

  if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
     {
      do{
         if(((sr.Attr & faDirectory) > 0) & (sr.Name != ".") & (sr.Name != ".."))
            lista->Items->Add(sr.Name);
        }
        while(FindNext(sr) == 0);
        FindClose(sr);
     }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
FindDir(ListBox1, Drive);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
{
int x = ListBox1->ItemIndex;
String dirList = ListBox1->Items->Strings[x];
String directory;

if(dirList != "[...]") directory = Drive + dirList + "\\";
else
{
  String tmp = Drive.SubString(1, Drive.Length() - 2);
  int y = tmp.LastDelimiter("\\");
  directory = Drive.SubString(1, y - 1) + "\\";
}
FindDir(ListBox1, directory);
Drive = directory;
Caption = directory;
}
//---------------------------------------------------------------------------


Przykład działa tylko dla dysku C: gdyż jak widzisz zdefiniowałem ten dysk w zmiennej i nie ma w kodzie możliwości jego zmiany, ale to już chyba będziesz potrafił sobie dopasować.

Po uruchomieniu program ładuje do ListBox listę katalogów na dysku C:, po dwukrotnym kliknięciu na jakąś nazwę katalogu, program ładuje listę podkatalogów w tym katalogu i tak dalej, ale na samej górze umieszcza coś takiego [...]. Kliknięcie na tym elemencie listy powoduje cofniecie się do wcześniejszego katalogu. Element ten nie jest dodawany tylko w sytuacji gdy lista zawiera spis katalogu znajdujących się bezpośrednio na dysku C:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wyswietlanie zawartosci folderu w TListBox

Nowy postprzez Cyfrowy Baron » niedziela, 18 października 2009, 08:47

Katalogi mogą mieć nazwę [...] i chociaż wydaje się to mało prawdopodobne, to przy próbie otwarcia takiego katalogu, przedstawiony kod zareaguje nieprawidłowo próbując cofnąć się o jeden katalog wstecz, a jeżeli taki katalog będzie jednym z perwszych katalogów na dysku, to zostaną wyświetlone katalogi na kolejnym dysku, dlatego ten fragment kodu wymaga drobnej korekty:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1DblClick(TObject *Sender)
{
int x = ListBox1->ItemIndex;
String dirList = ListBox1->Items->Strings[x];
String directory;

if(dirList != "[...]")
{
  directory = Drive + dirList + "\\";

}
else
{
  if(DirectoryExists(Drive + dirList)) directory = Drive + dirList + "\\"; // sprawdzanie czy nie mamy do czynienia z katalogiem
  else
  {
   String tmp = Drive.SubString(1, Drive.Length() - 2);
   int y = tmp.LastDelimiter("\\");
   directory = Drive.SubString(1, y - 1) + "\\";
  }
}

FindDir(ListBox1, directory);
Drive = directory;
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 65 gości

cron