我查看了像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
不幸的是,谷歌搜索没有给我一个关于我该怎么做的提示
答案 0 :(得分:0)
使用TPanel找到解决方案。
有两件事要做:
由于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
,因为面板包含的第一个组件是用作背景的图像,我不想移动。