怎样实现在运行时能够调整控件的大小和位置。
就像在设计时一样,能够在控件的四周出现调整的点。100分,能解决的再给100分。

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2947/2947750.xml?temp=.1719324unit Resizer;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls;const
       GRIDDEFAULT = 4;type
       TResizer = class;
       TMover = class;   TMovingEvent = procedure(Sender: TResizer; var NewLeft, NewTop: integer) of object;
       TSizingEvent = procedure(Sender: TResizer; var NewLeft, NewTop, NewWidth, NewHeight: integer) of object;   TResizer = class(TComponent)
       protected
          FActive     : boolean;
          FControl    : TControl;
          Sizers      : TList;
          GroupMovers : TList;
          FGroup      : TWinControl;
          FGridX      : integer;
          FGridY      : integer;
          FOnSized    : TNotifyEvent;
          FOnSizing   : TSizingEvent;
          FOnMoved    : TNotifyEvent;
          FOnMoving   : TMovingEvent;
          Sizing      : boolean;
          Moving      : boolean;
          OrigSize    : TRect;
          NewSize     : TRect;
          DownX       : integer;
          DownY       : integer;
          FAllowSize  : boolean;
          FAllowMove  : boolean;
          FKeepIn     : boolean;
          FHotTrack   : boolean;
          OneMover    : TMover;
          CurMover    : TMover;
          procedure   Notification(AComponent: TComponent; Operation: TOperation); override;
          procedure   SetActive(b: boolean);
          procedure   SetControl(c: TControl);
          procedure   SetGroup(p: TWinControl);
          procedure   CreateSizers;
          procedure   CheckSizers;
          procedure   ShowSizers;
          procedure   HideSizers;
          procedure   SizerDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   SizerUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   SizerMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
          procedure   MoverDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   MoverUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   MoverMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
          procedure   DrawSizeRect(Rect: TRect);
          procedure   Calc_Size_Rect(SizerNum, dx, dy: integer);
          procedure   DoSizingEvent;
          procedure   Calc_Move_Rect(dx, dy: integer);
          procedure   DoMovingEvent;
          procedure   Constrain_Size;
          procedure   Constrain_Move;
          procedure   MoverKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
          procedure   DoSizeMove(var Key: Word; Shift: TShiftState; dx, dy: integer);
          procedure   CreateGroupMovers;
          procedure   CreateOneMover(m: TMover; c: TControl);
          function    FindMoverByBuddy(c: TControl): TMover;
       public
          constructor Create(AOwner: TComponent); override;
          destructor  Destroy; override;
       published
          property    Active: boolean read FActive write SetActive default True;
          property    ResizeControl: TControl read FControl write SetControl;
          property    ResizeGroup: TWinControl read FGroup write SetGroup;
          property    GridX: integer read FGridX write FGridX default GRIDDEFAULT;
          property    GridY: integer read FGridY write FGridY default GRIDDEFAULT;
          property    OnSized: TNotifyEvent read FOnSized write FOnSized;
          property    OnSizing: TSizingEvent read FOnSizing write FOnSizing;
          property    OnMoved: TNotifyEvent read FOnMoved write FOnMoved;
          property    OnMoving: TMovingEvent read FOnMoving write FOnMoving;
          property    AllowSize: boolean read FAllowSize write FAllowSize default True;
          property    AllowMove: boolean read FAllowMove write FAllowMove default True;
          property    KeepInParent: boolean read FKeepIn write FKeepIn default True;
          property    HotTrack: boolean read FHotTrack write FHotTrack;
       end;   TInvisWin = class(TPanel)     // This could also derive from TPanel
       protected
          procedure WndProc(var Message: TMessage); override;
          procedure CreateParams(var Params: TCreateParams); override;
          procedure WMDLGCode(var Message: TMessage); message WM_GETDLGCODE;
       public
          property  OnKeyDown;
       end;   TMover = class(TInvisWin)
       public
          Buddy     : TControl;
          procedure Show;
       end;
      

  2.   

    procedure Register;implementationconst
       SIZE     = 6;
       HALFSIZE = SIZE div 2;type
       TSizer = class(TPanel)
       end;procedure Register;
    begin
      RegisterComponents('Samples', [TResizer]);
    end;
    // *****************************************************************
    // TInvisWinprocedure TInvisWin.WndProc(var Message: TMessage);
    var
       ps : TPaintStruct;
    begin
       case Message.Msg of
          WM_ERASEBKGND: Message.Result := 1;
          WM_PAINT: begin
             BeginPaint(Handle, ps);
             EndPaint(Handle, ps);
             Message.Result := 1;
          end;
       else
          inherited WndProc(Message);
       end;
    end;procedure TInvisWin.CreateParams(var Params: TCreateParams);
    begin
       inherited;
       Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
    end;procedure TInvisWin.WMDLGCode(var Message: TMessage);
    begin
       Message.Result := DLGC_WANTARROWS or DLGC_WANTALLKEYS;
    end;
    // *****************************************************************
    // TMoverprocedure TMover.Show;
    begin
       Assert(Buddy <> nil);
       BoundsRect := Buddy.BoundsRect;
       Parent     := Buddy.Parent;
       Visible    := True;
       BringToFront;
    end;
    // *****************************************************************
    // TResizerconstructor TResizer.Create(AOwner: TComponent);
    begin
       inherited;
       FActive      := True;
       FKeepIn      := True;
       FGridX       := GRIDDEFAULT;
       FGridY       := GRIDDEFAULT;
       FAllowSize   := True;
       FAllowMove   := True;
       GroupMovers  := TList.Create;
       Sizers       := TList.Create;   OneMover := TMover.Create(Self);
       CreateOneMover(OneMover, nil);   CreateSizers;
    end;destructor TResizer.Destroy;
    begin
       GroupMovers.Free;
       Sizers.Free;
       Sizers := nil;
       inherited;
    end;procedure TResizer.Notification(AComponent: TComponent; Operation: TOperation);
    begin
       inherited;
       if csDestroying in ComponentState then exit;
       if (AComponent = ResizeControl) and (Operation = opRemove) then
          ResizeControl := nil;
    end;procedure TResizer.SetActive(b: boolean);
    begin
       if b<>FActive then begin
          FActive := b;
          CheckSizers;
       end;
    end;procedure TResizer.SetControl(c: TControl);
    begin
       if c <> FControl then begin      if c<>nil then begin
             if ResizeGroup<>nil then begin
                Assert(c.Parent = ResizeGroup, 'ResizeControl is not in ResizeGroup!');
                CurMover := FindMoverByBuddy(c);
             end else begin
                CurMover := OneMover;
                CurMover.Buddy := c;
             end;
             CurMover.Show;
          end;      FControl := c;
          CheckSizers;
       end;
    end;procedure TResizer.SetGroup(p: TWinControl);
    begin
       if p <> FGroup then begin
          FGroup := p;
          CreateGroupMovers;
       end;
    end;procedure TResizer.CreateGroupMovers;
    var
       i : integer;
       m : TMover;
       c : TControl;
    begin
       if csDesigning in ComponentState then exit;   // Clear out the old Movers
       for i := 0 to GroupMovers.Count-1 do
          TObject(GroupMovers[i]).Free;
       GroupMovers.Clear;   if ResizeGroup <> nil then begin
          for i := 0 to ResizeGroup.ControlCount-1 do begin
             c := ResizeGroup.Controls[i];
             if (c is TMover) or (c is TSizer) then continue;         m := TMover.Create(Self);
             CreateOneMover(m, c);
             GroupMovers.Add(m);
             m.Show;
          end;
       end;
    end;procedure TResizer.CreateSizers;
    var
       i : integer;
       p : TSizer;
    begin
       if csDesigning in ComponentState then exit;   for i := 0 to 7 do begin
          p := TSizer.Create(Self);
          Sizers.Add(p);      p.BevelOuter   := bvNone;
          p.Width        := SIZE;
          p.Height       := SIZE;
          p.Color        := clBlack;
          p.Caption      := '';
          p.Tag          := i;
          p.OnMouseDown  := SizerDown;
          p.OnMouseUp    := SizerUp;
          p.OnMouseMove  := SizerMove;
          p.TabStop      := False;      case i of
             0, 7  : p.Cursor := crSizeNWSE;
             2, 5  : p.Cursor := crSizeNESW;
             1, 6  : p.Cursor := crSizeNS;
             3, 4  : p.Cursor := crSizeWE;
          end;
       end;
    end;procedure TResizer.CreateOneMover(m: TMover; c: TControl);
    begin
       m.OnMouseDown := MoverDown;
       m.OnMouseUp   := MoverUp;
       m.OnMouseMove := MoverMove;
       m.TabStop     := True;
       m.OnKeyDown   := MoverKeyDown;
       m.Buddy       := c;
    end;procedure TResizer.CheckSizers;
    begin
       if (ResizeControl<>nil) and Active and (not (csDesigning in ComponentState)) then
          ShowSizers
       else
          HideSizers;
    end;
      

  3.   

    appPath = f_getPath();
    ole_back.move(0,0);
    this.resize(ole_back.width+8,ole_back.height+(this.height - this.workspaceHeight()));
    st_topcover.bringtotop=true;
    st_rightcover.bringtotop=true;
    st_leftcover.bringtotop=true;
    st_bottomcover.bringtotop=true;
    st_topcover.move(tab_1.x,tab_1.y);
    st_topcover.resize(tab_1.width,60);
    st_topcover.text = "";
    st_rightcover.move(tab_1.x+tab_1.width - 10,tab_1.y);
    st_rightcover.resize(20,tab_1.height);
    st_rightcover.text = "";
    st_bottomcover.move(tab_1.x,tab_1.y+tab_1.height - 10);
    st_bottomcover.resize(tab_1.width,20)
    st_bottomcover.text=""
    st_leftcover.move(tab_1.x,tab_1.y);
    st_leftcover.resize(20,tab_1.height);
    st_leftcover.text="";
    navdb.event click();
    //this.title = profilestring(appPath+appProfile,"system","sysname","");
    skin = uo_skinobj;
    skin.of_init( appPath,ProfileString(appPath+appProfile,"system","DefaultUI","skin_mac"));
    skin.of_applyskin( this)
    f_RegionMainWindow(this);post wf_init();pb的代码 道理是一样的 不知对你有无帮助
      

  4.   

    直接写控件的Top,Height,Left,Width属性就可以呀,如:
      aEdit.Left:=100;
      aEdit.Width:=600;
      aEdit.Top:=400;
      aEdit.Height:=200;