При работе с объектно-ориентированным программированием в Delphi иногда возникают ситуации, когда при определении свойств класса через функции возникают ошибки несовместимости типов. В данной статье мы рассмотрим, как исправить подобную ошибку на примере класса TBizObj, где свойство SiteDUNS9 должно обрабатывать строки с номерами DUNS, дополняя их нулями до 9 символов.
Описание проблемы
Разработчик столкнулся с ошибкой несовместимости типов при определении свойства SiteDUNS9 класса TBizObj в Delphi RIO. Свойство основано на функции FixDunsLength9, которая должна принимать строку и возвращать строку, дополненную нулями до 9 символов. Однако, при попытке использовать функцию в качестве установщика свойства, возникает ошибка.
Пример кода
type
TBizObj = class(TObject)
private
...
fSiteDUNS9: string;
...
function FixDunsLength9(DUNS: string): string;
published
...
property SiteDUNS9: string read fSiteDUNS9 write FixDunsLength9;
end;
implementation
...
function TBizObj.FixDunsLength9(DUNS: string): string;
begin
// Функция дополнения строки нулями до 9 символов
Result := glib_LeftPad(DUNS, 9, '0');
end;
Решение проблемы
Для исправления ошибки необходимо понимать, что установщик свойства (setter) должен быть процедурой, принимающей значение, а не функцией, возвращающей значение. В документации Embarcadero это описано следующим образом:
write fieldOrMethod
В спецификаторе write, если fieldOrMethod является методом, он должен быть процедурой, принимающей один параметр (или const параметр) такого же типа, как и свойство (или более, если это свойство массива или индексированное свойство).
Исправим код, определив процедуру для установщика свойства:
type
TBizObj = class(TObject)
private
...
fSiteDUNS9: string;
procedure SetSiteDUNS9(const Value: string);
published
...
property SiteDUNS9: string read fSiteDUNS9 write SetSiteDUNS9;
end;
implementation
...
procedure TBizObj.SetSiteDUNS9(const Value: string);
begin
// Можно использовать функцию FixDunsLength9 для обработки значения
fSiteDUNS9 := FixDunsLength9(Value);
end;
Альтернативное решение
Также можно оставить функцию FixDunsLength9 для других целей и определить отдельную процедуру SetSiteDUNS9, которая будет использовать FixDunsLength9 для обработки входящего значения:
procedure TBizObj.SetSiteDUNS9(const Value: string);
var
NewValue: string;
begin
NewValue := FixDunsLength9(Value);
if fSiteDUNS9 <> NewValue then
begin
fSiteDUNS9 := NewValue;
// Здесь может быть дополнительная логика
end;
end;
Это решение позволяет сохранить функциональность FixDunsLength9 для других задач и использовать её только в качестве помощника для процедуры установщика свойства.
Заключение
Использование процедуры в качестве установщика свойства позволяет избежать ошибок несовместимости типов и обеспечивает корректную работу свойств класса в Delphi. Следуя рекомендациям документации Embarcadero и примеру выше, разработчики смогут избежать подобных ошибок при определении свойств в своих классах.
Проблема заключается в неправильном использовании функции как установщика свойства в Delphi, из-за чего возникает ошибка несовместимости типов, и требуется заменить функцию на процедуру.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS