Witam wszystkich.

Podczas tworzenia menu przy uzyciu ActionManegera (dalej AM) napotkalem kilka problemow.

Menu glowne sklada sie z opcji: Plik, Edycja itd. Utworzylem je poprzez kategorie w AM, np dla opcji Plik w AM jest kategoria AM_PLIK, dla Edycji AM_Edycja. Poprzez przeciagniecie tych kategorii na ActionMainMenuBar (dalej AMMB) powstalo menu. Jest to wazna uwaga dla zaczynajacych prace z AM, gdyz nie pogrupowanie opcji w kategorie uniemozliwi uzyskanie prawidlowego rozwijania Menu tzn po otworzeniu opcji Plik i przesunieciu myszy nad Edycja menu Edycja nie rozwineloby sie bez uzycia kategorii. Ponadto aby opcja w menu byla dostepna, nalezy utworzyc obsluge akcji na podstawie ktorej powstala ta opcja.

Nastepnie dodalem w AM do poszczegolnych akcji ikony i tu pojawil sie pierwszy problem. Dodanie lub zmiana ikony w AM dla danej akcji nie jest przenoszona do AMMB. Eksperymentalnie stwierdzilem, ze wpisanie wartosci 0 do wlasciwosci ImageIndex w AMMB powoduje, ze podczas wyswietlania menu ikony "przechodza z AM do AMMB". Ponizej procedura to realizujaca do oceny:

procedure TF_PKT_BROW.UstawIkonyMenu;
const
  ILE_GLOWNYCH=6;  //ilosc domyslnych glownych opcji w menu
                   //po personalizacji menu glownego wyciagniete, przez uzytkownika opcje nie maja
                   //miec zmienianego numeru ikony n 0
var
  nn,mm,xx,zz:longint;
begin
 
 //Aktualizacja obrazkow doczepionych do opcji w menu (4 poziomy menu)
  if ActionManager1.ActionBars[0].Items.Count>0 then
  for nn:=0 to ActionManager1.ActionBars[0].Items.Count-1 do
  begin
    if nn>=ILE_GLOWNYCH then BREAK; 
    
    if ActionManager1.ActionBars[0].Items[nn].Action<>nil
    then begin
      ActionManager1.ActionBars[0].Items[nn].ImageIndex:=0;
    end;

    if ActionManager1.ActionBars[0].Items[nn].Items.Count>0 then
    for mm:=0 to ActionManager1.ActionBars[0].Items[nn].Items.Count-1 do
    begin
      if ActionManager1.ActionBars[0].Items[nn].Items[mm].Action<>nil
      then begin
        ActionManager1.ActionBars[0].Items[nn].Items[mm].ImageIndex:=0;
      end; 

      if ActionManager1.ActionBars[0].Items[nn].Items[mm].Items.Count>0 then
      for xx:=0 to ActionManager1.ActionBars[0].Items[nn].Items[mm].Items.Count-1 do
      begin
        if ActionManager1.ActionBars[0].Items[nn].Items[mm].Items[xx].Action<>nil
        then begin
          ActionManager1.ActionBars[0].Items[nn].Items[mm].Items[xx].ImageIndex:=0;
        end; 

        if ActionManager1.ActionBars[0].Items[nn].Items[mm].Items[xx].Items.Count>0 then
        for zz:=0 to ActionManager1.ActionBars[0].Items[nn].Items[mm].Items[xx].Items.Count-1 do
        begin
          if ActionManager1.ActionBars[0].Items[nn].Items[mm].Items[xx].Items[zz].Action<>nil
          then begin
            ActionManager1.ActionBars[0].Items[nn].Items[mm].Items[xx].Items[zz].ImageIndex:=0;
          end;
        end;
      end;
    end;
  end;
end;

Tym niemniej jest to tylko obejscie problemu i stad moje zasadnicze pytanie na Forum:

W jaki sposob przy uzyciu kodu programu odczytac wartosc ImageIndex zapisana przy danej akcji AM i przenieść ją do danej opcji w AMMB ??


Drugi problem, na ktory natrafilem dotyczy dostepu opcji menu glownego poprzez klawisze akceleratory definiowane jako &Plik czy &Edycja co w menu wyglada jako Plik i Edycja

Otoz jesli AMMB znajduje sie na glownym formularzu aplikacji (MainForm) to klawisze akceleracji dzialaja prawidlowo, natomiast w przypadku, gdy formularz z AMMB wywolywany jest w srodku aplikacji to te klawisze nie dzialaja.
I stad drugie pytanie, jak mozna ten problem rozwiazac?

Pozdrawiam wszystkich i sorki za ten przydlugi post.
Michal