怎样让用户在运行期实现设计期那样的界面设计方式

来源:互联网 发布:苹果6蜂窝移动数据设置 编辑:程序博客网 时间:2024/05/22 00:07

     object frmMain: TfrmMain
     Left = 335
     Top = 199
     BorderStyle = bsSingle
     Caption = 'Form1'
     ClientHeight = 183
     ClientWidth = 320
     Color = clBtnFace
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -10
     Font.Name = 'MS Sans Serif'
     Font.Style = []
     OldCreateOrder = False
     Position = poScreenCenter
     Scaled = False
     PixelsPerInch = 96
     TextHeight = 13
     object GroupBox1: TGroupBox
     Left = 16
     Top = 8
     Width = 73
     Height = 81
     Caption = 'GroupBox1'
     TabOrder = 0
     OnMouseDown = ControlMouseDown
     OnMouseMove = ControlMouseMove
     OnMouseUp = ControlMouseUp
     end
     object CheckBox1: TCheckBox
     Left = 40
     Top = 120
     Width = 97
     Height = 17
     Caption = 'CheckBox1'
     TabOrder = 1
     OnMouseDown = ControlMouseDown
     OnMouseMove = ControlMouseMove
     OnMouseUp = ControlMouseUp
     end
     object Button1: TButton
     Left = 102
     Top = 16
     Width = 75
     Height = 25
     Caption = 'Button1'
     TabOrder = 2
     OnMouseDown = ControlMouseDown
     OnMouseMove = ControlMouseMove
     OnMouseUp = ControlMouseUp
     end
     object Edit1: TEdit
     Left = 136
     Top = 64
     Width = 121
     Height = 21
     TabOrder = 3
     Text = 'Edit1'
     end
     end
    
     ********************************************************
    
    
unit Unit1;
    
    
interface
    
    
uses
    
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    
StdCtrls, Registry, ExtCtrls, ComCtrls;
    
    
type
    
TfrmMain = class(TForm)
    
GroupBox1: TGroupBox;
    
CheckBox1: TCheckBox;
    
Image1: TImage;
    
Button1: TButton;
    
procedure ControlMouseDown(Sender: TObject; Button: TMouseButton;
    
Shift: TShiftState; X, Y: Integer);
    
procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X,
    
Y: Integer);
    
procedure ControlMouseUp(Sender: TObject; Button: TMouseButton;
    
Shift: TShiftState; X, Y: Integer);
    
private
    
downX, downY: Integer;
    
dragging: Boolean;
    
{ Private-Deklarationen }
    
public
    
{ Public-Deklarationen }
    
end;
    
    
var
    
frmMain: TfrmMain;
    
    
implementation
    
    
{$R *.DFM}
    
    
type
    
TMoveCracker = class(TControl);
    
    
procedure TfrmMain.ControlMouseDown(Sender: TObject; Button: TMouseButton;
    
Shift: TShiftState; X, Y: Integer);
    
begin
    
downX := X;
    
downY := Y;
    
dragging := TRue;
    
TMoveCracker(Sender).MouseCapture := True;
    
end;
    
    
procedure TfrmMain.ControlMouseMove(Sender: TObject; Shift: TShiftState; X,
    
Y: Integer);
    
begin
    
if dragging then
    
with Sender as TControl do
    
begin
    
Left := X - downX + Left;
    
Top := Y - downY + Top;
    
end;
    
end;
    
    
procedure TfrmMain.ControlMouseUp(Sender: TObject; Button: TMouseButton;
    
Shift: TShiftState; X, Y: Integer);
    
begin
    
if dragging then
    
begin
    
dragging := False;
    
TMoveCracker(Sender).MouseCapture := False;
    
end;
    
end;
    
    
end.
    

     定义三个方法ControlMouseUp,ControlMouseMove,ControlMouseDown,分别对应桌面所有控件的OnMouseDown,OnMouseMove,OnMouseUp方法即可。
     2. 关于动态控件生成和控件属性、方法赋值的问题。
     这是标准的Delphi RTTI调用,Delphi Inspector自己也是通过RTTI调用的,没有什么好简单的吧,本来就很简单。