拖动按钮时,delphi是如何创建对象的(300分)

  • 主题发起人 主题发起人 new_aaabb
  • 开始时间 开始时间
N

new_aaabb

Unregistered / Unconfirmed
GUEST, unregistred user!
在FORM 窗体中,拖动一个button类型的窗体时,delphi在哪里创建了这个对象,ob又是如何得到它的属性和方法的,请说明一下原理
 
建议你看一下TComponent和TControl的源码,至于属性一般都会指定默认值的。
 
听课,有时间我也看看VCL源码研究研究
 
我看过一个caption属性是如何在tcontrol中定义的,最后到有关消息机制。
拖动按钮时delphi究竟干了些什么,能将详细一点吗。谢谢
 
建议楼主好好看一下持久化机制,可能与它有关。
 
看一下Dfm文件
 
建议你看源码,基本问题就解决了。
还有Inside VCL的书解释的很详细了。
 
当你拖动一个控件时,D自动再DFM文件中添加一个对象,你拖动控件在FROM上移动时D就改那个TOP和LEFT等属性,属性有所变化他也会做相应的更改,可以看看DFM文件
 
希望大家在多给些帮助,小弟多谢了?
 
看一下,控件中的Paint方法。
 
新手,接分
 
大家多给些中肯的建议,谢谢
 
这个问题很复杂,你可以调试VCL查看里面是如何调用的.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var zhao:TButton;

begin
zhao:=TButton.Create(nil);//此处及以下可分别设置断点,打开VCL开关,Project-//options-compiler-debugging-use debug dcus
zhao.Visible :=true;
zhao.Caption :='hello world';
zhao.Parent :=self;
zhao.Left :=123;
zhao.Top :=122;

end;

end.
 
比如zhao:=TButton.Create(nil)处设置断点,会打开
constructor TButton.Create(AOwner: TComponent);
function _ClassCreate(AClass: TClass; Alloc: Boolean): TObject;
class function TObject.NewInstance: TObject;
class function TObject.InstanceSize: Longint;
function _GetMem(Size: Integer): Pointer;
function SysGetMem(size: Integer): Pointer;
procedure _TryFinallyExit;
constructor TButtonControl.Create(AOwner: TComponent);
constructor TWinControl.Create(AOwner: TComponent);
constructor TControl.Create(AOwner: TComponent);
constructor TComponent.Create(AOwner: TComponent);
procedure TControl.SetWidth(Value: Integer);
SetBounds(FLeft, FTop, Value, FHeight);
Include(FScalingFlags, sfWidth);
procedure TControl.SetHeight(Value: Integer);
begin
SetBounds(FLeft, FTop, FWidth, Value);
Include(FScalingFlags, sfHeight);
end;
procedure TWinControl.SetTabStop(Value: Boolean);
var
Style: Longint;
begin
if FTabStop <> Value then
begin
FTabStop := Value;
if HandleAllocated then
begin
Style := GetWindowLong(FHandle, GWL_STYLE) and not WS_TABSTOP;
if Value then Style := Style or WS_TABSTOP;
SetWindowLong(FHandle, GWL_STYLE, Style);
end;
Perform(CM_TABSTOPCHANGED, 0, 0);
end;
end;
以及其他的一些函数,通过这种调试你或许会发现windows编程的一些秘密,其实也就是那些东西,只要你仔细看看,就会发现,其实还是用了一些窗口编程的函数,比如,
class function TObject.NewInstance: TObject;
class function TObject.InstanceSize: Longint;
function _GetMem(Size: Integer): Pointer;
还有属性的设置,都封装在类中,vcl还用了一些asm汇编函数来实现这个机制,其实这个简单的问题触及到了系统编程,vcl的机制等好多问题,要彻底明白还要你去学习研究其他的东西,
才能搞明白,弄清楚.
 
有点意思,接着说,我会多给分的.
 
当你拖动按钮控件的时候,大概vcl也就作了这些活,还有一个state的属性可以分辨是设计期还是运行期,但是再细的我也正在研究.
 
多人接受答案了。
 
后退
顶部