Зациклить создание меню ( например )

Тема в разделе "WASM.BEGINNERS", создана пользователем author, 26 фев 2007.

  1. author

    author New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    4
    Добрый день, у меня есть код:

    Код (Text):
    1. szMenuItem1 db 'Item1',0
    2. szMenuItem2 db 'Item2',0
    3. szMenuItem3 db 'Item3',0
    4. ..................................
    5. szMenuItemN db 'ItemN',0
    Код (Text):
    1. invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEM1, szMenuItem1
    2. invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEM2, szMenuItem2
    3. invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEM3, szMenuItem3
    4. ............................................................................................
    5. invoke AppendMenu, [hMenu], MF_STRING, IDM_ITEMN, szMenuItemN
    Хочется оформить это циклом.
    Как лучше сделать инкремент адреса строки текста меню, если длина текста в общем случае различается?
    Стоит ли звать lstrlen или есть какой-то другой способ?
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Код (Text):
    1. CreateMenus proc Menu_N:DWORD, IDM_P:DWORD
    2. ;Menu_N - число меню
    3. ;IDM_P - Указатель на IDM_ITEM1
    4.  
    5. lea edi, szMenuItem1
    6. mov ecx, Menu_N
    7. mov esi, IDM_P
    8.  
    9. MenuCreator:
    10. lodsd
    11. pushad
    12. invoke AppendMenu, [hMenu], MF_STRING, eax, edi
    13. popad
    14.  
    15.    @@:
    16.    inc edi
    17.    cmp byte ptr [edi-1],0
    18.    jnz @B
    19. loop MenuCreator
    20. ret
    21.  
    22. CreateMenus endp
    Вроде так быстрее ... другого не вижу способа.
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
  4. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    исправил
     
  5. author

    author New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    4
    ок, спасибо,
    значит я не зря боялся, что с lstrlen будет дольше
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1. szItem1 db 'item 1',0
    2. szItem2 db 'item 2',0
    3. ...
    4.  
    5. pItems  dd szItem1, szItem2, 0
    6.  
    7. ...
    8.  
    9. mov   ebx,IDM_ITEM1
    10. mov   esi,pItems
    11.  
    12. mov   eax,[esi]   ; если не хранить кол-во элементов, то делать проверку на 0
    13. @@:
    14. invoke AppendMenu,[hMenu],MF_STRING,ebx,eax
    15. inc   ebx
    16. add   esi,4
    17. mov   eax,[esi]
    18. test  eax,eax
    19. jnz   @B
     
  7. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    IceStudent
    ebx портится после вызова этой АПИ
    esi тоже
     
  8. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    IceStudent
    Код (Text):
    1. add   esi,4
    2. mov   eax,[esi]
    lodsd может?
     
  9. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    pItems dd szItem1, szItem2, 0

    А если элементов под 1000 ?
    для чего лишняя 1000 двордов..? :) :) :)
     
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    nitrotoluol
    Мы про меню говорим?.. :)
     
  11. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    rmn
    да. Просто человек предложил параллельно использовать указатели на id. Вот я и выдвинул свое мнение, что код действительно короче. Но если количество меню под 1000, мы проигрываем 1000 двордов. Хотя, думаю уже не актуально тут спорить. Предложено 2 рабочих варианта, и тему человек закрыл.
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    nitrotoluol
    С какого перепугу? stdcall же. pushad/popad тормозные просто, чтобы их просто так использовать.

    lodsd сначала грузит значение в eax, а потом увеличивает esi. У меня наоборот.

    А если элементов под 1000, то система загнётся :)
    Но вообще, для коротких строк можно было бы подсчитывать длину, для средних — хранить их длину по типу BSTR. Суть в чём - чтобы лишний раз не высчитывать длину строки. Если она (длина) нам нужна - лучше хранить её, если нет - пусть сама система считает (а хранить только указатели на начала строк).

    Не актуально, но это не оффтоп, а разминка - надо же отвлекаться иногда на что-то.
     
  13. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    pItems dd szItem1, szItem2, 0

    Лучше уж хранить длины сторок ,а не указатели, наверное в db уместятся