Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Генерация уникального идентификатора


Дмитрий Баранов ©   (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 ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо