Перейти к содержанию
Fire Monkey от А до Я
  • 0

ComboBox buged DropDown?


Станислав Менинник

Вопрос

Среда последняя, иОС СДК последний.

На форме один комбо-бокс.

Для чистоты эксперимента, форма с комбо-боксом пересоздается каждый раз, после загрузки в него данных и отображения выпадающего списка.

Загружаю в комбо-бокс объекты (JSONObject) обычным способом.

for FJSONValue in FJSONArray do

Acb.Items.AddObject( (FJSONValue as TJSONObject).GetValue( 'name' ).Value, TObject( FJSONValue.Clone ) );

Так же при очистке, за собой удаляю объекты из комбо-бокса.

  for index := 0 to Acb.Items.Count - 1 do
    if Acb.Items.Objects[index] <> nil then
    begin
      Acb.Items.Objects[index].DisposeOf;
      Acb.Items.Objects[index]:= nil;
    end;
  Acb.Items.Clear;

На 2-3 круге, после загрузки содержимого в комбо-бокс, при вызове DropDown (программно или через GUI тапом/кликом) приложение падает.

Редко получаю ошибку на класс TCustomComboBox  в методе 

function TCustomComboBox.GetItems: TStrings;
begin
  Result := FListBox.Items;
end;

 

Что я делаю не так? Я неправильно чищу память за собой? Неправильно добавляю объект? Почему оно падает при попытке вызвать сам выпадающий список?

На Win10 и андроид работает без проблем.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
12 часов назад, Станислав Менинник сказал:

На 2-3 круге, после загрузки содержимого в комбо-бокс, при вызове DropDown (программно или через GUI тапом/кликом) приложение падает.

не знаю..  ничего не падает..  все работает на windows, android, ios: (скорее всего у вас проблема в DisposeOf и :=nil после этого но этого и не нужно делать)

760099479_.png.387dd8d89f84ec685fdd40a14199fcea.png

Ссылка на комментарий
  • 0

В ходе экспериментов, удалось выяснить, что проблема проявляется только при DropDownKind = native. Если включить кастом, то ошибок нет.

Из чего делаю вывод:

- что-то сломано внутри компонента, когда выпадающий список наполняешь значением + объект, что в дальнейшем приводит к ошибкам с памятью.

- место которое затрагивает баг - передача списка значений для отображения (при DropDownKind = native). (Причем, если вместо DropDown, вывести самому список сообщением, то все элементы есть и ошибок не вызывает) 

 

п.с. Насчет .Free - он ничего не делает при ARC.

И я что-то не встречал упоминаний, что создавая объекты их не нужно удалять за собой. Сами они не удаляются из памяти до смерти приложения.

Изменено пользователем Станислав Менинник
Ссылка на комментарий
  • 1

что будет с объектом A под ARC в этом случае?

1640382877_.png.0ca977b2ba52034b934bc4f23784c3fe.png

та же история и с вашими объектами в списке... DisposeListObjects() в моем примере нужен для обеспечения работы на всех платформах... посмотрите как реализована работа с объектами в TStringList (свойство OwnsObjects)... а конкретно посмотрите реализацию метода TStringList.Clear;

Ссылка на комментарий
  • 0

вы не верите на слово, и это очень ценное качество для программиста... поэтому все надо уметь проверять... попробуйте положить в ваш список объекты такого типа (см. картинку)... и увидите когда разрушаются ваши объекты... (такое переопределение деструктора полезно когда возникают подобные вопросы)

1942212660_.png.4be5264e0a64e78ac811541042a18792.png

Ссылка на комментарий
  • 0
В 15.12.2020 в 11:26, slav_z сказал:

вы не верите на слово, и это очень ценное качество для программиста... поэтому все надо уметь проверять... попробуйте положить в ваш список объекты такого типа (см. картинку)... и увидите когда разрушаются ваши объекты... (такое переопределение деструктора полезно когда возникают подобные вопросы)

1942212660_.png.4be5264e0a64e78ac811541042a18792.png

Интересно. Я думал что нужно использовать DisposeOf , как написано в общей документации и тут на форуме. Оказывается его нельзя или очень вредно использовать!

Нужно просто убивать все ссылки на объект. А free нужен для отладки под Виндой.

Как дойдут руки, проверю на своем проекте.

Изменено пользователем Станислав Менинник
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...