ShellListView - Jak przypisać zdarzenie?

0

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ę.

0

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 ... :)

0

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ź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1