在某form中有若干控件组合,本意想在函数Form_Load()和Form_Resize()中使用move方法使得控件移到合适的位置,这样界面比较美观。但出现如下问题,请教各位高手原因。1、
根据控件间的关系数据进行移动时,运行后的界面总是很混乱,并没有像预想的那样排列整齐。下面是相关代码:      famctl.Move picCtl.Width + 50, tlbCtl.Height, Me.ScaleWidth - picCtl.Width - 50, Me.ScaleHeight - tlbCtl.Height
      tabctl.Move picCtl.Width + 50, tlbCtl.Height, famctl.Width, famctl.Height - 1500
      famcx.Move picCtl.Width + 50, tlbCtl.Height + tabctl.Height, famctl.Width, 1500其中famctl为包含很多控件的Frame;tlbCtl为famctl上方的Toolbar;picCtl为famctl左边的PictureBox;tabctl为famctl内部的TabStrip;
famcx为famctl内部且在tabctl下方的Frame。这三个语句在函数Form_Load()和Form_Resize()中都有2、
上述方式无效后,改为根据固定坐标移动,水平方向显示没问题了,但是垂直方向的显示和1、一样,没有任何变化
     famctl.Move 800, 0, Me.ScaleWidth - picCtl.Width - 50, Me.ScaleHeight - tlbCtl.Height
     tabctl.Move 800, 0, famctl.Width - 50, famctl.Height - 1500
     famcx.Move 800, tabctl.Height, famctl.Width, 1500
如何才能解决此问题,使得界面显示正常?

