Mam ShellListView i chciałbym aby dla określonego folderu działało zdarzenie OnDblClick. Czyli np. folder ma nazwę 'koza' i ma index nr. 3 i jeśli ktoś weźmie ten folder dwukrotnie to przed wyświetleniem jego zawartości pokaże komunikat i dopiero po kliknięciu OK zostanie wyświetlona zawartość folderu. Można to jakoś zrobić? Niestety raczej nie ma o tym dobrego artykułu po polsku, z którego mógłbym coś wykombinować, a nie jestem tak dobry w angielskim by czytać zagraniczne arty. Może ktoś wie mniejwięcej jak to by zrobić? Za pomocną odpowiedź od razu dziękuję.
Z mojego programu - klient FTP - kawałek kodu wyświetlającego zawartość katalogu lokalnego oraz zmiana katalogu w ListView:
1)<font colo="navy"> Wyświetlanie zawartości katalogu lokalnego:</span>
procedure Tklient_ftp_form.ListFiles_lewa();
var
SRLewa : TSearchRec; // rekord
SRLewa_test : string;
SRLewa_znak_test : string;
SRLewa_test1 : string;
ListLewa : TListItem; // pozycja w ListView
FoundLewa : Integer; // zmienna oznacza ilosc znalezionych plikow
maskalewa : string;
DirLewa : string;
begin
ListView_lewa.SetFocus;
ListView_lewa.ShowWorkAreas:=true;
ListView_lewa.RowSelect:=true; // aby zaznaczać cały wiersz
ListView_lewa.Items.Clear; // wyczyszczenie komponentu
maskalewa := '*.*';
Dirlewa := Edit_kat_lokalny.Text;
Foundlewa := FindFirst( Dirlewa + maskalewa, faAnyFile, SRLewa ); // odnajdź pliki
while ( FoundLewa = 0 ) do // rob dopoki liczba zbalezionych plikow nie rowna sie zero
begin
//jeżeli nie jest to '.' i jest katalogiem (plik nieistnieje)
if (SRLewa.Name <> '.') and not (FileExists (DirLewa + SRLewa.Name)) then
begin
ListLewa := ListView_Lewa.Items.Add; // stworz nowa pozycje
ListLewa.Caption := '[' + SRLewa.Name + ']'; // ustaw pozycje
ListLewa.SubItems.Add(''); // jeżeli katalog to bez rozszerzenia
ListLewa.SubItems.Add('Dir'); // dodaj wskaźnik, że jest to katalog
ListLewa.SubItems.Add(DateTimeToStr(FileDateToDateTime(SRLewa.Time)));
end;
// jeżeli nie jest to '.' i nie jest to katalog
if (SRLewa.Name <> '.') and (FileExists (DirLewa + SRLewa.Name)) then
begin
ListLewa := ListView_Lewa.Items.Add; // stworz nowa pozycje
SRLewa_test := SRLewa.Name;
delete(SRLewa_test,length(SRLewa.Name) - length(ExtractFileExt(SRLewa.Name)) + 1,length(ExtractFileExt(SRLewa.Name)));
ListLewa.Caption := SRLewa_test; // nazwa pliku ustaw pozycje
SRLewa_test1 := ExtractFileExt(SRLewa.Name);
SRLewa_znak_test := copy(SRLewa_test1, 1, 1);
if SRLewa_znak_test = '.' then
begin
delete(SRLewa_test1, 1, 1);
end;
ListLewa.SubItems.Add(SRLewa_test1); // rozszerzenie pliku
ListLewa.SubItems.Add(IntToStr(SRLewa.Size)); // dodaj rozmiar pliku
ListLewa.SubItems.Add(DateTimeToStr(FileDateToDateTime(SRLewa.Time)));
end;
// --
FoundLewa := FindNext(SRLewa); // kontynuuj przeszukiwanie
end;
FindClose(SRLewa); // zkaoncz przeszukiwanie
wiersz_lewa_zaznacz_nazwa := '';
wiersz_lewa_zaznacz_rozsz := '';
wiersz_lewa_zaznacz_wielk := '';
wiersz_lewa_zaznacz_data := '';
end;
2)<font color="navy"> Zmiana katalogu lokalnego:</span>
procedure Tklient_ftp_form.ListView_lewaDblClick(Sender: TObject);
var
kontrolka_lewa : integer;
plik_nazwa : string;
plik_rozsz : string;
plik_wielk : string;
plik_data : string;
dir_lewa : string;
dir_lewa_test : string;
znak_lewa : string;
begin
dir_lewa := '';
dir_lewa_test := '';
znak_lewa := '';
ListView_lewa.SetFocus;
ListView_Lewa.ShowWorkAreas:=true;
ListView_Lewa.RowSelect:=true; // aby zaznaczać cały wiersz
kontrolka_lewa:=ListView_Lewa.SelCount;
// jezeli puste pole to index = 0, jezeli pozycja wybrana to index = 1
if (kontrolka_lewa = 0) then
begin
showmessage('Dokonaj wyboru pliku lub katalogu na dysku lokalnym ...');
end;
if (ListView_Lewa.ItemFocused <> nil) and (kontrolka_lewa <> 0) then
begin
plik_nazwa := ListView_Lewa.Selected.Caption;
plik_rozsz := ListView_Lewa.Selected.SubItems.Strings[0];
plik_wielk := ListView_Lewa.Selected.SubItems.Strings[1];
plik_data := ListView_Lewa.Selected.SubItems.Strings[2];
//usunięcie z nazwy znaków klamry tj.: "[" oraz "]"
while (pos('[', plik_nazwa) > 0) and (plik_wielk = 'Dir') do
begin
delete(plik_nazwa, pos('[', plik_nazwa), 1);
end;
while (pos(']', plik_nazwa) > 0) and (plik_wielk = 'Dir') do
begin
delete(plik_nazwa, pos(']', plik_nazwa), 1);
end;
//zmiana katalogu na podkatalog
if (plik_nazwa <> '..') and (plik_wielk = 'Dir') then
begin
if directoryexists(Edit_kat_lokalny.Text + plik_nazwa + '\') then
begin
chdir(pchar(Edit_kat_lokalny.Text + plik_nazwa + '\'));
Edit_kat_lokalny.Text := Edit_kat_lokalny.Text + plik_nazwa + '\';
//odświeżanie zawartości lewego okna ...
ListFiles_lewa();
end;
end;
//zmiana katalogu na katalog nadrzedny [..]
if (plik_nazwa = '..') and (plik_wielk = 'Dir') then
begin
dir_lewa := Edit_kat_lokalny.Text;
dir_lewa_test := dir_lewa;
if directoryexists(dir_lewa_test) and (length(Dir_Lewa_test) > 3) then
begin
znak_lewa:=copy(Dir_lewa_test, length(Dir_lewa_test), 1);
if znak_lewa = '\' then
begin
delete(Dir_lewa_test,length(Dir_lewa_test), 1);
znak_lewa:=copy(Dir_lewa_test, length(Dir_lewa_test), 1);
while (znak_lewa <> '\') do
begin
delete(Dir_lewa_test,length(Dir_Lewa_test), 1);
znak_lewa:=copy(Dir_Lewa_test, length(Dir_lewa_test), 1);
end;
if znak_lewa = '\' then
begin
Dir_Lewa:=Dir_Lewa_test;
Edit_kat_lokalny.Text := Dir_Lewa;
ListFiles_lewa();
end;
end;
end;
end;
end;
end;
Mam nadzieję, że Ci się przyda, obsługa w ListView zrobiona ręcznie - przy dodawaniu trzeba sprawdzić i zaznaczyć, że mamy katalog. Przy obsłudze zdarzenia dwukrotnego kliknięcia myszą sprawdzamy co jest zapisane w ListView i jeżeli jest to katalog wywołujemy ponownie procedurę wyświetlającą katalog lokalny z odpowiedniej ścieżki po uwzględnieniu naszego wcześniejszego wyboru.
Zobacz również artykuł:
IdFTP i IdFTPServer - podstawowe procedury
w którym opisane są podstawowe procedury klienta FTP wraz z wyświetlaniem zawartości w ListView (zarówno katalogu lokalnego jak i zdalnego).
Pozdrawiam ... :)
Trochę czasu minęło i nadal nie wiem jak to zrobić. Próbowałem w zdarzeniu OnDblClick dla ShellListView wykryć Index folderu porównać go z zastrzeżonym i odpowiednio zareagować, ale mi się nie udało. Może źle próbuję wykrywać? Jeszcze raz proszę o pomoc. Może ktoś wie jak podczas dwukrotnego kliknięcia w jakiś folder porównać jego Index i jeśli się zgadza to zablokować wyświetlenie jego zawartości i zamiast tego wyświetlić formę? Z góry dziękuję za pomocną odpowiedź.