Delphi - 在块溢出时滚动组件组
Delphi - scroll group of components on block overflow
我查看了 GroupBox、Panel、ScrollBox、ListBox 等组件,但没有一个是我要找的。
我想要的是一个具有固定大小、无可见边框、最好是非彩色背景并且允许隐藏包含的组件(如果它们溢出该组件)的组件。
这是我想在我的 Delphi 项目中实现的示例:http://jsfiddle.net/jgems3Ls/1/
Delphi 等级观念:
#non-visible component
#non-visible component
+---------------------+
| visible component |
| visible component | //TOverflowBox(?) borders
| visible component |
+---------------------+
#non-visible component
不幸的是,谷歌搜索没有给我一个关于我该怎么做的提示
找到了使用 TPanel 的解决方案。
有两件事可以开始:
- 我的表单使用自定义图片作为背景
- 面板设置和子组件设置在 运行-time
由于 TPanel 没有透明度 属性,我需要找到一种方法来保留表单图像而不是灰色面板背景。解决方案非常明显:将表单图像作为新组件放入面板中,并具有所需的左侧和顶部偏移,以使其看起来不错。示例代码为:
P := Panel1;
P.Width := 300;
P.Height := 200;
P.Left := 100;
P.Top := 50;
//panel background
I := Image1; //its width and height equal to forms ClientWidth and ClientHeight
I.Left := -100;
I.Top := -50;
下一个问题是面板边框,可以通过 P.BevelOuter := bvNone
轻松删除。
为了使面板组件滚动,我使用了表单 MouseWheel 事件。
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var P: TPanel;
B: boolean;
begin
B := true;
case global_navigation(location, sub_location) of //returns current visible panel
0: B := false; //no visible panels
1: P := Form1.Panel1;
...
end;
//now we need to check if cursor is in panel area
if B then
if (PtInRect(P.ClientRect, P.ScreenToClient(Mouse.CursorPos))) then
if WheelDelta > 0 then //if we scroll up
for i := (P.ControlCount - 1) downto 1 do
P.Controls[i].Top := P.Controls[i].Top + 10
else //if we scroll down
for i := (P.ControlCount - 1) downto 1 do
P.Controls[i].Top := P.Controls[i].Top - 10;
end;
面板组件的循环已完成 downto 1
,而不是 downto 0
,因为面板包含的第一个组件是用作背景的图像,我不想移动它。
我查看了 GroupBox、Panel、ScrollBox、ListBox 等组件,但没有一个是我要找的。
我想要的是一个具有固定大小、无可见边框、最好是非彩色背景并且允许隐藏包含的组件(如果它们溢出该组件)的组件。
这是我想在我的 Delphi 项目中实现的示例:http://jsfiddle.net/jgems3Ls/1/
Delphi 等级观念:
#non-visible component
#non-visible component
+---------------------+
| visible component |
| visible component | //TOverflowBox(?) borders
| visible component |
+---------------------+
#non-visible component
不幸的是,谷歌搜索没有给我一个关于我该怎么做的提示
找到了使用 TPanel 的解决方案。
有两件事可以开始:
- 我的表单使用自定义图片作为背景
- 面板设置和子组件设置在 运行-time
由于 TPanel 没有透明度 属性,我需要找到一种方法来保留表单图像而不是灰色面板背景。解决方案非常明显:将表单图像作为新组件放入面板中,并具有所需的左侧和顶部偏移,以使其看起来不错。示例代码为:
P := Panel1;
P.Width := 300;
P.Height := 200;
P.Left := 100;
P.Top := 50;
//panel background
I := Image1; //its width and height equal to forms ClientWidth and ClientHeight
I.Left := -100;
I.Top := -50;
下一个问题是面板边框,可以通过 P.BevelOuter := bvNone
轻松删除。
为了使面板组件滚动,我使用了表单 MouseWheel 事件。
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var P: TPanel;
B: boolean;
begin
B := true;
case global_navigation(location, sub_location) of //returns current visible panel
0: B := false; //no visible panels
1: P := Form1.Panel1;
...
end;
//now we need to check if cursor is in panel area
if B then
if (PtInRect(P.ClientRect, P.ScreenToClient(Mouse.CursorPos))) then
if WheelDelta > 0 then //if we scroll up
for i := (P.ControlCount - 1) downto 1 do
P.Controls[i].Top := P.Controls[i].Top + 10
else //if we scroll down
for i := (P.ControlCount - 1) downto 1 do
P.Controls[i].Top := P.Controls[i].Top - 10;
end;
面板组件的循环已完成 downto 1
,而不是 downto 0
,因为面板包含的第一个组件是用作背景的图像,我不想移动它。