Вопрос по tdxBar.
Есть код, который добавляет кнопки на панель.
[more]
procedure TfmMain.CreateFormButton(form1:TForm);
var
//ABarManager : TdxBarManager;
ABar : TdxBar;
NewButton : TdxBarButton;
NewItemLink : TdxBarItemLink;
begin
inc(iButtonsCount);
// ABarManager := GetBarManagerByForm(self);
ABar := Bar1;
NewButton := TdxBarButton.Create(self);
NewItemLink := ABar.ItemLinks.Add;
NewItemLink.Item := NewButton;
NewItemLink.Item.Tag := form1.Handle;
NewButton.Tag := form1.Handle;
NewButton.Name := 'dxButton'+IntToStr(NewButton.Tag);
NewButton.Caption := form1.Caption + '[' + IntToStr(iButtonsCount) + ']';
NewButton.Hint := form1.Caption;
NewButton.OnClick := dxBarButtonClick;
NewButton.ButtonStyle := bsChecked;
NewButton.Down := true;
NewButton.PaintStyle := psCaptionGlyph;
NewButton.GroupIndex := 1;
NewButton.Glyph.Width := 16;//GetSystemMetrics(SM_CXSMICON);
NewButton.Glyph.Height := 16;//GetSystemMetrics(SM_CYSMICON);
NewButton.Glyph.Canvas.Draw(0,0,form1.Icon);
ABar.Control.RepaintBar;
end;
[/more]
Но теперь у меня tdxBar в качестве главного меню. У главного меню есть пункты меню, например, Операции, Сервис, Справочники со своими подменю.
Мне нужно программно в цикле добавлять в нужный главный пункт меню (Операции, Сервис или Справочники) ещё подменю.
Допустим, у меню Справочники есть меню Справочник-1 и Справочник-2. Теперь при старте приложения будет загружаться ещё dll-ка.
В коде программы есть функция загрузки этих плагинов, но как правильно рассовать по существующим пунктам главного меню запуск dll...
Вот код:
[more]
procedure TfmMain.LoadPlugins();
Var
i, iDllHandle:integer;
PlugExec : procedure(sender :TObject) of object;
PlugType : function : integer; //Объявление функции, которая будет возвращать тип плугина
GetConnectInfo : procedure(fbclient,DB:PChar;db_connected:boolean);
GetUserData : procedure(UID:integer;UserName:PChar);
MenuCaption : function : PChar;
//для вывода кнопки плагина
act: TAction;
NewButton: TdxBarButton;
NewItemLink: TdxBarItemLink;
begin
iDllHandleAreas := 0;
slPlagins := TStringList.Create;
slPlaginsHandles := TStringList.Create;
Log(IncludeTrailingPathDelimiter(sAppPath2)+'Plugins\');
FindPlugins(IncludeTrailingPathDelimiter(sAppPath2)+'Plugins\');
Log('Найдено:' + IntToStr(slPlagins.Count));
if slPlagins.Count <= 0 then begin
FreeAndNil(slPlagins);
exit;
end;
LOG(self.Name+' Загрузка плагинов');
//если найдены плагины, то пытаемся их загрузить
for I := 0 to slPlagins.Count - 1 do begin
//iDllHandleAreas
iDllHandle := LoadLibrary(PChar(slPlagins[i]));
slPlaginsHandles.Add(IntToStr(iDllHandle));
if iDllHandle <> 0 then begin
@plugExec := GetProcAddress(iDllHandle,'PluginExec');
@plugType := GetProcAddress(iDllHandle,'PluginType');
@GetConnectInfo := GetProcAddress(iDllHandle,'GetConnectInfo');
@GetUserData := GetProcAddress(iDllHandle,'GetUserData');
GetUserData(UserData.UserID,PChar(UserData.UserName));
GetConnectInfo(PChar(DM.fibDB.LibraryName),PChar(DM.fibDB.DBName),DM.fibDB.TestConnected);
NewButton := TdxBarButton.Create(self);
@MenuCaption := GetProcAddress(iDllHandle,'MenuCaption');
act := TAction.Create(am1);
act.ActionList := am1;
act.onExecute := plugExec;
act.caption := MenuCaption;
act.Hint := MenuCaption;
if MenuCaption = 'Участки [Make It! Innovations]' then
iDllHandleAreas := iDllHandle;
NewButton.Action := act;
//раньше в главное
//PlugType возвращает индекс, по этому индексу определяем в какой пункт меню ставить новый пункт
// mmMainMenu.Items.Items[PlugType].Add(NewItem);
ДАЛЬШЕ НЕ МОГУ СООБРАЗИТЬ
// NewItemLink := MainMenu.ItemLinks.Add;
// NewItemLink := MainMenu.ItemLinks.
// if plugType = 3 then
// NewItemLink := mmApart.ItemLinks.Add;
NewItemLink.Item := NewButton;
Log(self.Name+' Плагин успешно загружен: '+MenuCaption);
end;
end;//for
end;
[/more]
Может на картинке будет понятнее:
Нужно добавить в конец списка ещё один пункт меню.
Если я использую стандартное главное меню, то всё в норме, но приспичило установить dxBarManager.... и тут засада