Как сбросить прокрутку после удаления изображений в TScrollBox?

У меня есть форма Delphi с TScrollBox и некоторыми компонентами TImage, и полоса прокрутки формы не сбрасывается, когда она опорожняется ... кажется, что она увеличивается каждый раз, когда в поле бросается новое изображение.

Я хотел бы сбросить диапазон / размер прокрутки до размера полосы прокрутки после удаления изображения до загрузки следующего. Есть ли способ сделать это?

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

Основная причина: похоже, что изображение перемещает свой верхний левый угол в центр того места, где изображение было расположено в TScrollBox, когда растровое изображение освобождается.


person Joseph Poirier    schedule 24.01.2017    source источник
comment
Предоставьте минимальный, полный и поддающийся проверке пример. Как выглядит ваш код и DFM? У вас установлен TForm.AutoSize на истину или ложь? TScrollBox.AutoSize? TImage.AutoSize? Похоже, вы на самом деле неправильно изменяете размер ScrollBox, поэтому его область содержимого не сжимается, как вы ожидаете.   -  person Remy Lebeau    schedule 24.01.2017
comment
ScrollBox1.AutoScroll = true; ScrollBox1.AutoSize: = false; image1.AutoSize: = True; Возможно я решил проблему .. Завтра проверю.   -  person Joseph Poirier    schedule 24.01.2017
comment
@JosephPoirier, пожалуйста, отмените последнее изменение и введите отдельный ответ.   -  person LU RD    schedule 24.01.2017
comment
Сделанный. Ответ размещен ниже   -  person Joseph Poirier    schedule 24.01.2017


Ответы (2)


Основная причина: похоже, что изображение перемещает свой верхний левый угол в центр того места, где изображение было расположено в TScrollBox, когда растровое изображение освобождается.

Разрешение: переместите изображение вверх после отключения полос прокрутки и освобождения изображения, но перед загрузкой нового изображения в объект изображения.

Пример кода ..

try
  // Reset existing images
  if assigned(Image1.Picture.Bitmap) then
    Image1.Picture.Bitmap.FreeImage; // using .Free eventually caused memory issues
    // .Free should only be in Finally code section for process objects
    // or on Destroy event for program objects

  Image1.Picture.Graphic := TBitmap.Create;
  Image1.Picture.Bitmap := TBitmap.Create;

  // reset Bitmap
  if assigned(bitmap123) then
    bitmap123.FreeImage;

  bitmap123 := TBitmap.Create;

finally
  ScrollBox1.HorzScrollBar.Visible := false;
  ScrollBox1.VertScrollBar.Visible := false;
  Image1.Top := 0; Image1.Left := 0;
  Image1.Refresh;
  Application.ProcessMessages;

  ScrollBox1.HorzScrollBar.Visible := true;
  ScrollBox1.VertScrollBar.Visible := true;
  ScrollBox1.Refresh;

end;
// now images can be loaded 
// and they will appear in the top-left corner of the scrollbox every time.
person Joseph Poirier    schedule 24.01.2017

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

  • Сделайте ScrollBox1.AutoSize: = TRUE
  • Проверьте свойство Range горизонтальной / вертикальной полосы прокрутки.
  • Убедитесь, что в ScrollBox нет чего-то, что вызывает это.

В качестве альтернативы вы можете просто воссоздать всю полосу прокрутки, но я не думаю, что это то, что вы хотите делать.

person Shaun Roselt    schedule 24.01.2017