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

Как правильно удалить итемы TListbox?


xenon54

Вопрос

Здравствуйте. Создаю Listboxitem'ы так:

var
  LBItem    : TListBoxItem;
  l1,l2, l3 : TLabel;
  img : TImage;
begin
	LBItem := TListBoxItem.Create(ListBox1);
	LBItem.Parent := ListBox1;
	LBItem.height := 70;
	LBItem.Tag := i;
	LBItem.Margins.Left := 5;
	LBItem.Margins.Right := 5;
	LBItem.ItemData.Accessory := TListboxitemdata.TAccessory.aDetail;


	img := TImage.Create(LBItem);
	img.HitTest := false;
	img.Parent := LBItem;
	img.Width := 50;
	img.Height := 70;
	img.Bitmap.SetSize(50,50);
	img.Position.X := 0;
	img.Position.Y := -1;
	img.Bitmap.LoadFromFile('......jpg');


	l1 := TLabel.Create(LBItem);
	l1.parent := LBItem;
	l1.Position.x := 60;
	l1.Position.y := 0;
	l1.Width := ListBox1.Width - 120;
	l1.AutoSize := false;
	l1.WordWrap := false;
	l1.StyledSettings := [];
	l1.Font.Style := [TFontStyle.fsBold];
	l1.Font.Size := 18;
	l1.Height := 20;
	l1.Text := '...';

	l3 := TLabel.Create(LBItem);
	l3.StyledSettings := [];
	l3.parent := LBItem;
	l3.Width := ListBox1.Width - 120;
	l3.Position.x := 60;
	l3.Position.y := 24;
	l3.Font.Size := 12;
	l3.FontColor := $FF999999;
	l3.AutoSize := false;
	l3.WordWrap := false;
	l3.Height := 20;

	l3.Text := '...';

	l2 := TLabel.Create(LBItem);
	l2.StyledSettings := [];
	l2.parent := LBItem;
	l2.Width := ListBox1.Width - 120;
	l2.Position.x := 60;
	l2.Position.y := 44;
	l2.Font.Size := 12;
	l2.FontColor := $FF999999;
	l2.AutoSize := false;
	l2.WordWrap := false;
	l2.Height := 20;


	l2.Text := '...';
end;

  1. В соседней теме прочитал что если сделать стилизованный итем в котором будут эти лейблы и имейдж, то память при пролистывании будет выгружаться, а для картинок это весьма критично. Правильно ли я это понял? И если это так, то не будет ли тормозить при прокрутке этот листбокс постоянно подгружая и выгружая картинки? И еще вопрос, как правильно потом удалить такой ListBox чтобы освободить память которую скушали объекты внутри стилизованных ListBoxItemo'ов?
  2. При таком создании итемов (как в листинге), как правильно полностью освободить память которую они занимают и удалить объекты? Т.е. я хотел бы чтобы вначале этой процедуры было удаление либо полностью ListBox'a и заного создавать его и заполнять, либо удалить только итемы. 

Пробовал разные походы:

  1. Через Release, но тут получается что удаление сработает с некой задержкой, а мне уже сейчас нужно создавать листбокс и заполнять его вполне тяжелыми итемами (из-за картинок) и получается что на момент конца нового заполнения листбокса, старый еще вполне себе может находиться в памяти. Собственно из-за этого частенько возникает "Memory warning". Все бы хорошо, метод работает и память освобождает, но он мне не подходит потому что память нужно очистить сдесь и  сейчас.
  2. Пробовал через DisposeOf, через раз при заполнении нового листбокса вылетает "Access...". Каюсь, не очень понимаю работу метода DisposeOf. Как я понял метод помечает объект как Disposed и вроде как вызывается деструктор (когда? через сколько? чего ждет?). Но как я прочитал это плохой метод потому что не освобождает память. В этом у меня есть некоторые сомнения, то ли я не так перевел, то ли ... Если есть кто хорошо понимает, объясните пожалуйста на пальцах суть метода DisposeOf.
  3. Пробовал просто занилить Listbox, но это совсем не помагает, ибо RefCount > 1, и соответственно ничего не происходит.
  4. метод Free просто вызывает деструктор, опять же деструктор удалит те самые label'ы и image'ы из listboxitem'ов? В общем с методом Free тоже не получается, срабатывает "Memory warning" ну и в последующем вылет приложения.

Речь идет про IOS.

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

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

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

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