Кардинальная ошибка несовместимого типа DelphiXE2

#delphi #delphi-xe2

#delphi #delphi-xe2

Вопрос:

Я действительно не понимаю эту ошибку «несовместимые типы» (Delphi XE2)

 function TWaveBase.GetHandle: THandle;
begin
  if HandleNeeded then begin
    if HandleAllocated then
      CloseHandle;
    CreateHandle(False);
  end;
  FHandleNeeded:=False;
  Result:=FHandle;
end;
  

[…]

property Handle:Cardinal read GetHandle; -> ошибка здесь

Ответ №1:

THandle это тип, объявленный на основе Cardinal в Delphi XE. (Из-за 64-разрядности и кроссплатформенности в XE2 это определено как NativeUInt ). Это новый тип.

Если ваш GetHandle метод получения возвращает a THandle , ваше свойство также должно быть объявлено как THandle . Измените это, и все должно работать нормально.

Комментарии:

1. Итак (связано с DelphiXE2), я внес изменение для NativeUInt. Теперь у меня этот тупик, другая несовместимая ошибка типов Integer и AntiveInt, связанная с MMSystem WaveInClose. -> Метод WaveInClose возвращает system.cardinal

2. @volvox: Это вызвано ошибкой того же типа, поэтому исправление будет таким же — измените один из типов, чтобы он был совместим с другим. По возможности используйте типы XE2, потому что они будут работать в XPlatform и в 64-разрядной версии, как я упоминал выше. (И мой ответ заключался в том, чтобы внести изменения в THandle , а не NativeUInt , если вы прочтете это более внимательно; это обеспечивает совместимость как в обратном направлении, так и в будущем.)

3. Спасибо — я наконец-то запустил проект под управлением Delphi 2007 — слишком много библиотек не обновлены, чтобы иметь с ними дело.

4. я чувствую твою боль. я конвертирую ~ 100 Мб исходных текстов 2006-> XE2 🙂 И некоторые компоненты, такие как ToolBar97 и pascal HTMLViewer, давно мертвы.