解决方案 »

  1.   

    Form_Load()和Form_Resize()中一样的话应该没有问题的
    唯一要注意的是最下方的有开始的任务栏占了一定大小,有时和想的不一样,试试隐藏任务栏
      

  2.   

    只移动Frame即可,不用移动Frame中的控件,他们应该跟着移动的。
      

  3.   

    网上有控件跟随窗口变化的代码,,你也可以找下的,,unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    type
      TForm1 = class(TForm)
      private
        procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.WMSysCommand;
    begin
      if (Msg.CmdType = SC_MAXIMIZE) then
         msg.Msg:=WM_NULL;
      inherited;
    end;end.
      

  4.   

    '模块部分
    Public Type ctrObj
      Name As String
      Index As Long
      Parrent As String
      Top As Long
      Left As Long
      Height As Long
      Width As Long
      ScaleHeight As Long
      ScaleWidth As Long
    End TypePrivate FormRecord() As ctrObj
    Private ControlRecord() As ctrObj
    Private bRunning As Boolean
    Private MaxForm As Long
    Private MaxControl As Long
    Private Const WM_NCLBUTTONDOWN = &HA1
    Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function ReleaseCapture Lib "USER32" () As LongFunction ActualPos(plLeft As Long) As Long  If plLeft < 0 Then
        ActualPos = plLeft + 75000
      Else
        ActualPos = plLeft
      End IfEnd FunctionFunction FindForm(pfrmIn As Form) As Long  Dim i As Long
      FindForm = -1  If MaxForm > 0 Then
     
        For i = 0 To (MaxForm - 1)
          If FormRecord(i).Name = pfrmIn.Name Then
            FindForm = i
            Exit Function
          End If
        Next i
      End IfEnd Function
    Function AddForm(pfrmIn As Form) As Long  Dim FormControl As Control
      Dim i As Long
      ReDim Preserve FormRecord(MaxForm + 1)  FormRecord(MaxForm).Name = pfrmIn.Name
      FormRecord(MaxForm).Top = pfrmIn.Top
      FormRecord(MaxForm).Left = pfrmIn.Left
      FormRecord(MaxForm).Height = pfrmIn.Height
      FormRecord(MaxForm).Width = pfrmIn.Width
      FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight
      FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth
      AddForm = MaxForm
      MaxForm = MaxForm + 1  For Each FormControl In pfrmIn
        i = FindControl(FormControl, pfrmIn.Name)
        If i < 0 Then
          i = AddControl(FormControl, pfrmIn.Name)
        End If
      Next FormControlEnd FunctionFunction FindControl(inControl As Control, inName As String) As Long  Dim i As Long
      FindControl = -1  For i = 0 To (MaxControl - 1)
        If ControlRecord(i).Parrent = inName Then
          If ControlRecord(i).Name = inControl.Name Then
            On Error Resume Next
            If ControlRecord(i).Index = inControl.Index Then
              FindControl = i
              Exit Function
            End If
            On Error GoTo 0
          End If
        End If
      Next i
    End FunctionFunction AddControl(inControl As Control, inName As String) As Long  ReDim Preserve ControlRecord(MaxControl + 1)
      On Error Resume Next
      ControlRecord(MaxControl).Name = inControl.Name
      ControlRecord(MaxControl).Index = inControl.Index
      ControlRecord(MaxControl).Parrent = inName  If TypeOf inControl Is Line Then
        ControlRecord(MaxControl).Top = inControl.Y1
        ControlRecord(MaxControl).Left = ActualPos(inControl.X1)
        ControlRecord(MaxControl).Height = inControl.Y2
        ControlRecord(MaxControl).Width = ActualPos(inControl.X2)
      Else
        ControlRecord(MaxControl).Top = inControl.Top
        ControlRecord(MaxControl).Left = ActualPos(inControl.Left)
        ControlRecord(MaxControl).Height = inControl.Height
        ControlRecord(MaxControl).Width = inControl.Width
      End If  inControl.IntegralHeight = False
      On Error GoTo 0
      AddControl = MaxControl
      MaxControl = MaxControl + 1
    End FunctionFunction PerWidth(pfrmIn As Form) As Long  Dim i As Long
      i = FindForm(pfrmIn)  If i < 0 Then
        i = AddForm(pfrmIn)
      End If  PerWidth = (pfrmIn.ScaleWidth * 100) \ FormRecord(i).ScaleWidth
    End FunctionFunction PerHeight(pfrmIn As Form) As Double  Dim i As Long
      i = FindForm(pfrmIn)  If i < 0 Then
        i = AddForm(pfrmIn)
      End If  PerHeight = (pfrmIn.ScaleHeight * 100) \ FormRecord(i).ScaleHeight
    End FunctionPublic Sub ResizeControl(inControl As Control, pfrmIn As Form)  On Error Resume Next
      Dim i As Long
      Dim widthfactor As Single, heightfactor As Single
      Dim minFactor As Single
      Dim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As Long
      yRatio = PerHeight(pfrmIn)
      xRatio = PerWidth(pfrmIn)
      i = FindControl(inControl, pfrmIn.Name)  
      

  5.   

    '接上
    If inControl.Left < 0 Then
        lLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
      Else
        lLeft = CLng((ControlRecord(i).Left * xRatio) \ 100)
      End If  lTop = CLng((ControlRecord(i).Top * yRatio) \ 100)
      lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100)
      lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100)
      If TypeOf inControl Is Line Then    If inControl.X1 < 0 Then
          inControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
        Else
          inControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100)
        End If    inControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100)
        If inControl.X2 < 0 Then
          inControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000)
        Else
          inControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100)
        End If    inControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100)
      Else
        inControl.Move lLeft, lTop, lWidth, lHeight
        inControl.Move lLeft, lTop, lWidth
        inControl.Move lLeft, lTop
      End IfEnd SubPublic Sub ResizeForm(pfrmIn As Form)  Dim FormControl As Control
      Dim isVisible As Boolean
      Dim StartX, StartY, MaxX, MaxY As Long
      Dim bNew As Boolean  If Not bRunning Then
        bRunning = True    If FindForm(pfrmIn) < 0 Then
          bNew = True
        Else
          bNew = False
        End If
        If pfrmIn.Top < 30000 Then
          isVisible = pfrmIn.Visible
          On Error Resume Next
          If Not pfrmIn.MDIChild Then
            On Error GoTo 0
            ' ' pfrmIn.Visible = False
          Else        If bNew Then
              StartY = pfrmIn.Height
              StartX = pfrmIn.Width
              On Error Resume Next
              For Each FormControl In pfrmIn
                If FormControl.Left + FormControl.Width + 200 > MaxX Then
                  MaxX = FormControl.Left + FormControl.Width + 200
                End If            If FormControl.Top + FormControl.Height + 500 > MaxY Then
                  MaxY = FormControl.Top + FormControl.Height + 500
                End If            If FormControl.X1 + 200 > MaxX Then
                  MaxX = FormControl.X1 + 200
                End If            If FormControl.Y1 + 500 > MaxY Then
                  MaxY = FormControl.Y1 + 500
                End If            If FormControl.X2 + 200 > MaxX Then
                  MaxX = FormControl.X2 + 200
                End If            If FormControl.Y2 + 500 > MaxY Then
                  MaxY = FormControl.Y2 + 500
                End If          Next FormControl          On Error GoTo 0
              pfrmIn.Height = MaxY
              pfrmIn.Width = MaxX
            End If        On Error GoTo 0
          End If      For Each FormControl In pfrmIn
            ResizeControl FormControl, pfrmIn
          Next FormControl      On Error Resume Next      If Not pfrmIn.MDIChild Then
            On Error GoTo 0
            pfrmIn.Visible = isVisible
          Else        If bNew Then
            pfrmIn.Height = StartY
            pfrmIn.Width = StartX        For Each FormControl In pfrmIn
              ResizeControl FormControl, pfrmIn
            Next FormControl      End If
        End If
        On Error GoTo 0
      End If
      bRunning = False
    End IfEnd SubPublic Sub SaveFormPosition(pfrmIn As Form)  Dim i As Long  If MaxForm > 0 Then    For i = 0 To (MaxForm - 1)      If FormRecord(i).Name = pfrmIn.Name Then        FormRecord(i).Top = pfrmIn.Top
            FormRecord(i).Left = pfrmIn.Left
            FormRecord(i).Height = pfrmIn.Height
            FormRecord(i).Width = pfrmIn.Width
            Exit Sub
          End If
        Next i    AddForm (pfrmIn)
      End If
    End SubPublic Sub RestoreFormPosition(pfrmIn As Form)  Dim i As Long
      If MaxForm > 0 Then
        For i = 0 To (MaxForm - 1)
          If FormRecord(i).Name = pfrmIn.Name Then
            If FormRecord(i).Top < 0 Then
              pfrmIn.WindowState = 2
            ElseIf FormRecord(i).Top < 30000 Then
              pfrmIn.WindowState = 0
              pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).Height
            Else
              pfrmIn.WindowState = 1
            End If
              Exit Sub
          End If
        Next i
      End If
    End SubPublic Sub Resize_ALL(Form_Name As Form)  Dim OBJ As Object
      For Each OBJ In Form_Name
        ResizeControl OBJ, Form_Name
      Next OBJ
    End SubPublic Sub DragForm(frm As Form)  On Local Error Resume Next
      Call ReleaseCapture
      Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)End Sub
    '***************下面是窗体的调用
    Private Sub Form_Resize()
      Dim H, i As Integer
      On Error Resume Next
      Resize_ALL Me '
    End Sub