Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-96620
mate
2003-01-10 15:38
2003.01.30
Создание БД


8-96897
old_mole
2002-10-14 11:13
2003.01.30
Рисование на FastDIB


1-96803
vil
2003-01-20 13:03
2003.01.30
SetFocus


1-96712
Бук
2003-01-20 12:33
2003.01.30
Splash screen


1-96670
AlexAlex2
2003-01-17 11:29
2003.01.30
Переход VCL->CLX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский