Dynamicznie generowanie menu

0

Chcę zrobić w TMainMenu by po kliknięciu na jedną z głównych pozycji wyświetlała mi się lista plików z wybranego katalogu.

Jak to wykonać?

0

W edytorze menu klikamy na pozycję do której chcemy dodawać elementy prawym klawiszem myszy i wybieramy z menu kontekstowego opcję Create Submenu. Następnie utworzonemu pierwszemu elementowi podmenu ustawiamy jakiś Caption. Ważne jest żeby nie został on pusty, bo w przeciwnym wypadku Delphi usunie go automatycznie podczas kompilacji. Dzięki temu będzie możliwe proste dodawanie pozycji do menu. Potem do zdarzenia OnClick dodajemy kod:

  var
    SR:TSearchRec;
    I:Integer;
    MenuItem:TMenuItem;
  begin
    while Menu1.Count>1 do Menu1.Delete(1);
    I:=FindFirst('<Folder do przeszukania>\*.*', faAnyFile, SR);
    while I=0 do
    begin
      if SR.Name[1]<>'.' then
      begin
        MenuItem:=TMenuItem.Create(nil);
        MenuItem.Caption:=String(SR.Name);
        Menu1.Add(MenuItem);
      end;
      I:=FindNext(SR);
    end;
    FindClose(SR);
    Menu1.Delete(0);
  end;

Oto wyjaśnienie po kolei:

while Menu1.Count>0 do Menu1.Delete(1);

Usuwamy wszystkie poprzednie pozycje z wyjątkiem pierwszej (o indexie 0). Jeżeli nie pozostawimy jednej pozycji to menu nie będzie posiadac zadnych pozycji (subitemów) i nie będzie możliwe ich proste dodawanie.

    I:=FindFirst('<Folder do przeszukania>\*.*', faAnyFile, SR);
    while I=0 do
    begin
      if SR.Name[1]<>'.' then
      begin
        MenuItem:=TMenuItem.Create(nil);
        MenuItem.Caption:=String(SR.Name);
        Menu1.Add(MenuItem);
      end;
      I:=FindNext(SR);
    end;
    FindClose(SR);

Tutaj cała procedura wyszukiwania. Menu1 jest u mnie nazwą menu do którego dodajemy elementy. W miejsce <Folder do przeszukania> wstawiamy oczywiście prawidłową nazwę folderu :-) . Kod

if SR.Name[1]<>'.' then

zapobiega dodawaniu do menu folderów , które znajdowane są w pętli wyszukującej jako '.' i '..' (bieżący i nadrzędny folder).

Linia

Menu1.Delete(0);

usuwa pierwszą pozycję która nie została usunięta na starcie.

Trzeba jeszcze po utworzeniu pozycji dodać kod

MenuItem.OnClick=<nasza procedura obsługi kliknięcia> aby przechwycić kliknięcie na element.

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