![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Ptica_Oz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 1.3.2007 Репутация: нет Всего: нет |
Всем здрасти.
Поставила тут на днях Delphi 2010 триальную версию (30 дней). Пробую старый код (Delphi 7) перевести. Почитала про всякие сложности, про Unicode... А застопорилась на бональном If!
Так вот условие выполняется, но в тело не заходит. Проходила пошагово - не заходит. Просто ставила значение True, тогда работает. Оптимизацию кода отключала и в свойствах проект, и {$O-} писала, не помагло. Подскажите, пожалуйста, что не так? |
|||
|
||||
| AntonN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
в юникоде? |
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 4 Всего: 19 |
-------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
| ~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: 5 Всего: 68 |
Ptica_Oz, в 2k9 работает... При условии что реально передается 'Hello'
Ну только название функции поменять надобно, function Function(stParam: ansistring; ...): boolean; да ";" поставить... Result := True Показывай всю функцию... и вызовы Это сообщение отредактировал(а) ~FoX~ - 28.6.2010, 20:36 |
|||
|
||||
| Ptica_Oz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 1.3.2007 Репутация: нет Всего: нет |
эм, затрудняюсь ответить... но в Watch List вырожение stParam = 'Hello' определяется как true и F7 и F8 Да нет больше в функции ничего, она только и делает, что слово проверяет, пока... а находится она в dll... |
|||
|
||||
| Ptica_Oz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 1.3.2007 Репутация: нет Всего: нет |
загвоздка именно в операции сравнения строк...
пробовала так:
i всегда получает значение -1 как можно сравнить строки типа AnsiString? |
|||
|
||||
| Ptica_Oz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 1.3.2007 Репутация: нет Всего: нет |
сделала так:
Заработало, но как-то это громоздко. Может кто что умного посоветует... |
|||
|
||||
| RomanEEP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 1 Всего: 8 |
Удивительно! Только сейчас разобрался в чем дело.
Дело в том, что, как известно в строках в дельфи помимо её символов и завершающего нуля в начале хранятся 2 интеджера: счетчик ссылок на данный экземпляр строки и количество символов в ней. Однако с приходом юникода ситуация немного изменилась и добавился еще один интеджер - кодировка строки. Из-за этого нововведения делфи присравнении срок сперва преобразует их в юникод на основании кодировки строки, и только потом сравнивает. Поэтому внешне одинаковые строки могут оказаться разными из-за несовместимости кодировки. От этого можно уйти таким образом:
тогда сравнение пройдет по старинке, потому что RawByteString - специальны тип Ansi строки с кодировкой $FFFF, что означает игнорировать кодировку. |
|||
|
||||
| Ptica_Oz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 1.3.2007 Репутация: нет Всего: нет |
неа, не работает...
в Watch List также пишет, что RawByteString(st) = RawByteString(stFunction) есть true, но всё равно идёт выполнение веточки else может среду (компилятор) как-нибудь настроить надо? Это сообщение отредактировал(а) Ptica_Oz - 1.7.2010, 15:19 |
|||
|
||||
| RomanEEP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 18.5.2006 Где: Коломна Репутация: 1 Всего: 8 |
Странно... Можешь посмотреть какой реальный код компилируется для такого сравнения (нажать во время отладки этой строчки Ctrl + Alt + C)
и посмотреть какая конкретно вызывается процедура сравнения (содержит Cmp или Compare и имеет префикс типа _Ansi, _Utf8) Если немного знаешь асм, то можешь зайти внутрь этой процедуры XXXCmp и посмотреть после какого je/jne он выпрыгивает из процедуры сравнения (приходит на команду ret). ЗЫ: И еще посмотри, не подставляет ли компилятор перед функцией сравнения функции конвертации строк. Это сообщение отредактировал(а) RomanEEP - 2.7.2010, 16:17 |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 7 Всего: 50 |
Ptica_Oz,
Приведи не только функцию, но и её вызов. -------------------- |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 9 Всего: 58 |
Демо, +1, вдруг передается юникодная строка.
И есть ли ворнинги компилятора в этих кусках кода? Это сообщение отредактировал(а) Keeper89 - 3.7.2010, 21:21 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
вот это вот
выводит True Или пусть ТС покажет как она получает параметр, или пусть проверит апдейты среды (у меня 4/5) -------------------- Обижено школьников: 8 |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Ptica_Oz, кидайте сюда весь проект, мы посмотрим. А то так гадать долго можно.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Ptica_Oz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 1.3.2007 Репутация: нет Всего: нет |
Во вложении проект... В общем, это пример плагина для одной системы документооборота. Он был разработан на Delphi7. Сейчас пытаюсь перевести его на Delphi 2010. Изменение кодировок - это первая задача с которой я столкнулась, там ещё много чего менять надо будет...
Комментарии по коду: в MainUnit есть функция PgiCheckMenuItem, она определяет активность пункта меню в зависимости от условий, вот в ней-то и происходит сравнение строк. Присоединённый файл ( Кол-во скачиваний: 5 )
PgiExample_2010.zip 119,59 Kb |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |