Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Перенос 7-2010 не компилирует сторонние модули


Автор: lollollollol 17.7.2014, 14:24
Здравствуйте. Переношу проект с делфи 7 на делфи 2010 (необходимость в юникоде).

Проблема в том, что не могу скомпилировать поект. 


Цитата

[DCC Error] Pngimage.pas(2827): E2015 Operator not applicable to this operand type



на строке

Код

procedure TChunkIDAT.CopyInterlacedPalette148(const Pass: Byte;
  Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
const
  BitTable: Array[1..8] of Integer = ($1, $3, 0, $F, 0, 0, 0, $FF);
  StartBit: Array[1..8] of Integer = (7 , 0 , 0, 4,  0, 0, 0, 0);
var
  CurBit, Col: Integer;
  Dest2: PChar;
begin
...
      Dest2^ := Dest2^ or (((integer(Src^) shr CurBit) and BitTable[Header.BitDepth]) shl (StartBit[Header.BitDepth] - (Col * Header.BitDepth mod 8)));
...



помогите понять, что за несоответствие типов, и что к чему нужно приводить? Спасибо

Автор: kami 17.7.2014, 16:29
Pchar в D7 = PAnsiChar в D2009up.

Соответственно - явно меняем Pchar на PAnsiChar, Char на AnsiChar...
Больше всего засад будет, если строки используются в качестве бинарного буфера...

Pngimage.pas - это чей модуль? В D2010 есть такой стандартный, может можно его использовать?

Автор: lollollollol 17.7.2014, 17:28
Цитата

Pngimage.pas - это чей модуль? В D2010 есть такой стандартный, может можно его использовать?


незнаю, я при переносе проекта все .pas файлы в lib папку закинул от делфи7, без замены. Раз он не родной, значит его там небыло

Автор: lollollollol 17.7.2014, 21:39
Ужас, не могу понять эту делфи 2010 вообще! раньше в семёрке я просто зажимал control, кликал по нужному uses и любовался его кодом. А тут неработает. и слева в списке модулей пытался кликать, нифига. чтото я торможу, подскажите как открыть код uses'a для просмотра/редактирования?

Автор: kami 18.7.2014, 08:33
Цитата(lollollollol @  17.7.2014,  21:39 Найти цитируемый пост)
А тут неработает. 

Работает. И по клику, и через Ctrl +Enter. Пути пропиши правильно.

Цитата(lollollollol @  17.7.2014,  17:28 Найти цитируемый пост)
 Раз он не родной, значит его там небыло

$(BDS)\SOURCE\WIN32\VCL\pngimage.pas
Должен быть.

Добавлено через 2 минуты и 18 секунд
Цитата(kami @  18.7.2014,  08:33 Найти цитируемый пост)
Пути пропиши правильно.

Имеется ввиду - пути в Tools - Options - Library Win32 - Browsing path

Автор: lollollollol 18.7.2014, 10:55
Спасибо, с этим разобрался, проект скомпилировался, проблемы начались дальше.

сразу при старте приложения высыпаются ошибки, первая:

вопрос:

есть переменная

Код

  ReadFolderName:string;

если в неё записывается строка типа AnsiString, а потом передаётся в функцию которая хочет получить AnsiString, функция получит верные данные или ломаные? и как быть в таком случае? 


Автор: kami 18.7.2014, 12:10
Цитата(lollollollol @  18.7.2014,  10:55 Найти цитируемый пост)
если в неё записывается строка типа AnsiString, а потом передаётся в функцию которая хочет получить AnsiString, функция получит верные данные или ломаные? и как быть в таком случае? 

Увидишь преобразование строк в действии.
Вообще, компилятор должен выдавать хинты (или варнинги - не помню). Корректная перегодировка (особенно - UnicodeString => AnsiString) гарантирована только для английских символов, цифр и знаков препинания. С русскими и остальными может быть пичаль-бида.

Как быть?
Если функция твоя - переделывай всё под string.
Если чужое - смотри, сможешь ли справиться, и если нет - ищи альтернативы. Возможно, в интернете уже есть адаптированное под юникод решение.

Особенно советую обратить внимание на конструкции, содержащие Move, Copy (включая Stream.Write/Read), преобразования в PChar и т.п.
Емнип, у Embarcadero целый раздел был по миграции на юникод, там всё отлично расписано.

Добавлено через 3 минуты и 52 секунды
Цитата(kami @  18.7.2014,  12:10 Найти цитируемый пост)
 если нет - ищи альтернативы.

Поверь на слово человеку, который несколько лет назад переводил большой проект с D7 на D2010 - гораздо проще вместо старого "чужого" модуля (пусть и отлично работавшего под D7) найти с похожим функционалом, но под юникод, чем копаться в куче малопонятного кода, заточенного под особенности AnsiString и ловить баги/глюки на ровном месте.
Да, потребуется доработка/некоторое изменение своего кода. Но в конечном итоге это выйдет дешевле.

Автор: Akella 20.7.2014, 14:07
Цитата(kami @  17.7.2014,  16:29 Найти цитируемый пост)
Pngimage.pas - это чей модуль? В D2010 есть такой стандартный, может можно его использовать?


Да, скорее всего, что можно будет использовать.
Единственное, что у себя в программе придётся немного поменять типы данных, объектов и переменных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)