Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не выполняется условие 
V
    Опции темы
Ptica_Oz
  Дата 28.6.2010, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Всем здрасти.
Поставила тут на днях Delphi 2010 триальную версию (30 дней). Пробую старый код (Delphi 7) перевести. Почитала про всякие сложности, про Unicode... А застопорилась на бональном If!  smile  Вот кусочек:
Код

function Function(stParam: ansistring; ...): boolean;
begin
  ...
  Result := false;

  if stParam = 'Hello' then begin
  
    ShowMessage(stParam);
    Result := True
    Exit;
  end
  ...


Так вот условие выполняется, но в тело не заходит. Проходила пошагово - не заходит. Просто ставила значение True, тогда работает. Оптимизацию кода отключала и в свойствах проект, и {$O-} писала, не помагло.

Подскажите, пожалуйста, что не так?
PM MAIL   Вверх
AntonN
Дата 28.6.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



Код

'Hello'

в юникоде?


--------------------
user posted image
PM MAIL WWW   Вверх
DarkProg
Дата 28.6.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(Ptica_Oz @  28.6.2010,  15:27 Найти цитируемый пост)
Проходила пошагово - не заходит

Какую кнопку жмакали????


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
~FoX~
Дата 28.6.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 5
Всего: 68



Ptica_Oz, в 2k9 работает... При условии что реально передается 'Hello'
Ну только название функции поменять надобно, 
function Function(stParam: ansistring; ...): boolean;
да ";" поставить...
Result := True

Показывай всю функцию... и вызовы

Это сообщение отредактировал(а) ~FoX~ - 28.6.2010, 20:36


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Ptica_Oz
Дата 29.6.2010, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Цитата(AntonN @  28.6.2010,  18:06 Найти цитируемый пост)
в юникоде?

эм, затрудняюсь ответить... но в Watch List вырожение stParam = 'Hello' определяется как true


Цитата(DarkProg @  28.6.2010,  19:57 Найти цитируемый пост)
Какую кнопку жмакали???? 

и F7 и F8

Цитата(~FoX~ @  28.6.2010,  20:36 Найти цитируемый пост)
Показывай всю функцию... и вызовы

Да нет больше в функции ничего, она только и делает, что слово проверяет, пока... а находится она в dll...

PM MAIL   Вверх
Ptica_Oz
  Дата 30.6.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



загвоздка именно в операции сравнения строк... 
пробовала так:
Код

var
  st : AnsiString;
  i : integer;
begin
  st := 'menu_GetAttrList';
  i := AnsiCompareStr(stFunction, st);
  if i = 0 then begin

    ShowMessage('menu_GetAttrList');
    Result := true; 
    Exit;
  end


i  всегда получает значение -1
как можно сравнить строки типа AnsiString?
PM MAIL   Вверх
Ptica_Oz
Дата 1.7.2010, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



сделала так:
Код

var
  st : AnsiString;
begin
  Result := false;
  st := 'Hello!';
  if (Pos(stFunction, st) = 1) and (Length(stFunction) = Length(st))then begin
    Result := true;
    Exit;
  end


Заработало, но как-то это громоздко. Может кто что умного посоветует...
PM MAIL   Вверх
RomanEEP
Дата 1.7.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



Удивительно! Только сейчас разобрался в чем дело.
Дело в том, что, как известно в строках в дельфи помимо её символов и завершающего нуля в начале хранятся 2 интеджера: счетчик ссылок на данный экземпляр строки и количество символов в ней. Однако с приходом юникода ситуация немного изменилась и добавился еще один интеджер - кодировка строки. Из-за этого нововведения делфи присравнении срок сперва преобразует их в юникод на основании кодировки строки, и только потом сравнивает.  Поэтому внешне одинаковые строки могут оказаться разными из-за несовместимости кодировки.

От этого можно уйти таким образом:
Код

if RawByteString(st) = RawByteString(stFunction) then
  ...

тогда сравнение пройдет по старинке, потому что RawByteString - специальны тип Ansi строки с кодировкой $FFFF, что означает игнорировать кодировку.
PM MAIL   Вверх
Ptica_Oz
  Дата 1.7.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



неа, не работает...
в Watch List также пишет, что RawByteString(st) = RawByteString(stFunction) есть true, но всё равно идёт выполнение веточки else  smile 
может среду (компилятор) как-нибудь настроить надо?

Это сообщение отредактировал(а) Ptica_Oz - 1.7.2010, 15:19
PM MAIL   Вверх
RomanEEP
Дата 2.7.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



Странно... Можешь посмотреть какой реальный код компилируется для такого сравнения (нажать во время отладки этой строчки Ctrl + Alt + C) 
и посмотреть какая конкретно вызывается процедура сравнения (содержит Cmp или Compare и имеет префикс типа _Ansi, _Utf8)
Если немного знаешь асм, то можешь зайти внутрь этой процедуры XXXCmp и посмотреть после какого  je/jne он выпрыгивает из процедуры сравнения (приходит на команду ret).
ЗЫ: И еще посмотри, не подставляет ли компилятор перед функцией сравнения функции конвертации строк.

Это сообщение отредактировал(а) RomanEEP - 2.7.2010, 16:17
PM MAIL   Вверх
Демо
Дата 3.7.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Ptica_Oz, 

Приведи не только функцию, но и её вызов.


--------------------
    
PM MAIL ICQ Skype   Вверх
Keeper89
Дата 3.7.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Демо, +1, вдруг передается юникодная строка.

И есть ли ворнинги компилятора в этих кусках кода?

Это сообщение отредактировал(а) Keeper89 - 3.7.2010, 21:21


--------------------
PM MAIL WWW   Вверх
bems
Дата 3.7.2010, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



вот это вот
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

 function Foo(stParam: ansistring): boolean;
 begin
 Result := false;
 writeln(stParam = 'Hello');
 end;

begin
  try
    Foo('Hello');
    readln
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

выводит True
Или пусть ТС покажет как она получает параметр, или пусть проверит апдейты среды (у меня 4/5)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 3.7.2010, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Ptica_Oz, кидайте сюда весь проект, мы посмотрим. А то так гадать долго можно.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ptica_Oz
Дата 5.7.2010, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Во вложении проект... В общем, это пример плагина для одной системы документооборота. Он был разработан на Delphi7. Сейчас пытаюсь перевести его на Delphi 2010. Изменение кодировок - это первая задача с которой я столкнулась, там ещё много чего менять надо будет...
Комментарии по коду: в MainUnit есть функция PgiCheckMenuItem, она определяет активность пункта меню в зависимости от условий, вот в ней-то и происходит сравнение строк.

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  PgiExample_2010.zip 119,59 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.