Delphi - 在块溢出时滚动组件组

时间:2015-05-20 19:22:08

标签: delphi overflow components delphi-7

我查看了像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

不幸的是,谷歌搜索没有给我一个关于我该怎么做的提示

1 个答案:

答案 0 :(得分:0)

使用TPanel找到解决方案。

有两件事要做:

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