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

时间:2017-01-24 03:36:02

标签: delphi resize timage tscrollbox

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

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

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

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

2 个答案:

答案 0 :(得分:0)

我不确定你的情况如何,但我建议你看看这个:

  • 制作ScrollBox1.AutoSize:= TRUE
  • 检查水平/垂直滚动条的Range属性。
  • 确保ScrollBox上实际上没有任何内容导致此问题。

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

答案 1 :(得分:0)

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