控件运行时问题!莫明其妙。 请高手指点(50分)

  • 主题发起人 主题发起人 Dark Angel
  • 开始时间 开始时间
D

Dark Angel

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己写了一个控件,继承自 TCustomEdit
TMyEdit=class(TCustomEdit)
public
Edit:Tedit;
end;
在程序中我定义了一个全局变量: var MyEdit:TMyedit;
在Button1click(send:Tobjedt)中有如下代码:
begin
Myedit:=TMyedit.create(self);
Myedit.parent:=self;
Myedit.edit:=edit3; //edit3 是窗体上的Tedit;
//注意,下面的这行代码执行正确
Myedit.edit.text:='Hello';
end;
在Button2click(send:tobject) 中代码是这样的:
begin
//执行到这行的时候 Myedit.edit 居然是 Nil !!!! 实在不解
if assigned(Myedit.edit) then myedit.edit.text:='Changed';
end;
运行时我选单击 Button1 ,一切正常,控件正确创建,并且Edit3的几容也改变了。
但当我再单击 Button2 时, assigned(myedit.edit) 居然是 False, 也就是说
Myedit.edit=Nil 我实在是百思不得其解!
问题就在上面,不知大家可有遇到过?
不知这是否Delphi 6 的 Bug
 
MyEdit真的是全局变量吗?
是不是在Button2click(send:tobject)你定义了一个变量也叫MyEdit呢?
 
是全局变量
这一点上我不会搞混的
 
请注意Edit并未被创建呢,用下面的应该就行
TMyEdit=class(TCustomEdit)
public
Edit:Tedit;
constructor Create(AOwner: TObject); override;
destructor Destroy; override;
end;
...
constructor TMyEdit.Create(AOwner: TObject);
begin
inherited Create(AOwner);

Edit:=TEdit.Create;
Edit.Parent:=Self;
end;

destructor Destroy;
begin
Edit.Parent:=nil;
Edit.Free;

inherited Destroy;
end;
 
Edit3 是窗体上的控件,已经由窗体创建。
我只是将edit:=edit3 没必要自己创建。但还是感谢PurWind 的关注。
 
>> if assigned(Myedit.edit) then myedit.edit.text:='Changed';
改为

if Myedit.edit <> nil then myedit.edit.text:='Changed';
试试
 
Assigned returns False if P is nil;
我运行了你的程序,没有问题,莫非是你的理解有偏差!
 
zhukwen 的我也已经试过了,不行。

另外非常感谢 eliuliu 的关注,问题确实存在。我也百思不得其解。
实在不行我只能重新写过了,再看一下会不会!呜.....
 
程序没有问题。
 
您在TMyEdit定义中只是定义了Edit这样一个Field,但并没有创建,如何Assign(It)?
同意 purwind 看法!
 
实在没办法了,我重写了一遍控件,可这回又出来新的玩艺了!
我把源程序贴上,大家帮我看一下吧!
如果能留下Email,我就把整个程序发过去。

*******************************************************************************
控件程序如下:
unit DataEdits;

interface

uses
Windows, buttons,Messages, SysUtils, Classes, Controls, StdCtrls;

const
tBoxIsString=0;
tBoxIsInt=1;
tBoxIsHasDec=2;
tBoxIsIntStr=3;

tBoxIsMoney=5;
type
TUserDefBtn=class;

TDataEdit = class(TCustomEdit)
private
Fbutton:TUserDefBtn;
FHasButton:boolean;
FStrLen:integer;
FIntNum:Integer;
FDecNum:integer;
procedure MoveButton;
procedure WmGetFocus(var msg:Tmessage);message wm_setFocus;
procedure WMKillFocus(var msg:Tmessage);message WM_KILLFOCUS;
procedure SetHasButton(hasbutton:boolean);
{ Private declarations }
protected
{ Protected declarations }
public
edit:tedit;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
procedure InButtonClick(send:Tobject);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property HasButton:boolean read fhasbutton write sethasbutton;
{ Public declarations }
published
{ Published declarations }
end;

TUserDefBtn=class(Tspeedbutton)
private

protected

public
Edit:TDataEdit;
procedure click;override;
constructor Create(AOwner: TComponent); override;
end;

procedure Register;

implementation
//确定是否有按钮
procedure Tdataedit.SetHasButton(hasbutton:boolean);
begin
if hasbutton=fhasbutton then exit;
fhasbutton:=hasbutton;
if Focused and fhasbutton then fbutton.Visible:=true;
end;
//失去焦点
procedure TDataEdit.WMKillFocus(var msg:Tmessage);
begin
fbutton.Visible:=false;
inherited;
end;
//得到焦点
procedure TDataEdit.WmGetFocus(var msg:tmessage);
begin
if fhasbutton then
fbutton.Visible:=true;
inherited;
end;

