在 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.
我有一个带有 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.