Господа офицеры, драхуйти ! С наступающим, ибо не всегда помнишь грань между наступающим Новым годом и уже прошедшим, поэтому поздравлю заранее. Имеется код : Код (Text): .draw: call .createstr push eax stdcall StrPtr, eax invoke DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE stdcall StrDel ; From stack .finish: pop eax ebx ecx edx esi edi ret .createstr: mov esi, [.ptrPropInfo] mov eax, [esi+TPropInfo.ofsVal] add eax, [.ptrCtrl] mov ecx, [esi+TPropInfo.Tag] or ecx, ntsZeroTerminated movsx edx, byte [eax] cmp [esi+TPropInfo.type], ptByte je .sign movsx edx, word [eax] cmp [esi+TPropInfo.type], ptWord je .sign mov edx, [eax] jmp .convert .sign: test ecx, ntsUnsigned jz .convert and edx, $ffff cmp [esi+TPropInfo.type], ptWord je .convert and edx, $ff .convert: stdcall NumToStr, edx, 0, 0, ecx mov ecx, [esi+TPropInfo.Tag] and ecx, $ff00 cmp ecx, ntsHex jne @f stdcall StrInsert, eax, cHexPreffix, 0 jmp .doit @@: cmp ecx, ntsBin jne .doit stdcall StrCat, eax, cBinSuffix .doit: ret этот код, по идее конвертит строковую переменную в числовую ... но ... ёк. Где то шота неработает. Причем вставка ret для возврата не работает, я на асме не оч давно кодю, но вот качнул IDE Fresh к Fasm - у, поправил инклюды, чтоб он мог работать в 2-х режимах и теперь пытаюсь исправить косяки с отображением в окне пропертисов, так вот этот код отвечает за корректное отображение высоты, широты, долготы, ну вообчем числового свойства компонента. причем когда код модифицируешь в такой вариант Код (Text): .draw: ;call .createstr push eax stdcall StrPtr, eax invoke DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE stdcall StrDel ; From stack mov esi, [.ptrPropInfo] mov eax, [esi+TPropInfo.ofsVal] add eax, [.ptrCtrl] mov ecx, [esi+TPropInfo.Tag] or ecx, ntsZeroTerminated movsx edx, byte [eax] cmp [esi+TPropInfo.type], ptByte je .sign то в окошке появляется символ код которого введён и корректно сохраняется, прошу помочь разобраться где косяк ? Заранее благодарен .... !
Сабж проще всего реализовать одним вызовом wsprintf: Код (Text): push eax push sFmt ; sFmt db "%d",0 push buf ; buf rb 12 call DWORD [wsprintf] add esp,12 Всё, теперь в buf хранится текстовое представление исходного числа и его можно сразу подавать в DrawText. Кстати, почему топик назван "Конвертирование текста в число"?
Код (Text): proc dwtoa dwValue, lpBuffer push ebx push esi push edi mov eax, [dwValue] mov edi, [lpBuffer] or eax, eax jnz .sign .zero: mov word [edi], 30h jmp .dw2asc .sign: jns .pos mov byte [edi], '-' neg eax inc edi .pos: mov ecx, 429496730 mov esi, edi .whilex: mov ebx, eax mul ecx mov eax, edx lea edx, [edx*4+edx] add edx, edx sub ebx, edx add bl, '0' mov [edi], bl inc edi test eax, eax ja .whilex mov byte [edi], 0 .whiles: cmp esi, edi jae .endws dec edi mov al, [esi] mov ah, [edi] mov [edi], al mov [esi], ah inc esi jmp .whiles .endws: .dw2asc: pop edi pop esi pop ebx ret endp Я использую такой код, где-то на форуме нашёлся. Код (Text): stdcall dwtoa, eax, buf ; buf db 10 dup (?)
Спасиб ... ща проверю. А тема так называеца, потому что ... программа берет с настроек число (допустим размер по вертикали) вставляет в ячейку таблицы, но при отображении выводится символ код которого равен числу - например 61 - А помоему, ну так вот код долженпросто перевести А или типа А;№jj в последовательность чисел, ну или строк, но в числовом формате тоесть не А;№jj а примерно 65535 и все, что бы визуально видеть что в настройках ...
Quantum Я просто мож не правильно поставил задачу. Необходимо конвертировать текст в ASCII код и сохранить код в текстовом формате.
Вообчем работают все примеры, но видно тут дело в другом. Прикреплю сдесь Fresh IDE, мож поможете разобраться. Открываю проект fresh.fpr из папки sourse, захожу в Project manager -> Editor -> Properties editor -> propgrid.asm. Файл окна Properties. Нахожу строку Код (Text): .draw: call .createstr push eax stdcall StrPtr, eax invoke DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE stdcall StrDel ; From stack изменяю её так Код (Text): .draw: ;call .createstr mov esi, [.ptrPropInfo] mov eax, [esi+TPropInfo.ofsVal] add eax, [.ptrCtrl] push eax stdcall StrPtr, eax invoke DrawText, [.lParam], eax, -1, [.ptrRect], DT_TOP or DT_END_ELLIPSIS or DT_LEFT or DT_NOPREFIX or DT_SINGLELINE stdcall StrDel ; From stack компилирую, запускаю File - New - Form и получаю: так вот я понял что в полях отображается содержимое регистров, а функции описаные выше должны изменить их представление в удобочитаемом виде (не важно строка или число) ... Так вот вопрос ... где косяк в коде, после которого не сохраняются данные регистров и стека ? Вот я понять не могу чего ... Хотя до етого додумал благодаря вашим подсказкам.
Все ОК ... господа, братья товарисчи ... По примеру n0name - впихнул данную обработку в процедуру, изменил переменные по совету Quantum и получил желаемое. Огромный Сенкую, респект и челПасибо!!! Можно закрыть топик. ЗЫ ... при необходимости продолжить данную тему (в смысле IDE для FASM, исправленные и доработаные файлы будут приаттачены к топику) Засим прошчаюсь ! ...............................................................(Z)Sn