Topic: мультиязычность в выподающем меню

вот скрипт меню

procedure SwitchMenu (Sender: string);
var
   fiLang,reporfile:TStringList;
   i,s,t,c: integer;
   subfiLangi,mnFilereport,subfiLangiEdit,subfiLangirepor,subfiLangiDel,subfiLangiPrint,subfiLangipdf,mnFile,mnfiLangi,subFileNextUser,subFileClose,mnDictionary,subDictionaryPriceList,subDictionaryDash1,subDictionaryDash2,subDictionaryDash3,subDictionaryDash4,subDictionaryDash5,subDictionaryStatusEquipment,subDictionaryCompany,subDictionaryEquipment,subDictionaryBrand,subDictionaryAccessories,subFilereport,mnActivities,subEvents,subDonations : TMenuItem;
   rta:TMainMenu;
   mur:TForm;
begin
  // если открыта форма * то переменная содежит имя этой формы
  if sender = 'frmAdmin' then mur:=frmAdmin else
  if sender = 'frmMasterWork' then mur:=frmMasterWork else
  if sender = 'frmServiceCen' then mur:=frmServiceCen;

 c := frmLogin.TMainMenu.Items.Count-1;
   for i := c downto 0 do
       if frmLogin.TMainMenu.Items[i].Visible then frmLogin.TMainMenu.Items[i].Free;

   // создаем выподающее меню
   mnFile := TMenuItem.Create (mur);
   mnFile.Caption := pupmFa;

       subFileNextUser := TMenuItem.Create (mur);
       subFileNextUser.Caption := pupmnuser;
       subFileNextUser.OnClick := @MenuClick1;

       subFileClose := TMenuItem.Create (mur);
       subFileClose.Caption := pupmex;
       subFileClose.OnClick := @MenuClick2;

   mnDictionary := TMenuItem.Create (mur);
   mnDictionary.Caption := pupmlib;

       subDictionaryPriceList := TMenuItem.Create (mur);
       subDictionaryPriceList.Caption := pupmpr;
       subDictionaryPriceList.OnClick := @MenuClick3;

       subDictionaryDash1:= TMenuItem.Create (mur);
       subDictionaryDash1.Caption := '-';
       subDictionaryDash1.Enabled:= False;

       subDictionaryStatusEquipment := TMenuItem.Create (mur);
       subDictionaryStatusEquipment.Caption := pupmst;
       subDictionaryStatusEquipment.OnClick := @MenuClick5;

       subDictionaryDash2:= TMenuItem.Create (mur);
       subDictionaryDash2.Caption := '-';
       subDictionaryDash2.Enabled:= False;

       subDictionaryCompany := TMenuItem.Create (mur);
       subDictionaryCompany.Caption := pupmco;
       subDictionaryCompany.OnClick := @MenuClick6;

       subDictionaryEquipment := TMenuItem.Create (mur);
       subDictionaryEquipment.Caption := pupmeq;
       subDictionaryEquipment.OnClick := @MenuClick7;

       subDictionaryBrand := TMenuItem.Create (mur);
       subDictionaryBrand.Caption := pupmbr;
       subDictionaryBrand.OnClick := @MenuClick8;

       subDictionaryDash3:= TMenuItem.Create (mur);
       subDictionaryDash3.Caption := '-';
       subDictionaryDash3.Enabled:= False;

       subDictionaryAccessories := TMenuItem.Create (mur);
       subDictionaryAccessories.Caption := pupmeex;
       subDictionaryAccessories.OnClick := @MenuClick9;



   mnActivities := TMenuItem.Create (mur);
   mnActivities.Caption := pupmhe;

       subEvents := TMenuItem.Create (mur);
       subEvents.Caption := pupmsi;
       subEvents.OnClick := @MenuClick10;

       subDictionaryDash4:= TMenuItem.Create (mur);
       subDictionaryDash4.Caption := '-';
       subDictionaryDash4.Enabled:= False;

       subDonations := TMenuItem.Create (mur);
       subDonations.Caption := pupmab;
       subDonations.OnClick := @MenuClick11;

 mnFilereport := TMenuItem.Create (mur);
 mnFilereport.Caption := pupmreport;

         subFilereport:= TMenuItem.Create (mur);
         subFilereport.Caption := pupmreportnew;
         subFilereport.OnClick := @clicknew;

         subDictionaryDash5:= TMenuItem.Create (mur);
         subDictionaryDash5.Caption := '-';

 mnfiLangi := TMenuItem.Create (mur);
 mnfiLangi.Caption := pupmlang;

   // выводим выподающее меню
   rta:=TMainMenu.Create(mur);
   rta.Items.Add(mnFile);
       mnFile.Add(subFileNextUser);
       mnFile.Add(subFileClose);

   rta.Items.Add(mnDictionary);
        mnDictionary.Add(subDictionaryPriceList);
        mnDictionary.Add(subDictionaryDash1);
        mnDictionary.Add(subDictionaryStatusEquipment);
        mnDictionary.Add(subDictionaryDash2);
        mnDictionary.Add(subDictionaryCompany);
        mnDictionary.Add(subDictionaryEquipment);
        mnDictionary.Add(subDictionaryBrand);
        mnDictionary.Add(subDictionaryDash3);
        mnDictionary.Add(subDictionaryAccessories);
 // выводим в выподающем меню список файлов мультиязычности
 rta.Items.Add(mnfiLangi);
  try
 fiLang := TStringList.Create;
 fiLang.Text := GetFilesList('languages','*.ini',False);
 s := fiLang.Count-1;
