为TEdit个添加OnCreate/OnDestory事件。(50分)

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

kaif1

Unregistered / Unconfirmed
GUEST, unregistred user!

小弟发现,除TxxxForm等含有OnCreate, OnDestroy事件,
其它大多数的VCL控件,比如TEdit没有这样的事件然而这类的
事件有时很有用。

小弟最近模仿TForm类的源码为TEdit添加OnCreate/OnDestory事件,
无奈,在这两个事件中,只要含有文件操作语句,则程序出错,
出错误信息大致为:父窗口丢失等,可能这和父控件已被Free了有关,
究竟此功能可否实现,请高手帮忙,小弟穷技也。

当然,OnCreate/OnDestory事件应可执行文件操作....谢谢

另,小弟最初在此申请了一个帐号为“Kaif”,因忘记密码,无法进入,不知斑竹可否帮忙...
(小弟连当初登记的Email信箱都分不清是那一个了。)

因网络速度慢,经常登陆不上来,不太了解这里的使用规则,请有回答的朋友顺便给俺用
Email回一下,谢谢。 kaif@netease.com
 
多简单的问题啊,自己封组件吧。
 
原来你登记的就是你留的这个email ,自己取密码吧
 
liguang老兄,可否给出代码?俺实在不知如何对控件进行“封”操作...
仅要能实现OnCreate/OnDestory并支持文件操作即可,谢谢。

另,wjiachun老兄,这里是否有离线浏览的工具,如果有该如何获得呢?
 
首先说明一下,我不老。今年才22岁。
这里的电话话了,我现在在网吧上网,所以DEMO SOURCE晚中给出。好吗?谢谢。
 
呵呵,我也不老,才22岁 :-)
你到 cakk.126.com 下载一个离线阅读器和离线数据包吧
 
unit FileEdit;

interface

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

type
TFileEdit = class(TEdit)
private
{ Private declarations }
FFileHandle:integer;
FirstLine:String;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

procedure Register;

implementation

constructor TFileEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FFileHandle:=FileOpen('d:/delphi_internet.htm',OF_SHARE_DENY_WRITE);
SetLength(FirstLine,11);
FileRead(FFileHandle,PChar(FirstLine)^,10);
FileClose(FFileHandle);
Text:=FirstLine;
end;

destructor TFileEdit.Destroy;
begin
inherited Destroy;
end;

procedure Register;
begin
RegisterComponents('Additional', [TFileEdit]);
end;

end.
 
liguang老兄,小弟的问题的重点是在OnDestory中实现文件的I/O操作,
在OnCreate中是可以I/O操作的,但是在OnDestory中,一但加入文件I/O就出错。
老兄不妨设计这样一个控件即知:

TComboBoxEx = class(TComboBox)
和TComboBox不同的是当其在创建时,如果存在C:/1.txt就将C:/1.txt中的
文字行当成Items项目读入,而在Destory中将Items中的项目存入C:/2.txt中。
另:上述功能是直接将TComboBoxEx放在窗体中的默认功能,
用户可在IDE中对TComboBoxEx的OnCreate/OnDestory进行扩展。

估计设计实现OnCreate是可以的,而OnDestory中,一但有文件I/O出现,比如是
Items.SaveToFile('c:/2.txt');即告知Error....

当然,不能改变TForm的源代码。

感谢老兄的关心,但还请一试。。。小弟等老兄的好消息。
 
变通了一下,写出了以下的代码。在Destroy中进行一些操作产生无父窗口的错误究竟是为什么还有待研究。
unit FileEdit;

interface

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

type
TFileEdit = class(TComboBox)
private
{ Private declarations }
procedure MyClose(var Msg:TMessage);message WM_DESTROY;
public
{ Public declarations }
procedure CreateWnd; override;
end;

procedure Register;

implementation

procedure TFileEdit.MyClose(var Msg:TMessage);
begin
Items.SaveToFile('lg.txt');
inherited;
end;

procedure TFileEdit.CreateWnd;
begin
inherited CreateWnd;
Items.LoadFromFile('Light1.pas');
end;

procedure Register;
begin
RegisterComponents('Additional', [TFileEdit]);
end;

end.
 
liguang兄所言极是,但这还不是完全的VCL(请勿怪小弟吹毛求疵)。
因为这样做,每个控件只能为自已提供Create及Destory的扩展,
还不能为控件提供OnCreate/OnDestory功能。因为,OnCreate/OnDestory
事件中不能判断是其它的同级别的VCL(指在同一个窗体中定义的VCL控件)是否
已经接收过WM_DESTROY而失效,这样就难免产生xxx窗口不存在的问题。小弟
特别附加的,不能改变TForm的源码,就是出于这种原因,不能通过更改TForm代码
来实现WM_Destory类的处理,而要完全的VCL方式...

另,小弟已找到一部份的父窗体丢的原回,可能是因为:
执行Items.SaveToFile,首先要获取Items.Count,而获取这个Count的办法是
向控件本身发送CB_GETCOUNT消息,结果是.....这时控件本身的Handle已经为
空了,所以DELPHI提示“没有父窗口”之类的信息。换句话说,要正确地获取
Items的内容,必须在控件本身的Handle还没有被销毁之前。

而如何解决销毁与指令执行的顺序,乃关键所在...
 
多人接受答案了。
 
后退
顶部