1

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

我想在删除图像后,在加载下一个图像之前将滚动范围/大小重置为滚动框大小。有没有办法做到这一点?

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

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

4

2 回答 2

1

根本原因:因此,当释放位图时,图像的左上角似乎移动到了图像在 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.
于 2017-01-24T15:54:29.853 回答
0

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

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

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

于 2017-01-24T08:21:54.433 回答