for i:=0  to s  do
 begin
  subfiLangi:= TMenuItem.Create (mur);
  subfiLangi.Caption := ExtractFileName(fiLang[i]);
  Delete(subfiLangi.Caption, Length(subfiLangi.Caption) -3 , 4);
  subfiLangi.Hint := (fiLang[i]);
  mnfiLangi.Add(subfiLangi);
  subfiLangi.OnClick := @clicklang;
  end;
finally
fiLang.free  ;

end;
 // выводим в выподющем меню список фалов отчетов
rta.Items.Add(mnFilereport);
   mnFilereport.Add(subFilereport);
   mnFilereport.Add(subDictionaryDash5);
reporfile := TStringList.Create;
    reporfile.Text := GetFilesList( 'Report\','*.fr3',True); //ExtractFilePath(Application.ExeName) +

     t := reporfile.Count-1;
     for i:=0  to t  do
     begin
         subfiLangirepor:= TMenuItem.Create (mur);
         subfiLangirepor.Caption := ExtractFileName(reporfile[i]);
         subfiLangirepor.Hint := (reporfile[i]);
         mnFilereport.Add(subfiLangirepor);

         Delete(subfiLangirepor.Caption, Length(subfiLangirepor.Caption) -3 , 4);

         subfiLangiEdit := TMenuItem.Create(mur);
         subfiLangiEdit.Caption := pupmreportedit;
         subfiLangiEdit.Hint := (reporfile[i]);
         subfiLangiDel := TMenuItem.Create(mur);
         subfiLangiDel.Caption := pupmreportdel;
         subfiLangiDel.Hint := (reporfile[i]);
         subfiLangipdf := TMenuItem.Create(mur);
         subfiLangipdf.Caption := 'PDF';
         //subfiLangipdf.Hint := (fiLang[i]);
         subfiLangiPrint := TMenuItem.Create(mur);
         subfiLangiPrint.Caption := pupmreportprint;
         subfiLangiPrint.Hint := (reporfile[i]);

         subfiLangiEdit.OnClick := @clickEdit;
         subfiLangiDel.OnClick := @clickDel;
         subfiLangiPrint.OnClick := @clickPrint;
         subfiLangipdf.OnClick := @clickpdf;
    
         subfiLangirepor.Add(subfiLangiEdit);
         subfiLangirepor.Add(subfiLangiDel);
         subfiLangirepor.Add(subfiLangipdf);
         subfiLangirepor.Add(subfiLangiPrint);
     end;

   rta.Items.Add(mnActivities);
        mnActivities.Add(subEvents);
        mnActivities.Add(subDictionaryDash4);
        mnActivities.Add(subDonations);


end;

проблема в том, что вот эта часть

c := frmLogin.TMainMenu.Items.Count-1;
   for i := c downto 0 do
       if frmLogin.TMainMenu.Items[i].Visible then frmLogin.TMainMenu.Items[i].Free;

работает только на главной форме, если просто сменить имя формы получаю ошибку,  как мне ее правельно записать?

Re: мультиязычность в выподающем меню

sibprogsistem wrote:

проблема в том, что вот эта часть

c := frmLogin.TMainMenu.Items.Count-1;
   for i := c downto 0 do
       if frmLogin.TMainMenu.Items[i].Visible then frmLogin.TMainMenu.Items[i].Free;

работает только на главной форме, если просто сменить имя формы получаю ошибку,  как мне ее правельно записать?

Очень странно, что код вообще работает )))  Свойство формы, в котором хранится ссылка на главное меню формы (а это обычно экземпляр класса TMainMenu), называется Menu.  Разница между главной формой и остальными формами MVD в том, что на главной форме меню уже создано, а на остальных его нужно создавать скриптом.

