Хобрук: Ваш путь к мастерству в программировании

Ошибка Delphi 2010 E2010 Несовместимые типы: Char и AnsiChar

Я загрузил код из Delphi, и когда я компилирую его внутри Delphi 2010, я получаю несовместимые типы E2010: 'Char' и 'AnsiChar'.

Как мне исправить эту ошибку? Помоги пожалуйста

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
var
  nLen: integer;
begin
  Result := StrA;
  if Result <> '' then
  begin
    nLen := MultiByteToWideChar(GetACP(), 1, PChar(@StrA[1]), -1, nil, 0);
    SetLength(Result, nLen - 1);
    if nLen > 1 then
      MultiByteToWideChar(GetACP(), 1, PChar(@StrA[1]), -1, PWideChar(@Result[1]), nLen - 1);
  end;
end;
29.06.2014

  • возможный дубликат Решить несовместимые типы E2010: 'AnsiChar' и 'Char' 29.06.2014
  • Я предполагаю, что код, который вы загрузили, был из версии Delphi до 2010 года. Вы должны знать, что с D2010 Unicode строго соблюдается, что означает PChar, вместо того, чтобы указывать на PAnsiChar, теперь он указывает на PWideChar. Предположительно, ваши случаи PChar должны быть преобразованы как PAnsiChar. 29.06.2014
  • Вы устраняете ошибку, удаляя функцию, потому что она вообще не нужна в вашем Unicode Delphi. Вы знаете, что такое Юникод? Вы знаете о UnicodeString и о том факте, что string теперь является псевдонимом для UnicodeString? Если вы вообще ничего не знаете о Unicode, вам не следует задавать этот вопрос. Прочтите технический документ Марко, и тогда вы будете готовы продолжить. 29.06.2014
  • @David Хороший улов, я даже не обратил внимания на то, что на самом деле делает функция, просто на то, что она использует PChar. 29.06.2014
  • @JerryDodge: Delphi перешла на Unicode в D2009, а не в D2010. 29.06.2014
  • Вы также должны спросить себя, почему у вас есть метод экземпляра класса TFKirimEmail, который выполняет преобразование строк и не использует никаких переменных экземпляра. Другими словами, этот код - не лучшее место для начала. 29.06.2014
  • @Remy Спасибо за это, я забыл, что есть даже Delphi 2009. 29.06.2014

Ответы:


1

В Delphi 2009 и более поздних версиях (P)Char является псевдонимом для (P)WideChar, тогда как в более ранних версиях это был псевдоним для (P)AnsiChar. Вот почему вы получаете ошибку компилятора.

Третий параметр MultiByteToWideChar() ожидает PAnsiChar во всех версиях Delphi. Так что просто замените PChar на PAnsiChar. Что будет работать нормально, учитывая, что StrA это AnsiString, а не String (который является псевдонимом для UnicodeString в D2009 +), поэтому они будут совпадать.

При этом вы должны использовать константу CP_ACP вместо функции GetACP(), удалить избыточное присвоение (и преобразование) Result перед вызовом MultiByteToWideChar(), удалить ненужную индексацию символов и удалить ненужную обработку нулевого терминатора:

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
var
  nLen: integer;
begin
  Result := '';
  nLen := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), nil, 0);
  if nLen > 0 then
  begin
    SetLength(Result, nLen);
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), PWideChar(Result), nLen);
  end;
end;

С учетом сказанного, не используйте WideString в D2009 + для работы без ActiveX. UnicodeString эффективнее.

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): UnicodeString;

Наконец, поскольку вы устанавливаете CodePage на ACP и параметр dwFlags на MB_PRECOMPOSED (что является значением по умолчанию, если не указаны другие флаги), вы можете просто исключить весь этот код и позволить RTL обрабатывать преобразование за вас, поскольку он использует те те же внутренние настройки по умолчанию:

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
begin
  Result := WideString(StrA);
end;

Or:

function TFKirimEmail.ChAnsiToWide(const StrA: RawByteString): UnicodeString;
begin
  Result := UnicodeString(StrA);
end;

В этом случае ваша ChAnsiToWide() функция становится избыточной и может быть полностью исключена.

29.06.2014
Новые материалы

Как ИИ меняет сельское хозяйство
Прочтите Статью Кэтлин Уолч в Forbes о том, как ИИ меняет сельское хозяйство . Сельское хозяйство и земледелие - одна из древнейших и важнейших профессий в мире. Человечество прошло долгий..

Slack: проектирование современных интерфейсов человека и ИИ
Когда Стюарт Баттерфилд выделил Slack из быстро исчезающей онлайн-игры Tiny Speck, его перспективы были в лучшем случае неопределенными. Существовал очевидный спрос на средства связи на рабочем..

HTTP1.1 против HTTP2
Http расшифровывается как HyperText Transfer Protocol, это в основном метод, который компьютеры и серверы используют для запроса и отправки информации. HTTP1.1 - это более старая версия Http, а..

Радость вырезания
Радость фрагментов По какой-то причине, когда я начал программировать в колледже, я активно сопротивлялся целому ряду земных благ, которые сделали бы мою жизнь чуточку удобнее. Я в основном..

Создайте стройный слайдер с нуля без каких-либо внешних инструментов
Слишком долго я полагался на сторонние плагины и инструменты для простых слайдеров. Пока в один прекрасный день в моей крошечной голове не загорелась лампочка, которую я могу сделать..

Буферы протоколов, часть 01: соглашения об именах и файловая организация
Если вам нравится читать статьи на Medium и вы заинтересованы в том, чтобы стать участником, я буду рад поделиться с вами своей реферальной ссылкой!

Наши партнеры
Globex SCI — уникальная система, которая хранит и позволяет использовать большие базы данных, опубликованные в блокчейне. Используя алгоритмы глубокого обучения и ИИ, мы можем прогнозировать..