就如QQ的控制面版或XP左边的管理栏,不过这种是上下伸缩
我知道这种现在TeThemecontrols,和Raise 里面的groups好象都可以实现
但是,怎样实现左右伸缩呢????

解决方案 »

  1.   

    我终于决定再顶一下了....
    anyone gives me a hint,plz............
      

  2.   

    使用SUIPack控件包,里面有个组件可是实现左右缩进,就像是VS。net里面那种
      

  3.   

    thank u so much,去找
    实现就给分.
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, ValEdit, StdCtrls, ComCtrls, ExtCtrls, Buttons, StrUtils,
      Menus, ToolWin;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Panel_ObjIns: TPanel;
        Panel3: TPanel;
        Timer1: TTimer;
        Panel4: TPanel;
        Panel5: TPanel;
        Timer2: TTimer;
        MainMenu1: TMainMenu;
        Panel_Property: TPanel;
        Panel6: TPanel;
        Panel_ObjTre: TPanel;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        ValueListEditor1: TValueListEditor;
        ListBox1: TListBox;
        procedure FormCreate(Sender: TObject);
        procedure ValueListEditor1MouseMove(Sender: TObject;
          Shift: TShiftState; X, Y: Integer);
        procedure ValueListEditor1MouseDown(Sender: TObject;
          Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        procedure ValueListEditor1MouseUp(Sender: TObject;
          Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Panel1CanResize(Sender: TObject; var NewWidth,
          NewHeight: Integer; var Resize: Boolean);
        procedure Timer1Timer(Sender: TObject);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Panel3Click(Sender: TObject);
        procedure ValueListEditor1GetEditText(Sender: TObject; ACol,
          ARow: Integer; var Value: String);
        procedure FormClick(Sender: TObject);
        procedure ListBox1Click(Sender: TObject);
        procedure Panel6MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Panel_ObjTreClick(Sender: TObject);
        procedure Panel_ObjInsClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      krow,p,t_width,i_resize,j_pos:integer;
      t4_height:integer;  function strIn(sstr,istr:string):boolean;        //判断字符串是否包含在另一个字符串中
      function StrReplace(const S, OldPattern, NewPattern: string): string;    //字符串替换函数implementation{$R *.dfm}function strIn(sstr,istr:string):boolean;
    //判断字符串是否包含在另一个字符串中
    var
      i:integer;
      tstr:string;
    begin
      i:=1;
      while i<=strlen(pChar(sstr)) do
      begin
        tstr:=leftstr(sstr,i);
        if rightstr(tstr,1)=istr then
        begin
          result:=true;
          exit;
        end;
        i:=i+1;
      end;
      result:=false;
    end;function StrReplace(const S, OldPattern, NewPattern: string): string;
    //字符串替换函数
    var
      SearchStr, Patt, NewStr: string;
      Offset: Integer;
    begin    SearchStr := S;
        Patt := OldPattern;  NewStr := S;
      Result := '';
      while SearchStr <> '' do
      begin
        Offset := AnsiPos(Patt, SearchStr);
        if Offset = 0 then
        begin
          Result := Result + NewStr;
          Break;
        end;
        Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
        NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);    SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      i_resize:=0;                //控制是否启动 ValueListEditor1 单元列的大小
      t_width:=189;               //panel1的最大宽度
      p:=0;                       //判断向外弹出还是向内弹出
      j_pos:=0;                   //判断属性栏是否定位
      krow:=0;                    //判断属性栏被选中的格
      t4_height:=63;              //panel4的最大高度  Panel1.Left:=0;             //panel1位置初始化(左边的panel)
      panel1.Width:=0;  Panel4.Top:=self.Height-panel5.Height;    //panel4位置初始化(下边的panel)
      panel4.Height:=panel5.Height;  //Panel_Property.Height:=panel1.Height - Panel_Files.Height - Panel_Source.Height - Panel_ObjIns.Height;
      //Panel_FilesTree.Height:=0;end;procedure TForm1.ValueListEditor1MouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
    //拖动单元列,使之改变大小
    //如果鼠标移到默认单元列的左右各4个象素内改变鼠标指针
      if (x>ValueListEditor1.DefaultColWidth-4)and(x<ValueListEditor1.DefaultColWidth+4) then
      begin
        ValueListEditor1.Cursor:=crHSplit;
      end
      else
      begin
        ValueListEditor1.Cursor:=crDefault;
      end;  //如果可以拖动
      if i_resize=1 then
      begin
        ValueListEditor1.DefaultColWidth:=x;
        if ValueListEditor1.DefaultColWidth<1 then
          ValueListEditor1.DefaultColWidth:=2;
        if ValueListEditor1.DefaultColWidth>ValueListEditor1.Width-2 then
          ValueListEditor1.DefaultColWidth:=ValueListEditor1.Width-4;
      end;end;procedure TForm1.ValueListEditor1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      //将i_resize设置为1 表示可以拖动单元列,并且使listbox1不可见
      if ValueListEditor1.Cursor=crHSplit then
      begin
        //ValueListEditor1.DefaultColWidth:=x-4;
        i_resize:=1;
        listbox1.Visible:=false;
      end;
    end;procedure TForm1.ValueListEditor1MouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      //当松开鼠标右键时设置i_resize为0表示不可拖动
      i_resize:=0;
    end;procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      //鼠标在panel1上时,弹出‘属性’框
      //如果定位值j_pos为1时表示定位
      if j_pos=1 then
        exit;
      if panel1.Width<1 then
      begin
        p:=1;
        timer1.Enabled:=true;
      end;
    end;procedure TForm1.Panel1CanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
    begin
      resize:=true;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if (Panel1.Width<t_width)and(p=1) then
      begin
        panel1.Width:=panel1.Width+20;
        if panel6.Visible then
          panel6.Visible:=false;
      end
      else if (panel1.Width>1)and(p=2) then
      begin
        panel1.Width:=panel1.Width-20;
        if not(panel6.Visible) then
          panel6.Visible:=true;
      end
      else
      begin
        timer1.Enabled:=false;
        p:=0;
        exit;
      end;end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if j_pos=1 then
        exit;
      if panel1.Width>1 then
      begin
        p:=2;
        timer1.Enabled:=true;
      end;
    end;procedure TForm1.Panel3Click(Sender: TObject);
    begin
    //如果单击F变成C表示
      if j_pos=1 then
      begin
        panel3.Caption:='F';
        j_pos:=0;
      end
      else
      begin
        panel3.Caption:='C';
        j_pos:=1;
      end;
    end;procedure TForm1.ValueListEditor1GetEditText(Sender: TObject; ACol,
      ARow: Integer; var Value: String);
    begin
      //获得当前属性框的值给listbox1,如果有多选项
      krow:=arow;
      if strin(value,',') then
      begin
        listbox1.Top:=(ARow + 1) * 18;
        listbox1.Width:= ValueListEditor1.Width-ValueListEditor1.DefaultColWidth;
        listbox1.Left:=ValueListEditor1.DefaultColWidth;
        //listbox1.Items.Text:=value;
        listbox1.Items.Text:=StrReplace(value,',',chr(13)+chr(10));
        listbox1.Visible:=true;
      end
      else
      begin
        listbox1.Visible:=false;
      end;
    end;procedure TForm1.FormClick(Sender: TObject);
    begin
      //panel1失去焦点时listbox1不可见
      listbox1.Visible:=false;
    end;procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      //选择一项值给属性框的相应键
      ValueListEditor1.Values[ValueListEditor1.Keys[krow]]:=listbox1.Items.Strings[listbox1.ItemIndex];
    end;procedure TForm1.Panel6MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      //panel6在panel1外,鼠标移动事件传递
      panel1.OnMouseMove(sender,shift,x,y);
    end;procedure TForm1.Panel_ObjTreClick(Sender: TObject);
    begin
      Panel_Property.Visible:=false;
      panel_objtre.Align:=alTop;
    end;procedure TForm1.Panel_ObjInsClick(Sender: TObject);
    begin
      Panel_Property.Visible:=true;
      panel_objtre.Align:=alBottom;
    end;end.
      

  5.   

    楼主可以留下EMAIL,我这里有上面那个程序可以作为参考。不过不是控件,是自己写的代码,你可以自行封装。
      

  6.   

    procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    ReleaseCapture;    //Windows
    if Move.Checked then     //Move为一个单选框
    TControl(sender).Perform(wm_syscommand,$F012,0)    //Controls   //移动
    else
    if ChangeSize.Checked then  //ChangeSize为一个单选框
    TControl(sender).Perform(wm_syscommand,$F008,0);    //Controls   //改变大小
    end;
      

  7.   

    刚才没看清楚,以为是给按钮或其他控件加改变大小事件呢。
    (上面的是给按钮加改变大小和移动事件)把它的Align属性设置成alLeft 或 alClient 在其一侧加一TSplitter就可以了.