Визуальное программирование: блог и телеграм-канал.

3 (edited by sibprogsistem 2019-01-24 16:27:15)

Re: мультиязычность в выподающем меню

k245 wrote:

Очень странно, что код вообще работает )))  Свойство формы, в котором хранится ссылка на главное меню формы (а это обычно экземпляр класса TMainMenu), называется Menu.  Разница между главной формой и остальными формами MVD в том, что на главной форме меню уже создано, а на остальных его нужно создавать скриптом.

Вот полностью рабочий скрипт обновления

procedure UpdateMenu;
var
   fiLang:TStringList;
   i,s, c: integer;
   subfiLangi: TMenuItem;
   mnFilereport: TMenuItem;
   subfiLangiEdit: TMenuItem;
   subfiLangirepor: TMenuItem;
   subfiLangiDel: TMenuItem;
   subfiLangiPrint: TMenuItem;
   subfiLangipdf: TMenuItem;
   mnFile: TMenuItem;
   mnfiLangi: TMenuItem;
   subFileNextUser: TMenuItem;
   subFileClose: TMenuItem;
   mnDictionary: TMenuItem;
   subDictionaryPriceList: TMenuItem;
   subDictionaryDash1: TMenuItem;
   subDictionaryDash2: TMenuItem;
   subDictionaryDash3: TMenuItem;
   subDictionaryDash4: TMenuItem;
   subDictionaryDash5: TMenuItem;
   subDictionaryStatusUser: TMenuItem;
   subDictionaryStatusEquipment: TMenuItem;
   subDictionaryCompany: TMenuItem;
   subDictionaryEquipment: TMenuItem;
   subDictionaryBrand : TMenuItem;
   subDictionaryAccessories: TMenuItem;
   subFilereport: TMenuItem;
   mnActivities: TMenuItem;
   subEvents: TMenuItem;
   subDonations: TMenuItem;



