mosesfender
@mosesfender
Меланхолик, параноик, падал с коек

Как объявить результат метода как TArray?

Коллеги, что-то у меня голова разболелась от происходящего, не сочтите за труд, укажите, что я делаю не так.

Есть два интерфейса:
type

  ITubeVideo = interface(IInterface)
    [TubeVideoGUID]
    function getOrigin: string;
    function getMOID: string;
    function getMTitle: string;
    function getMDescription: string;
    property TubeOrigin: string read getOrigin;
    property mOID: string read getMOID;
    property mTitle: string read getMTitle;
    property mDescription: string read getMDescription;
  end;

  ITubeVideoList = interface(IInterface)
    [TubeVideoListGUID]
    function getVideos: TArray<ITubeVideo>;
    property Videos: TArray<ITubeVideo> read getVideos;
  end;

Плохо начинается уже в реализации getVideos:
function TTubeSearch.getVideos: TArray<ITubeVideo>;
begin
  Result := TArray<ITubeVideo>(Fresults);
end;

Дебугер говорит, что это Pointer($...) as ITubeVideoList, начинённый кучкой Pointer($...) as ITubeVideo. При попытке получить интерфейс элемента массива ITubeVideo, вываливается AccessViolation вот тут (модуль System).
6715ffdc9498b418601051.png
Если всё делать без интерфейсов, работает просто замечательно. И даже с интерфейсами, если отдельный объект ITubeVideo создать — всё работает. Но если из массива — что-то ему мешает.
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
Vapaamies
@Vapaamies
Психанул и снес свои ответы козлам, не отмечающим…
Плохо начинается уже в реализации getVideos

Потому что массив объектов ≠ массив интерфейсов. При присвоении одиночного объекта переменной-интерфейсу компилятор вставляет свою магию с QueryInterface и всем остальным, и всё работает прозрачно для программиста. А тут надо создавать всё вручную, если требуется возвращать именно массив интерфейсов. Либо же забить на объекты и в массиве держать сразу интерфейсы, предварительно убедившись, что при уничтожении массива они должным образом финализируются.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы