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

Вниз

Генерация уникального идентификатора   Найти похожие ветки 

 
Дмитрий Баранов ©   (2003-01-21 13:54) [0]

Необходимо сгенерировать/получить от системы в run-time уникальный идентификатор, использующийся, например, в ресурсах или ряде API-функций (AppendMenu и т.п.)... т.е., речь идет о, к примеру, идентификаторах проекта в Resource Symbols VC.


 
Skier ©   (2003-01-21 14:49) [1]

GUID ?


 
Дмитрий Баранов ©   (2003-01-21 16:01) [2]

Как я раньше не догадался? :) Нет, идентификатор должен влезать в DWORD, желательно не превышать 2-3 тысяч и не совпадать с существующими. В TMenuItem это как-то через TBits делается, я никак в механизм не въеду :(


 
Skier ©   (2003-01-21 16:15) [3]

>Дмитрий Баранов
А что ты хочешь сделать ? Цель какая ?


 
REA ©   (2003-01-21 16:25) [4]

Ну как вариант сделать глобальный счетчик в программе. А как узнать какие уже существуют? Если никак то лучше GUID - ему все равно что было и что будет.


 
Дмитрий Баранов ©   (2003-01-21 16:31) [5]

Цель - создание через WinApi туевой хучи Menu Itemов. В AppendMenu надо передать идентификатор создаваемого итема. Обработчик события - в подмененной оконнной процедуре, обрабатывает WM_COMMAND. Итемы же одинаковые, как близнецы, их надо как-то различать. В принципе, их можно идентифицировать еще и по dwItemData(DWORD) или dwTypeData(pchar, caption), а идентификаторы назначить всем пунктам одинаковые; я, наверное, так и сделаю. Всем спасибо :) Хренов VB :(


 
ZrenBy ©   (2003-01-21 16:31) [6]

Реккурсия по меню и
wID := GetMenuItemID

EnumChildWindows и
wID := LOWORD(GetWindowLong(hW,GWL_ID));


 
Calm ©   (2003-01-21 16:48) [7]

IMHO создавание туевой хучи Menu Itemов - не лучший способ организации пользовательского интерфейса.


 
Дмитрий Баранов ©   (2003-01-21 17:13) [8]

IMHO по организации UI я вопросов не задавал. Пункты динамические, так сказать, создаются - и разрушаются.


 
han_malign ©   (2003-01-21 17:29) [9]

> В 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);
...............................................


 
han_malign ©   (2003-01-21 17:38) [10]

Нашел я твой TBits, алгоритм элементарный, просто для множеств ограничение 256 значений, а булевсий массив на 65536 элементо слишком большой по этому для экономии используется массив битовых флагов(8192 байт). Дальше ищем первый 0-ой бит, его номер - в ID, а самого взводим в единицу, когда ID отпускаем - сбрасываем ID-ый бит в ноль... Классический алгоритм повторного использования уникальных идентификаторов.


 
Дмитрий Баранов ©   (2003-01-21 17:42) [11]

> han_malign © (21.01.03 17:38)
Я уже въехал:) но все равно спасибо, беда в том, как бы это все в Васик приделать, не TBits же писАть, лень, сделал проще :/



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
3-96567
DGrafkin
2003-01-13 00:34
2003.01.30
DBGrid + Query


1-96715
Magic
2003-01-20 14:13
2003.01.30
Проблемы с сохранением рисунков


4-97072
TankMan
2002-12-14 00:31
2003.01.30
Как быстрее всего сравнить содержимое двух TBitMap?


14-97036
polizei
2003-01-14 09:53
2003.01.30
Списки объектов!!!


1-96750
andy11
2003-01-22 14:25
2003.01.30
TDBGrid & MouseWheel