begin



   Form1.mniFile.Visible := False;
   Form1.mniOptions.Visible := False;
   Form1.mniAbout.Visible := False;


   c := Form1.MainMenu.Items.Count-1;
   for i := c downto 0 do
       if Form1.MainMenu.Items[i].Visible then Form1.MainMenu.Items[i].Free;



   mnFile := TMenuItem.Create (Form1.MainMenu);
   mnFile.Caption := 'Файл';

       subFileNextUser := TMenuItem.Create (Form1.MainMenu);
       subFileNextUser.Caption := 'Сменить пользователя ';
       subFileNextUser.OnClick := @MenuClick1;

       subFileClose := TMenuItem.Create (Form1.MainMenu);
       subFileClose.Caption := 'Выход';
       subFileClose.OnClick := @MenuClick2;

   mnDictionary := TMenuItem.Create (Form1.MainMenu);
   mnDictionary.Caption := 'Словари';

       subDictionaryPriceList := TMenuItem.Create (Form1.MainMenu);
       subDictionaryPriceList.Caption := 'Прайс лист';
       subDictionaryPriceList.OnClick := @MenuClick3;

       subDictionaryDash1:= TMenuItem.Create (Form1.MainMenu);
       subDictionaryDash1.Caption := '-';
       subDictionaryDash1.Enabled:= False;

       subDictionaryStatusUser := TMenuItem.Create (Form1.MainMenu);
       subDictionaryStatusUser.Caption := 'Статус пользователя ';
       subDictionaryStatusUser.OnClick := @MenuClick4;

       subDictionaryStatusEquipment := TMenuItem.Create (Form1.MainMenu);
       subDictionaryStatusEquipment.Caption := 'Статус оборудования ';
       subDictionaryStatusEquipment.OnClick := @MenuClick5;

       subDictionaryDash2:= TMenuItem.Create (Form1.MainMenu);
       subDictionaryDash2.Caption := '-';
       subDictionaryDash2.Enabled:= False;

       subDictionaryCompany := TMenuItem.Create (Form1.MainMenu);
       subDictionaryCompany.Caption := 'Компании ';
       subDictionaryCompany.OnClick := @MenuClick6;

       subDictionaryEquipment := TMenuItem.Create (Form1.MainMenu);
       subDictionaryEquipment.Caption := 'Оборудование';
       subDictionaryEquipment.OnClick := @MenuClick7;

       subDictionaryBrand := TMenuItem.Create (Form1.MainMenu);
       subDictionaryBrand.Caption := 'Бренды';
       subDictionaryBrand.OnClick := @MenuClick8;

       subDictionaryDash3:= TMenuItem.Create (Form1.MainMenu);
       subDictionaryDash3.Caption := '-';
       subDictionaryDash3.Enabled:= False;

       subDictionaryAccessories := TMenuItem.Create (Form1.MainMenu);
       subDictionaryAccessories.Caption := 'Комплектующие';
       subDictionaryAccessories.OnClick := @MenuClick9;



   mnActivities := TMenuItem.Create (Form1.MainMenu);
   mnActivities.Caption := 'Помощь';

       subEvents := TMenuItem.Create (Form1.MainMenu);
       subEvents.Caption := 'Сайт программы';
       subEvents.OnClick := @MenuClick10;

       subDictionaryDash4:= TMenuItem.Create (Form1.MainMenu);
       subDictionaryDash4.Caption := '-';
       subDictionaryDash4.Enabled:= False;

       subDonations := TMenuItem.Create (Form1.MainMenu);
       subDonations.Caption := 'О программе';
       subDonations.OnClick := @MenuClick11;

 mnFilereport := TMenuItem.Create (Form1.MainMenu);
 mnFilereport.Caption := langIniG.ReadString('pupmenu','report', '');

         subFilereport:= TMenuItem.Create (Form1.MainMenu);
         subFilereport.Caption := 'Новый отчет';
         subFilereport.OnClick := @clicknew;

         subDictionaryDash5:= TMenuItem.Create (Form1.MainMenu);
         subDictionaryDash5.Caption := '-';

 mnfiLangi := TMenuItem.Create (Form1.MainMenu);
 mnfiLangi.Caption := langIniG.ReadString('pupmenu','lang', ''); ;



   Form1.MainMenu.Items.Add(mnFile);
       mnFile.Add(subFileNextUser);
       mnFile.Add(subFileClose);

   Form1.MainMenu.Items.Add(mnDictionary);
        mnDictionary.Add(subDictionaryPriceList);
        mnDictionary.Add(subDictionaryDash1);
        mnDictionary.Add(subDictionaryStatusUser);
        mnDictionary.Add(subDictionaryStatusEquipment);
        mnDictionary.Add(subDictionaryDash2);
        mnDictionary.Add(subDictionaryCompany);
        mnDictionary.Add(subDictionaryEquipment);
        mnDictionary.Add(subDictionaryBrand);
        mnDictionary.Add(subDictionaryDash3);
        mnDictionary.Add(subDictionaryAccessories);

 Form1.MainMenu.Items.Add(mnfiLangi);



  try
 fiLang := TStringList.Create;
 fiLang.Text := GetFilesList('languages','*.ini',False);
 s := fiLang.Count-1;
for i:=0  to s  do
 begin
  subfiLangi:= TMenuItem.Create (Form1.MainMenu);

  subfiLangi.AutoCheck := True;
  if fiLang[i] = strshowG then subfiLangi.Checked := True;

  subfiLangi.Caption := ExtractFileName(fiLang[i]);
  Delete(subfiLangi.Caption, Length(subfiLangi.Caption) -3 , 4);
  subfiLangi.Hint := (fiLang[i]);
  mnfiLangi.Add(subfiLangi);
  subfiLangi.OnClick := @clicklang;
 end;
finally
fiLang.free  ;
end;

Form1.MainMenu.Items.Add(mnFilereport);
   mnFilereport.Add(subFilereport);
   mnFilereport.Add(subDictionaryDash5);
 try
 fiLang := TStringList.Create;
 fiLang.Text := GetFilesList('Report','*.fr3',False);
 s := fiLang.Count-1;
for i:=0  to s  do
 begin
  subfiLangirepor:= TMenuItem.Create (Form1.MainMenu);
  subfiLangirepor.Caption := ExtractFileName(fiLang[i]);
  Delete(subfiLangirepor.Caption, Length(subfiLangirepor.Caption) -3 , 4);
  subfiLangirepor.Hint := (fiLang[i]);
  subfiLangiEdit := TMenuItem.Create(Form1.MainMenu);
  subfiLangiEdit.Caption := langIniG.ReadString('pupmenu','reportedit', '');
  subfiLangiEdit.Hint := (fiLang[i]);
  subfiLangiDel := TMenuItem.Create(Form1.MainMenu);
  subfiLangiDel.Caption := langIniG.ReadString('pupmenu','reportdel', '');
  subfiLangiDel.Hint := (fiLang[i]);
  subfiLangipdf := TMenuItem.Create(Form1.MainMenu);
  subfiLangipdf.Caption := 'PDF';
  subfiLangipdf.Hint := (fiLang[i]);
  subfiLangiPrint := TMenuItem.Create(Form1.MainMenu);
  subfiLangiPrint.Caption := langIniG.ReadString('pupmenu','reportprint', '');
  subfiLangiPrint.Hint := (fiLang[i]);


  subfiLangiEdit.OnClick := @clickEdit;
  subfiLangiDel.OnClick := @clickDel;
  subfiLangiPrint.OnClick := @clickPrint;
  subfiLangipdf.OnClick := @clickpdf;

  mnFilereport.Add(subfiLangirepor);
  subfiLangirepor.Add(subfiLangiEdit);
  subfiLangirepor.Add(subfiLangiDel);
  subfiLangirepor.Add(subfiLangipdf);
  subfiLangirepor.Add(subfiLangiPrint);

  end;
finally
fiLang.free  ;
end;





   Form1.MainMenu.Items.Add(mnActivities);
        mnActivities.Add(subEvents);
        mnActivities.Add(subDictionaryDash4);
        mnActivities.Add(subDonations);



end;

но только для главной формы...
мой скрипт из первий записи выводит меню в 3-х формах кроме главной
и я не могу понять как мне  правельно изменить эту часть скрипта

c := frmLogin.TMainMenu.Items.Count-1;
   for i := c downto 0 do
       if frmLogin.TMainMenu.Items[i].Visible then frmLogin.TMainMenu.Items[i].Free;

или как еще можно перерисовать это меню?

Re: мультиязычность в выподающем меню

все дошло

// если открыта форма * то переменная содежит имя этой формы
  if sender = 'frmAdmin' then mur:=frmAdmin else
  if sender = 'frmMasterWork' then mur:=frmMasterWork else
  if sender = 'frmServiceCen' then mur:=frmServiceCen;
  rta.free;
     // создаем выподающее меню
   mnFile := TMenuItem.Create (mur);
   mnFile.Caption := pupmFa;

Re: мультиязычность в выподающем меню

Hello sibprogsistem, k245

With this script below, I use it to place menus on, in this case, Form2 :

MVD\MENU\Créer des menus sur une form autre que la form principale
procedure Form1_OnShow (Sender: string; Action: string); // event OnShow
var
   MyItem1: TMenuItem;
   MyItem2: TMenuItem;
   MySubItem3: TMenuItem;

   MenuForm2: TMainMenu;
begin


   MyItem1 := TMenuItem.Create (Form2);
   MyItem1.Caption := 'MyItem1';
   MyItem1.OnClick := @MenuClick1;

   MyItem2 := TMenuItem.Create (Form2);
   MyItem2.Caption := 'MyItem2';


   MySubItem3 := TMenuItem.Create (Form2);
   MySubItem3.Caption := 'Submenu';
   MySubItem3.OnClick := @MenuClick3;



   MenuForm2 := TMainMenu.Create(Form2); // Create MainMenu on Form2
   MenuForm2.Items.Add(MyItem1);         // you can use ADD or INSERT
   MenuForm2.Items.Insert(0, MyItem2);   // you can use ADD or INSERT
   MyItem2.Add(MySubItem3);

end;


procedure MenuClick1 (Sender: string);
begin
     ShowMessage('Hello from MyItem1');
end;

procedure MenuClick3 (Sender: string);
begin
     ShowMessage('Hello from Submenu');
end;

begin

end.

JB