Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с Python-классами в Delphi через Python4Delphi: обход ошибки загрузки объектов

Delphi , Компоненты и Классы , Классы

При работе с 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.

Решение проблемы

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

  1. На форму необходимо поместить компонент 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;
  1. Переменная FMyPythonObject должна быть объявлена как PPyObject в публичном разделе класса формы.

  2. После выполнения скрипта в Python-модуле, который создает экземпляр класса, можно получить доступ к атрибутам Python-объекта следующим образом:

var
 PObj : PPyObject;
begin
 // ...
 PObj := GetPythonEngine.PyObject_GetAttrString(FMyPythonObject, PAnsiChar(WideStringToString('AttrName', 0)));
 AttrValueEdit.Text := GetPythonEngine.PyObjectAsString(PObj);
 // ...
end;
  1. Функция 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Классы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 20:51:03/0.0044829845428467/1