//有问题的代码段就在这里了!
//运行能通过,不过结果可就不敢恭维了,绝对会让你大跌眼镜
//愿意是让本身的文本框内容等于某个值,可却让窗口的标题栏变掉了,自己还没变
procedure Tdataedit.inbuttonclick(send:Tobject);
begin
self.Text:='Self text Changed Succeed...';
// if self.edit<>nil then
// self.edit.Text:='Succeed...';
//if assigned(edit) then
// edit.Text:='Succeed...';
end;
//定义按钮的单击事件
procedure TUserDefBtn.click;
begin
Tdataedit(owner).InButtonClick(self);
end;
//文本框移动时设置按钮位置
procedure tdataedit.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited setbounds(aleft,atop,awidth,aheight);
movebutton;
end;
//文本框移动时记按钮跟着移动
procedure tdataedit.MoveButton;
begin
if assigned(fbutton) then
begin
fbutton.Top:=top;
fbutton.Left:=left+width+2;
fbutton.height:=height;
fbutton.Width:=height;
end;
end;
//建立控件
constructor TDataEdit.Create(AOwner:Tcomponent);
begin
inherited create(aowner);
text:='';
//Parent:=twincontrol(aowner);
fbutton:=TUserDefBtn.Create(aowner);
fbutton.Visible:=false;
fhasbutton:=true;
fbutton.Caption:='...';
movebutton;
end;
//创建编辑框随带的快捷按钮
constructor tuserdefbtn.create(aowner:tcomponent);
var
Hour,Min,Sec,Msec:Word;
begin
inherited create(aowner);
parent:=twincontrol(aowner);
Edit:=tDataEdit(aowner);
//给按钮控件随便安一个名字,不然运行时会有错误提示没名字
decodetime(now,hour,min,sec,Msec);
if Name='' then Name:='uTmpBtn'+inttostr(Msec)+inttostr(sec)+inttostr(min);
end;

destructor tdataedit.Destroy;
begin
if assigned(fbutton) then fbutton.Free;
inherited;
end;

procedure Register;
begin
RegisterComponents('Plus', [TDataEdit]);
end;
end.

*******************************************************************************
主程序如下:
unit Unit1;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,dataedits,
Dialogs, StdCtrls, ImgList, DB, ADODB, Grids, DBGrids, Buttons;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ExmEdit:Tdataedit;

implementation

//uses tkmtreeviews;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
exmedit:=tdataedit.Create(self);
exmedit.top:=100;
exmedit.left:=124;
exmedit.Parent:=self;
exmedit.edit:=edit1;
exmedit.edit.Text:='Create Component';
exmedit.SetFocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if assigned(exmedit) then
begin
exmedit.Text:='Button Change';
exmedit.edit.Text:='Setting Change...';
exmedit.SetFocus;
end;
end;

end.
******************************************************************************
大家可以运行一下看。这个问题已经把我搞得半死了!

如留下Email 我会发一份完整的程序过去。希望各路高手多多帮忙了!
 
给我一份看看好吗
littleantjyb@sina.com
 
给我一份看看好吗
liuyj@cbn.com.cn
 
第一个问题不明白,好像不应该会这样,你重启delphi或机器或换台机器再试试。

//有问题的代码段就在这里了!
//运行能通过,不过结果可就不敢恭维了,绝对会让你大跌眼镜
//愿意是让本身的文本框内容等于某个值,可却让窗口的标题栏变掉了,自己还没变

这个问题出在下面这句:

Edit:=tDataEdit(aowner);

因为你程序中是exmedit:=tdataedit.Create(self);,所以Edit就是Form。

我没有调试,只是在网页上看了一下程序,你的程序写得比较乱,一些属性的设置也不太
合理,自己再好好调试一下吧!
 
to dirk:
应该不是Delphi 或机器的问题。我在这台机器上什么程序也都编过了,就没出现
过这种问题!我现在就是搞不清问题的源头在哪里,是什么原因导致这种问题。
程序很乱是因为不停地修修改改,找问题,不好意思!
 
TDataEdit的Create过程中:
...
fbutton:=TUserDefBtn.Create(self);
...

TUserDefBtn的Create过程中:
...
//parent:=twincontrol(aowner);
...
试试看,可以否?
 
fbutton:=TUserDefBtn.Create(aowner);
有问题,应该为
fbutton:=TUserDefBtn.Create(Self);
还应该找个地方设置:
//fbutton.Parent := exmedit.Parent;
应该修改TDATAEDIT property PARENT WRITE
fbutton.Parent := SELF.Parent;
 
To mtj:
先试一下吧!
如果 fbutton.parent:=self 的话就不是我所想要的效果了,它将会显示在Edit 里面,
而不是Edit 的右边
 
请看清楚,我用的是
fbutton.parent:=SELF.Parent;
也就是他们显示在同一个WINCONTROL中
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
543
import
I
I
回复
0
查看
508
import
I
后退
顶部