Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Работа с меню...   Найти похожие ветки 

 
MTsv DN   (2009-12-04 09:45) [0]

Всем привет...

В продолжении темы: http://delphimaster.net/view/11-1259759327/

Появились некоторые вопросы по меню, видимо к Владимиру, хотя если у кого есть ответы, рад буду выслушать.
1. Почему Count считает всегда число элементов по всей глубине субменю?
З.Ы. Строчка k := GetMenuItemCount(pm.Items[0].Parent.Handle); возвращает правильный Count, т.ч. вопрос не актуален.
2. Почему при вызове RemoveSubMenu число Count не уменьшается. Вот это уже актуальный вопрос!!!


 
MTsv DN   (2009-12-04 17:32) [1]

3. Ошибка в функции InsertSubMenu. Причину не нашел...см. http://delphimaster.net/view/11-1259759327/

Дополнительно:
По первому пункту пред. поста:
Думаю надо добавить в KOL.PAS функцию GetCountSubMenu, основной код выше.

Фикс для пункта 2 предыдущего поста:
function TMenu.RemoveSubMenu( ItemToRemove: Integer ): PMenu;
{$IFDEF DEBUG_MENU}var OK: Boolean; {$ENDIF}
begin
 Result := Items[ ItemToRemove ];
 if Result = nil then Exit;
 if Result.FParentMenu <> nil then
  begin
   {$IFDEF DEBUG_MENU} OK := {$ENDIF}
   RemoveMenu( Result.FParentMenu.FHandle, Result.FId, MF_BYCOMMAND );
   Result.FParentMenu.FMenuItems.Remove( Result );
  end
 else
  begin
   {$IFDEF DEBUG_MENU} OK := {$ENDIF}
   RemoveMenu( FHandle, Result.FId, MF_BYCOMMAND );
   Self.FMenuItems.Remove( Result );
  end;


 
Vladimir Kladov ©   (2009-12-05 00:08) [2]

Пока скопировал. Динамические меню не юзаю обычно. Разбираться нет времени. Исправление очень похоже на верное. Можно чуть-чуть сэкономить код, выделить переменную под объект PMenu, для которого далее делаются обе операции. Вроде вот этого:

function TMenu.RemoveSubMenu( ItemToRemove: Integer ): PMenu;
{$IFDEF DEBUG_MENU}var OK: Boolean; {$ENDIF}
var M: PMenu;
begin
 Result := Items[ ItemToRemove ];
 if Result = nil then Exit;
 M := Result.FParentMenu;
 if M = nil then M := Self;
 {$IFDEF DEBUG_MENU} OK := {$ENDIF}
 RemoveMenu( M.FHandle, Result.FId, MF_BYCOMMAND );
 M.FMenuItems.Remove( Result );


.........


 
Vladimir Kladov ©   (2009-12-05 08:03) [3]

Только M := @Self, конечно.


 
MTsv DN   (2009-12-07 21:46) [4]

Всем привет...

В продолжение темы. Та же самая функция RemoveSubMenu. Помимо Count"а также не уменьшался FDynamicMenuID. Исправил для своих нужд вот так:
function TMenu.RemoveSubMenu( ItemToRemove: Integer ): PMenu;
{$IFDEF DEBUG_MENU}var OK: Boolean; {$ENDIF}
begin
Result := Items[ ItemToRemove ];
if Result = nil then Exit;
Dec( FDynamicMenuID );
if Result.FParentMenu <> nil then
 begin
  {$IFDEF DEBUG_MENU} OK := {$ENDIF}
  RemoveMenu( Result.FParentMenu.FHandle, Result.FId, MF_BYCOMMAND );
  Result.FParentMenu.FMenuItems.Remove( Result );
 end
else
 begin
  {$IFDEF DEBUG_MENU} OK := {$ENDIF}
  RemoveMenu( FHandle, Result.FId, MF_BYCOMMAND );
  Self.FMenuItems.Remove( Result );
 end;
 {$IFDEF DEBUG_MENU}
 if not OK then
   ShowMessage( "Error removing menu: " + Int2Str( GetLastError ) + " - " +
                SysErrorMessage( GetLastError ) );
 {$ENDIF}
 if Count = 0 then
 begin
   FDynamicMenuID := $1000;
   Result.Free;
   Result := nil;
 end;
 RedrawFormMenuBar;
end;


ВНИМАНИЕ!!! Это НЕ 100% фикс для RemoveSubMenu!!!
Т.к. возможна такая ситуация:
Есть три элемента меню, ID у них соответственно 4096, 4097, 4098, FDynamicMenuID при этом равно 4098, при удалении, например, второго элемента FDynamicMenuID станет 4097, и после добавления 4098, однако ID у элементов станут 4096, 4098, 4098...

З.Ы. Меня этот фикс устраивает, т.к. мне нужно лишь полностью чистить меню...
З.З.Ы. Ошибок при работе с меню уйма (имеется ввиду динамическое использование)


 
Vladimir Kladov ©   (2009-12-07 21:54) [5]

Нельзя уменьшать FdynamicMenuID - это может привести к неожиданным последствиям, если меню несколько, и меняется не последнее. Я вообще не люблю динамические меню из-за этой дурости в их системной организации. Они как бы не предназначены для того, чтобы их все время динамически модифицировать - в конце концов уникальные ID могут кончиться. Или надо таблицу флажков держать - какие ID заняты, какие свободны. Но никто же так не делает.



Страницы: 1 вся ветка

Текущий архив: 2015.09.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.058 c
15-1420308168
Maksim_76
2015-01-03 21:02
2015.09.10
Нет соединения с Интернетом после установки Др.Веб


2-1392391651
dehkanin
2014-02-14 19:27
2015.09.10
Почему выплывает исключение?


15-1418765402
Юрий
2014-12-17 00:30
2015.09.10
С днем рождения ! 17 декабря 2014 среда


15-1411828290
ProstoTak
2014-09-27 18:31
2015.09.10
Интересный трейс


2-1393017198
Novicer
2014-02-22 01:13
2015.09.10
Как правильно установить Firebird?