在 TScrollBox 中删除图像后如何重置滚动?

How do I reset the scrolling after removing images in TScrollBox?

我有一个带有 TScrollBox 和一些 TImage 组件的 Delphi 表单,表单的滚​​动框在清空时不会重置...每次在框中放入新图像时它似乎都在增长.

我想在删除图像后,在加载下一个图像之前,将滚动 range/size 重置为滚动框大小。有办法吗?

我试过将滚动条设置为不可见,并在下一个文件加载后将其重新打开,但这似乎不起作用。非常感谢任何帮助。

根本原因:当释放位图时,图像似乎将其左上角移动到图像在 TScrollBox 中所在位置的中心。

我不确定你的东西看起来如何,但我建议你看一下:

  • 使 ScrollBox1.AutoSize := TRUE
  • 检查 Horizontal/Vertical 滚动条的范围 属性。
  • 确保 ScrollBox 上实际上没有任何东西导致这种情况。

或者,您也可以重新创建整个滚动条,但我认为这不是您想要做的。

根本原因:当释放位图时,图像似乎将其 top-left 角移动到图像在 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.