两个问题,请看看。(20分)

  • 主题发起人 主题发起人 kenmen
  • 开始时间 开始时间
K

kenmen

Unregistered / Unconfirmed
GUEST, unregistred user!
unit CRefF;

interface

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

type
// class reference type (redeclaration)
TControlClass = class of TControl
1)为啥这里是TControl,可以是
其他类吗?
TForm1 = class(TForm)
Panel1: TPanel;
RbtnRadio: TRadioButton;
RbtnButton: TRadioButton;
RbtnEdit: TRadioButton;
procedure RbtnRadioClick(Sender: TObject);
procedure RbtnButtonClick(Sender: TObject);
procedure RbtnEditClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject
Button: TMouseButton;
Shift: TShiftState
X, Y: Integer);
private
ClassRef: TControlClass;
Counter: Integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.RbtnRadioClick(Sender: TObject);
begin
ClassRef := TRadioButton;
end;

procedure TForm1.RbtnButtonClick(Sender: TObject);
begin
ClassRef := TButton;
end;

procedure TForm1.RbtnEditClick(Sender: TObject);
begin
ClassRef := TEdit;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ClassRef := TRadioButton;
end;

procedure TForm1.FormMouseDown(
Sender: TObject
Button: TMouseButton;
Shift: TShiftState
X, Y: Integer);
var
NewCtrl: TControl;
MyName: String;
begin
// create the control
NewCtrl := ClassRef.Create (self);
// hide it temporarily, to avoid flickering
//NewCtrl.Visible := False
2)为啥这句是避免闪烁?
// set parent and position
NewCtrl.Parent := self;
NewCtrl.Left := X;
NewCtrl.Top := Y;
// compute the unique name (and caption)
Inc (Counter);
MyName := ClassRef.ClassName + IntToStr (Counter);
Delete (MyName, 1, 1);
NewCtrl.Name := MyName;
// now show it
//NewCtrl.Visible := True
2)
end;

end.
在此先谢谢了!
 
1、这里的条件是:一定是TRadioButton/TButton/TEdit的共同父类,而且一定是TControl
或其子类,因为只有到了TControl这一代才有Parent、Left、Top等属性。否则后面的对
NewCtrl的多态性操作就会失败。
2、NewCtrl.Parent := self;
NewCtrl.Left := X;
NewCtrl.Top := Y;
这几项操作在Visibale=True时会造成控件的重画,所以会出现闪烁。
不知这样回答满意否?
 
to:douh
啥是控件的重画?sorry!我不大明。。
啥情况下会的重画呢?
 
重画就是重新显示,比如说:NewCtrl.Parent := self;这句改变了控件的位置(这项操作
可能会将它移动到其它窗口上),为了确保正确显示控件,就发出了一个RePaint消息,通
知窗口重画。
 
一般来说,凡是改变影响可见的控件的外观的属性(property)的操作都会造成控件被重画,
如:
Font,Color,Left,Top,Width,Height,Caption(Text)......等等属性。
 
谢谢douh。。。。
我还有个问题想问问你。

type
TDate = class
private
FOnChange: TNotifyEvent
1)这里为啥是TNotifyEvent这个类型?
........
protected
procedure DoChange
virtual;
public
...........
procedure SetValue (y, m, d: Integer)
overload;
procedure SetValue (NewDate: TDateTime)
overload;
property OnChange: TNotifyEvent
read FonChange write FOnChange

end;


procedure TDate.SetValue (y, m, d: Integer);
begin
fDate := EncodeDate (y, m, d);
// fire the event
DoChange
4)这句有啥用?
end;


procedure TDate.DoChange;
begin
if Assigned (FOnChange) then 2)Assigned()是啥?在这里有啥用?
FOnChange (self)
3)这句有啥用?
end;

问完这题就给份了。谢谢!
 
TNotifyEvent是一个过程类型,实际上是个指向一个方法(过程)的指针
Assigned()是检查FOnChange是否已经指向一个过程
FOnChange (self)
是执行这个过程
DoChange是执行下面的procedure TDate.DoChange呀!
 
哪究竟这整句:
procedure TDate.DoChange;
begin
if Assigned (FOnChange) then 2)
FOnChange (self)

end;
有啥用呢?书说是当值改变时,就调用这语句。我真的不明。
我看书说Assigned()是检查对象是否为空,按你说的,那究竟Assigned ()指向哪个过程?
先谢了!
 
不是Assigned()指向哪个过程,而是它的参数FOnChange指向哪里.如果FOnChnage被赋值
则Assigned()为真,反之为假.
 
有点明了,能说说:
procedure TDate.DoChange;
begin
if Assigned (FOnChange) then 2)
FOnChange (self)

end;
这个过程实现了啥目的吗?
谢了!
 
大家能说说吗?
可能你们认为浅,但我真的不明。
请多多指教!
谢了!
 
HELP!!!!!!!!!!!!!
 
procedure TDate.DoChange;
begin
if Assigned (FOnChange) then 2)
FOnChange (self)

end;

就是让使用你这个控件的人能够使用OnChange事件
(触发OnChange事件)
 
多人接受答案了。
 
后退
顶部