![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Генерация уникального идентификатора
Дмитрий Баранов © (2003-01-21 13:54:00)Необходимо сгенерировать/получить от системы в run-time уникальный идентификатор, использующийся, например, в ресурсах или ряде API-функций (AppendMenu и т.п.)... т.е., речь идет о, к примеру, идентификаторах проекта в Resource Symbols VC.
Дмитрий Баранов (2003-01-21 17:42:00) [1]> han_malign © (21.01.03 17:38)
Я уже въехал:) но все равно спасибо, беда в том, как бы это все в Васик приделать, не TBits же писАть, лень, сделал проще :/
han_malign (2003-01-21 17:38:00) [2]Нашел я твой TBits, алгоритм элементарный, просто для множеств ограничение 256 значений, а булевсий массив на 65536 элементо слишком большой по этому для экономии используется массив битовых флагов(8192 байт). Дальше ищем первый 0-ой бит, его номер - в ID, а самого взводим в единицу, когда ID отпускаем - сбрасываем ID-ый бит в ноль... Классический алгоритм повторного использования уникальных идентификаторов.
han_malign (2003-01-21 17:29:00) [3]> В TMenuItem это как-то через TBits делается
Не знаю где ты там TBits нашел, а идентификатор не DWORD, а 16-битный(wID).
menus.pas:
procedure TMenuItem.AppendTo(Menu: HMENU; ARightToLeft: Boolean);
.....................................................
MenuItemInfo.cbSize := 44; // Required for Windows 95
MenuItemInfo.fMask := MIIM_CHECKMARKS or MIIM_DATA or MIIM_ID or
MIIM_STATE or MIIM_SUBMENU or MIIM_TYPE;
ParentMenu := GetParentMenu;
// IsOwnerDraw := Assigned(ParentMenu) and ParentMenu.IsOwnerDraw or
IsOwnerDraw := Assigned(ParentMenu) and
(ParentMenu.OwnerDraw or (GetImageList <> nil)) or
Assigned(FBitmap) and not FBitmap.Empty;
MenuItemInfo.fType := IRadios[FRadioItem] or IBreaks[FBreak] or
ISeparators[FCaption = cLineCaption] or IRTL[ARightToLeft] or
IOwnerDraw[IsOwnerDraw];
MenuItemInfo.fState := IChecks[FChecked] or IEnables[FEnabled]
or IDefaults[FDefault];
MenuItemInfo.wID := Command;
MenuItemInfo.hSubMenu := 0;
MenuItemInfo.hbmpChecked := 0;
MenuItemInfo.hbmpUnchecked := 0;
MenuItemInfo.dwTypeData := PChar(Caption);
if GetCount > 0 then MenuItemInfo.hSubMenu := GetHandle;
InsertMenuItem(Menu, DWORD(-1), True, MenuItemInfo);
...............................................
Дмитрий Баранов (2003-01-21 17:13:00) [4]IMHO по организации UI я вопросов не задавал. Пункты динамические, так сказать, создаются - и разрушаются.
Calm (2003-01-21 16:48:00) [5]IMHO создавание туевой хучи Menu Itemов - не лучший способ организации пользовательского интерфейса.
Дмитрий Баранов (2003-01-21 16:31:00) [6]Цель - создание через WinApi туевой хучи Menu Itemов. В AppendMenu надо передать идентификатор создаваемого итема. Обработчик события - в подмененной оконнной процедуре, обрабатывает WM_COMMAND. Итемы же одинаковые, как близнецы, их надо как-то различать. В принципе, их можно идентифицировать еще и по dwItemData(DWORD) или dwTypeData(pchar, caption), а идентификаторы назначить всем пунктам одинаковые; я, наверное, так и сделаю. Всем спасибо :) Хренов VB :(
ZrenBy (2003-01-21 16:31:00) [7]Реккурсия по меню и
wID := GetMenuItemID
EnumChildWindows и
wID := LOWORD(GetWindowLong(hW,GWL_ID));
REA (2003-01-21 16:25:00) [8]Ну как вариант сделать глобальный счетчик в программе. А как узнать какие уже существуют? Если никак то лучше GUID - ему все равно что было и что будет.
Skier (2003-01-21 16:15:00) [9]>Дмитрий Баранов
А что ты хочешь сделать ? Цель какая ?
Дмитрий Баранов (2003-01-21 16:01:00) [10]Как я раньше не догадался? :) Нет, идентификатор должен влезать в DWORD, желательно не превышать 2-3 тысяч и не совпадать с существующими. В TMenuItem это как-то через TBits делается, я никак в механизм не въеду :(
Skier (2003-01-21 14:49:00) [11]GUID ?