Добрый день, у меня есть код: Код (Text): szMenuItem1 db 'Item1',0 szMenuItem2 db 'Item2',0 szMenuItem3 db 'Item3',0 .................................. szMenuItemN db 'ItemN',0 Код (Text): invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEM1, szMenuItem1 invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEM2, szMenuItem2 invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEM3, szMenuItem3 ............................................................................................ invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEMN, szMenuItemN Хочется оформить это циклом. Как лучше сделать инкремент адреса строки текста меню, если длина текста в общем случае различается? Стоит ли звать lstrlen или есть какой-то другой способ?
Код (Text): CreateMenus proc Menu_N:DWORD, IDM_P:DWORD ;Menu_N - число меню ;IDM_P - Указатель на IDM_ITEM1 lea edi, szMenuItem1 mov ecx, Menu_N mov esi, IDM_P MenuCreator: lodsd pushad invoke AppendMenu, [hMenu], MF_STRING, eax, edi popad @@: inc edi cmp byte ptr [edi-1],0 jnz @B loop MenuCreator ret CreateMenus endp Вроде так быстрее ... другого не вижу способа.
Код (Text): szItem1 db 'item 1',0 szItem2 db 'item 2',0 ... pItems dd szItem1, szItem2, 0 ... mov ebx,IDM_ITEM1 mov esi,pItems mov eax,[esi] ; если не хранить кол-во элементов, то делать проверку на 0 @@: invoke AppendMenu,[hMenu],MF_STRING,ebx,eax inc ebx add esi,4 mov eax,[esi] test eax,eax jnz @B
rmn да. Просто человек предложил параллельно использовать указатели на id. Вот я и выдвинул свое мнение, что код действительно короче. Но если количество меню под 1000, мы проигрываем 1000 двордов. Хотя, думаю уже не актуально тут спорить. Предложено 2 рабочих варианта, и тему человек закрыл.
nitrotoluol С какого перепугу? stdcall же. pushad/popad тормозные просто, чтобы их просто так использовать. lodsd сначала грузит значение в eax, а потом увеличивает esi. У меня наоборот. А если элементов под 1000, то система загнётся Но вообще, для коротких строк можно было бы подсчитывать длину, для средних — хранить их длину по типу BSTR. Суть в чём - чтобы лишний раз не высчитывать длину строки. Если она (длина) нам нужна - лучше хранить её, если нет - пусть сама система считает (а хранить только указатели на начала строк). Не актуально, но это не оффтоп, а разминка - надо же отвлекаться иногда на что-то.