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