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

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

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

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

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

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.

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

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

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

Другие вопросы по тегам