Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизГенерация уникального идентификатора Найти похожие ветки
← →
Дмитрий Баранов (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c