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 的解决方案。

有两件事可以开始:

  1. 我的表单使用自定义图片作为背景
  2. 面板设置和子组件设置在 运行-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,因为面板包含的第一个组件是用作背景的图像,我不想移动它。