Задать вопрос
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 создать — всё работает. Но если из массива — что-то ему мешает.
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Средний 5 комментариев
Решения вопроса 1
Vapaamies
@Vapaamies
Психанул и снес свои ответы не отмечающим решения…
Плохо начинается уже в реализации getVideos

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

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

Похожие вопросы