热情软件屋

 

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


编号:QA004526
建立日期: 2002年1月20日 最后修改日期:2002年1月20日
所属类别:

dyonghua:
    操作系统:WIN98
    编程工具:DELPHI5.0
    问题:问题一:
    怎样让用户在运行期实现设计期那样的界面设计方式。用户可以自由移动控件在窗体中的位置并且可以保存下它的设计位置供系统在下次启动时使用?
    问题二:
    有没有什么好的方法在运行期动态添加各种VCL组件,由用户完成系统功能的自定义?

回答:

    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调用的,没有什么好简单的吧,本来就很简单。

此问题由Dragon P.C.回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio