Как установить параметр AnsiString в обработчике событий? - PullRequest
2 голосов
/ 03 октября 2019

Я готовлю некоторые части проекта Delphi 2007 для удобной миграции на Delphi XE7.

Я изменил тип параметра обработчика событий с string на AnsiString (этот конкретный обработчик событий должен работать с AnsiString).

Пакет времени выполнения:

  TMyAnsiStringFunction = function(const APar : AnsiString) : AnsiString of object;
  TMyTestComponent = class(TComponent)
  private
    FMyAnsiStringFunction : TMyAnsiStringFunction;
  published
    property MyAnsiStringFunction : TMyAnsiStringFunction read FMyAnsiStringFunction write FMyAnsiStringFunction;
  end;

Пакет времени разработки:

procedure Register;
begin   
  RegisterComponents('MyComponents', [TMyTestComponent]);
end;

Когда я дважды щелкаю MyAnsiStringFunction из Инспектора объектов , онавтоматически создает функцию с параметром string и результирующим типом string вместо AnsiString:

  TForm1 = class(TForm)
    MyTestComponent1: TMyTestComponent;
    function MyTestComponent1MyAnsiStringFunction(const APar: string): string;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Если я вручную изменю параметр и результирующий тип с string на AnsiString,затем я получаю следующую ошибку при сохранении изменений:

enter image description here

Метод MyTestComponent1MyAnsiStringFunction, на который ссылается MyTestComponent1.MyAnsiStringFunction, имеет список несовместимых параметров. Удалить ссылку?

Почему это происходит и есть ли способ заставить тип AnsiString?

1 Ответ

2 голосов
/ 04 октября 2019

Поскольку string является псевдонимом для AnsiString, что касается D2007, функциональных отличий нет, и среда IDE может заменить более часто используемый string вместо фактического используемого типа. Это можно рассматривать как краткий обзор, но эксперимент, который вы проводите, убедителен относительно того, можно ли принудительно ввести тип AnsiString, речь идет не о вашем коде, а о IDE.

Ничего не нужно делать, если толькопакет будет перенесен. Поскольку при компиляции в XE7 среда IDE не может заменить string на AnsiString, поскольку первая является псевдонимом для UnicodeString начиная с D2009.

Однако, если необходимо также перенести потребителей пакета, необходимоиспользовать отдельный тип. Как

type
  MyAnsiString = type AnsiString;

Обратите внимание, что вы не сможете передать один из типов в качестве параметра var для другого ( link ), но это, вероятно, не будет иметь никакого значения при использованиив качестве параметра для обработчика событий.

...