Вопрос, поднятый пользователем eivindbakkestuen, касается возможности создания в Python-скрипте объектов, которые являются потомками класса TObject, но не являются TComponent, например, TStringList. Для решения этой задачи можно использовать библиотеку WrapDelphi и связанные с ней классы.
Решение с использованием TPyClassWrapper
Для начала, рассмотрим рекомендуемый способ экспонирования классов в Python через TPyClassWrapper. Если у вас есть класс, например, TMyClass, который вы хотите использовать в Python, можно использовать следующий подход:
В Python-скрипте вы сможете инстанцировать класс так:
from delphi_module import MyClass
obj = MyClass()
Создание TStringList
С TStringList все немного сложнее, так как его базовый класс TStrings уже экспонирован. Для сохранения функциональности TStrings, вам нужно будет создать обертку для TStringList:
type
TStringListWrapper = class(TPyDelphiStrings)
private
function GetDelphiObject: TStringList;
procedure SetDelphiObject(const Value: TStringList);
public
constructor CreateWith(APythonType: TPythonType; args, kwds: PPyObject); overload; override;
class function DelphiObjectClass: TClass; override;
class procedure RegisterMethods(PythonType: TPythonType); override;
class procedure RegisterGetSets(PythonType: TPythonType); override;
property DelphiObject: TStringList read GetDelphiObject write SetDelphiObject;
end;
class function TStringListWrapper.DelphiObjectClass: TClass;
begin
Result := TStringList;
end;
function TStringListWrapper.GetDelphiObject: TStringList;
begin
Result := inherited DelphiObject as TStringList;
end;
class procedure TStringListWrapper.RegisterGetSets(PythonType: TPythonType);
begin
// Здесь можно переопределить регистрацию свойств, если это необходимо
// Обычно не следует вызывать базовый класс
end;
class procedure TStringListWrapper.RegisterMethods(PythonType: TPythonType);
begin
// Здесь можно добавить методы, специфичные для TStringList
// Обычно не следует вызывать базовый класс
end;
procedure TStringListWrapper.SetDelphiObject(const Value: TStringList);
begin
inherited DelphiObject := Value;
end;
constructor TStringListWrapper.CreateWith(APythonType: TPythonType; args, kwds: PPyObject);
begin
Create(APythonType);
DelphiObject := TStringList.Create;
end;
Зарегистрировать обертку для TStringList можно в обработчике события FormCreate:
from delphi_module import StringList
sl = StringList()
sl.Add("abc")
print(sl[0])
Альтернативное решение
Пользователь eivindbakkestuen также предложил альтернативное решение, добавив метод CreateClass, который позволяет создавать объекты не-TComponent на лету в Python-скрипте. Этот метод может быть полезен, если не хочется использовать полную обертку TPyClassWrapper.
Заключение
В данной статье были рассмотрены способы создания объектов Delphi в Python-скриптах, включая использование TPyClassWrapper и создание обертки для TStringList. Это позволяет взаимодействовать с объектами Delphi из Python, сохраняя при этом их функциональность.
Вопрос касается создания в Python-скрипте объектов, наследующих класс TObject, но не являющихся TComponent, с использованием библиотеки WrapDelphi для интеграции с Delphi-объектами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS