При работе с Python-кодом в среде Delphi через компоненты Python4Delphi может возникнуть ситуация, когда необходимо получить ссылку на Python-класс и обращаться к его полям или методам из кода на Object Pascal. В данной статье мы рассмотрим, как решить проблему, возникающую при попытке загрузки объектов Python-классов в Delphi, и приведем пример кода, который позволяет избежать ошибки "No such Interface supported".
Описание проблемы
Разработчик использует Python4Delphi для взаимодействия с Python-кодом из среды Delphi. У него есть Python-файл, в котором объявлен класс Student с полями SName и SAge, а также методами GetName и GetAge. Разработчик хочет получить ссылку на этот класс и обращаться к его полям и методам из своего Delphi-приложения. При попытке выполнить пример кода, найденного на сайте, возникает ошибка, указывающая на отсутствие поддержки интерфейса.
Пример кода, вызывающего ошибку
var
Err : Boolean;
S : TStringList;
MyClass : OLEVariant;
PObj : PPyObject;
begin
// ...
S := TStringList.Create;
try
S.LoadFromFile(ClassFileEdit.Text);
Err := False;
try
PyEngine.ExecStrings(S);
except
on E:Exception do
begin
Err := True;
// Обработка ошибки загрузки
MessageBox(Handle, PChar('Load Error : ' + #13 + E.Message), '', MB_OK+MB_ICONEXCLAMATION);
end;
end;
finally
S.Free;
end;
// ...
Err := False;
try
try
PyEngine.ExecString('ClassVar.Value = Student()');
except
on E:Exception do
begin
Err := True;
// Обработка ошибки создания класса
MessageBox(Handle, PChar('Class Name Error : ' + #13 + E.Message), '', MB_OK+MB_ICONEXCLAMATION);
end;
end;
finally
if not Err then
begin
PObj := ClassDelphiVar.ValueObject;
MyClass := GetAtom(PObj);
GetPythonEngine.Py_XDECREF(PObj);
NameEdit.Text := MyClass.GetName(); // Ошибка возникает на этой строке
AgeEdit.Text := IntToStr(MyClass.GetAge());
end;
end;
end;
Ошибка возникает на строке, где пытаются вызвать метод GetName объекта MyClass. Это происходит потому, что объект MyClass не заполнен экземпляром класса Student.
Решение проблемы
После тщательного поиска разработчик находит решение, которое заключается в следующем:
На форму необходимо поместить компонент TPythonDelphiVar и установить обработчики событий OnExtGetData и OnExtSetData следующим образом:
procedure TMainFrm.ClassDelphiVarExtGetData(Sender: TObject; var Data: PPyObject);
begin
with GetPythonEngine do
begin
Data := FMyPythonObject;
Py_XIncRef(Data); // Это очень важно для управления счетами ссылок Python-объектов
end;
end;
procedure TMainFrm.ClassDelphiVarExtSetData(Sender: TObject; Data: PPyObject);
begin
with GetPythonEngine do
begin
Py_XDecRef(FMyPythonObject); // Это очень важно
FMyPythonObject := Data;
Py_XIncRef(FMyPythonObject); // Это очень важно
end;
end;
Переменная FMyPythonObject должна быть объявлена как PPyObject в публичном разделе класса формы.
После выполнения скрипта в Python-модуле, который создает экземпляр класса, можно получить доступ к атрибутам Python-объекта следующим образом:
var
PObj : PPyObject;
begin
// ...
PObj := GetPythonEngine.PyObject_GetAttrString(FMyPythonObject, PAnsiChar(WideStringToString('AttrName', 0)));
AttrValueEdit.Text := GetPythonEngine.PyObjectAsString(PObj);
// ...
end;
Функция WideStringToString используется для преобразования Unicode-строки в строку, используя указанную кодовую страницу.
Важно: Убедитесь, что правильно управляется счетчик ссылок Python-объектов, чтобы избежать утечек памяти.
Заключение
В данной статье мы рассмотрели проблему, связанную с работой с Python-классами в Delphi через Python4Delphi, и предложили решение, которое позволяет корректно обращаться к полям и методам Python-объектов из кода на Object Pascal. Приведенный пример кода и рекомендации по управлению счетами ссылок помогут разработчикам избежать ошибок при взаимодействии с Python-кодом в среде Delphi.
Пользователь столкнулся с проблемой при попытке использовать Python-класс в среде Delphi через компоненты Python4Delphi и требует помощи в решении ошибки загрузки объектов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.