Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TMenuItem порядок создания меню


Автор: ivan219 18.10.2006, 13:42
И меется меню MainMenu: TMainMenu; в нём динамически создаются TMenuItem загружаемые из Dll но так как программа ищит Dll файлы неизвестно как то мои меню и пункты меню прыгают сместа на место т.е. как только добовляю новый Dll фаил то всё сразу перемещается может и неперемещатся от чего зависит я пока незнаю.

Вопрос возможно как-то зделать приоретеры в меню чтоб он создовалось только определённым образом внезависимости от того в каком порядке они создаются из Dll.

Вобщем слушаю ваши предложения.

Код

function MainMenuCreate(Name,NameClass,Caption:PChar;
 Click,TypeClass:Boolean):Boolean; StdCall;
begin
 Result:=False;
 MenuFind:=Calc.FindComponent(Name) as TMenuItem;
 if MenuFind=Nil then
  begin
   Menu:=TMenuItem.Create(Calc);
   Menu.Name:=Name;
   Menu.Caption := Caption;
   if Click then Menu.OnClick:=Calc.MenuItemClick;
   case TypeClass of
        True: begin
               MenuFind:=Calc.FindComponent(NameClass) as TMenuItem;
               MenuFind.Insert(0,Menu);
              end;
        False: Calc.MainMenu.Items.Add(Menu);
   end;
   Result:=True;
  end;
end;

Автор: _hunter 18.10.2006, 13:54
может проще список dll-лок сортировать (ну и добавить его соответсвенно)?
или список имен сортируй (если тебе это нужно)
или храни в dll индекс MenuItem' а и сортируй список по нему...

Автор: Dynamic 18.10.2006, 13:55
создаешь список ДЛЛ, сортируешь как надо и строишь меню по этому списку.


упс, опоздал 

Автор: ivan219 18.10.2006, 14:07
Цитата(Dynamic @  18.10.2006,  13:55 Найти цитируемый пост)
создаешь список ДЛЛ, сортируешь как надо и строишь меню по этому списку.

Это как http://forum.vingrad.ru/index.php?showtopic=116792&unread=1&st=15&#entry892795 или я что-то не так понял smile 
Цитата(_hunter @  18.10.2006,  13:54 Найти цитируемый пост)
или храни в dll индекс MenuItem' а и сортируй список по нему...
 а можено мальенький примерчик smile 

Автор: Dynamic 18.10.2006, 14:15
Цитата(ivan219 @  18.10.2006,  14:07 Найти цитируемый пост)
Это как Здесь сказали что нельзя или я что-то не так понял 


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

Я тебе говорю, что найди ВСЕ нужные файлы, создай по ним список, отсортируй его как-нить и по списку строй меню. Тогда у тебя меню всегда будет однообразно. 

Автор: Sansa 18.10.2006, 17:02
Например, используй свойство "Tag".

Код

function GetItemIDbyTag(AMenu: TMenuItem; ATag: Integer): Integer;
var
  I, N: Integer;
  LMenuItem: TMenuItem;
begin
  Assert(Assigned(AMenu), 'AMenu not assigned');
  N:= AMenu.Count;
  for I:= 0 to pred(N) do
  begin
    LMenuItem:=AMenu[I];
    if LMenuItem.Tag = ATag then
    begin
      Result:= AMenu.IndexOf(LMenuItem);
      Break;
    end;
  end;
end;


/// вырезано
  {вместо}
  {False: Calc.MainMenu.Items.Add(Menu);}

  {используй}
  False: Calc.MainMenu.Items.Insert(GetItemIDbyTag(Menг.Items, LTag), Menu);
/// вырезано



Теперь ты можешь управлять положением элемента меню просто изменяя значение переменной LTag, которая может передаваться из той же dll (конечно, для каждой свой, хотя необязательно).

Пример грубый, но по первости сойдет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)