Модераторы: 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   Вверх
RomanEEP
Дата 5.7.2010, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Скомпилил dll заменив
if (Pos(stFunction, st) = 1) and (Length(stFunction) = Length(st)) then
на
 if st = stFunction then
Создал тестовый проект:
Код

program RunTest;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  PIClasses;

function PgiCheckMenuItem(stFunction: ansistring; RunMethod: TRunMethod;
  ParentVersion, ChildVersion: TVersion;
  stLinkName, DataBaseName, stCheckOut: ansistring): boolean; stdcall;
    external 'PgiExample.pgi';

begin
    PgiCheckMenuItem('menu_GetAttrList', nil, nil, nil, '', '', '')
end.

Усё работает идеально, условие проходит, что надо выполняет!

ЗЫ: Все компилил под D2010
ЗЗЫ: Для сравнения компилятор подставляет LStrEqual

Это сообщение отредактировал(а) RomanEEP - 5.7.2010, 08:47
PM MAIL   Вверх
Ptica_Oz
Дата 5.7.2010, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Во вложении скриншот пошаговой отладки.

Цитата(bems @  3.7.2010,  21:30 Найти цитируемый пост)
апдейты среды (у меня 4/5)

у меня тоже

может настройки компилятора изменить?...


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ___.PNG 109,69 Kb
PM MAIL   Вверх
bems
Дата 5.7.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как это вы передаете AnsiString в dll без ShareMem?
А вызывающий код в чем склмпилирован? Не в доюникодной версии ли?

Это сообщение отредактировал(а) bems - 5.7.2010, 14:43


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


Эксперт
***


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

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



PgiCheckMenuItem - это не Лоцман-ли? Он же в ANSI версии Delphi собран. Забудьте про Unicode и Delphi 2009/2010 - там такой кривой интерфейс с плагинами, что по-другому никак.

Добавлено через 2 минуты и 37 секунд
P.S. Во-первых, внутреннее устройство AnsiString в D2009/2010 <> устройства AnsiString в D2007 и ниже. Во-вторых, там исключения передаются через границы модулей - т.е. ваш код в D2009/2010 ловит исключение-объект из D2007 или ниже - это не будет работать, ибо структура объектов у этих Delphi разная.

Добавлено через 3 минуты и 28 секунд
P.P.S. Вот, что получается, когда экономят деньги на нормальных программистах и сажают студентов писать софт.


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


Шустрый
*


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

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



Цитата(bems @  5.7.2010,  14:41 Найти цитируемый пост)
А вызывающий код в чем склмпилирован? Не в доюникодной версии ли?

угу, кажется в Delphi 7

Цитата(CodeMonkey @  5.7.2010,  15:00 Найти цитируемый пост)
PgiCheckMenuItem - это не Лоцман-ли?

он самый... через COM интерфейс на Delphi с ним не доводилось работать?
PM MAIL   Вверх
CodeMonkey
Дата 5.7.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ptica_Oz @  5.7.2010,  17:17 Найти цитируемый пост)
через COM интерфейс на Delphi с ним не доводилось работать? 

А в чём вопрос-то?

Добавлено через 8 минут и 10 секунд
P.S. А это случайно я не с вами пересекался на DelphiKingdom по вопросу Компаса и печати на виртуальном принтере? smile


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


Шустрый
*


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

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



сделала так:

Код

function Function(AFunction: PAnsiChar; ...): Boolean;
var
    LFuncName: String;
begin
        ...
        LFuncName := String(AFunction);
        if LFuncName = 'ProjectList' then
             ...


Это сообщение отредактировал(а) Ptica_Oz - 16.7.2010, 15:10
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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