怎样为一全局变量写一个OnChange事件?

yanglei8001 2010-07-02 03:17:26
程序定义了一个全局变量,当值发生变化的时候响应一些事件。因此想自己给这个变量写一个OnChange事件,请问应该如何自定义这么一个事件?有例子参考最好。谢谢!
...全文
295 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanglei8001 2010-07-06
  • 打赏
  • 举报
回复
非常感谢各位帮助!只恨囊中羞涩,不能一一给分啊,望见谅!
另外还有一问题没有解决,请各位兄弟帮忙看看。
http://topic.csdn.net/u/20100610/19/5bd8ad0f-69af-441a-97fa-5574e3fcaa2b.html
LAZIJIDING 2010-07-05
  • 打赏
  • 举报
回复
顶。。。
musa2008 2010-07-02
  • 打赏
  • 举报
回复

lZ好好想想吧。
ecjtu5208 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luo_342815 的回复:]
3楼全局变量在哪里??
[/Quote]
我想了想,貌似3楼的回答有点不对。他是通过Edit1change来触发的On_change事件,他把Edit1做为要进行操作的全局变量。
可是,关键的是,如果你用Edit1change来触发另一个事件,你不如自己在Edit1change里面把你要做的事做完。
貌似再去执行On_change事件有点多余。
musa2008 2010-07-02
  • 打赏
  • 举报
回复
我写的只是个示例,让楼主看后自己想想怎么放全局变量。
给思想不给源码。
luo_342815 2010-07-02
  • 打赏
  • 举报
回复
CDSoftwareWj 的头像又恶心到我了。靠!
luo_342815 2010-07-02
  • 打赏
  • 举报
回复
3楼全局变量在哪里??
CDSoftwareWj 2010-07-02
  • 打赏
  • 举报
回复
可用自定义消息实现 嘿嘿
ecjtu5208 2010-07-02
  • 打赏
  • 举报
回复
楼上正解。
楼主自己应该可以想到,仿Property的写法。
musa2008 2010-07-02
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyEvent = procedure(sender : TObject) of object;
type
TForm1 = class(TForm)
edt1: TEdit;
procedure FormCreate(Sender: TObject);
procedure edt1Change(Sender: TObject);
private
FChange : TMyEvent;
{ Private declarations }
procedure _Change(sender : TObject);
public
property On_Change : TMyEvent read FChange write FChange;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1._Change(sender: TObject);
begin
ShowMessage('大于10');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FChange := _Change;
end;

procedure TForm1.edt1Change(Sender: TObject);
begin
if StrToInt(edt1.Text) > 10 then On_Change(sender);
end;

end.
xinghun61 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sz_haitao 的回复:]
封装此变量为不可直接访问
提供2个函数进行读、写,提供一个Onchange事件
在写的函数里判断Onchange事件响应函数是否有效,有效则执行该响应函数
[/Quote]
同意,也就是说对变量的操作通过函数来实现,客户代码不能直接修改,例如用类实现如下
class ci{
static private int i;
static public int get();
static public void set();
}
i为全局变量,对他的修改只能通过get和set函数实现,在get和set中添加对onchange函数的调用
haitao 2010-07-02
  • 打赏
  • 举报
回复
封装此变量为不可直接访问
提供2个函数进行读、写,提供一个Onchange事件
在写的函数里判断Onchange事件响应函数是否有效,有效则执行该响应函数
ecjtu5208 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sz_haitao 的回复:]
直接改Fvalue,当然没有用了
要Value:='xxx';才能触发
[/Quote]
晕倒。
感谢,感谢。同时感谢小白。
haitao 2010-07-02
  • 打赏
  • 举报
回复
直接改Fvalue,当然没有用了
要Value:='xxx';才能触发
麦客来了 2010-07-02
  • 打赏
  • 举报
回复

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.FValue:='sdfdsf';
form1.FValue:='j';
end;


不能直接访问私有变量FValue,访问Value
修改成

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Value:='sdfdsf';
form1.Value:='j';
end;

ecjtu5208 2010-07-02
  • 打赏
  • 举报
回复
小白,我在你的代码后面加了一点,为什么我改变了FValue的值,但是不会触犯ONCHANGE事件啊。
你帮我看看。谢谢

procedure TForm1.FormCreate(Sender: TObject);
begin
OnChange:=yes;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.FValue:='sdfdsf';
form1.FValue:='j';
end;

procedure TForm1.yes(Sender: TObject);
begin
showmessage('yes');
end;
Frank.WU 2010-07-02
  • 打赏
  • 举报
回复
楼上的思想很不错
麦客来了 2010-07-02
  • 打赏
  • 举报
回复

type
TForm1 = class(TForm)
private
FValue: string;
FOnChange: TNotifyEvent;
function getValue: string;
procedure setValue(const Value: string);
public

published
//导出一个属性
property Value: string read getValue write setValue;
//导出一个值变化事件
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.getValue: string;
begin
Result := FValue;
end;

procedure TForm1.setValue(const Value: string);
begin
//属性发生变法时,执行OnChange事件
if Value <> FValue then
begin
if Assigned(FOnChange) then FOnChange(Self);
FValue := Value;
end;
end;
ecjtu5208 2010-07-02
  • 打赏
  • 举报
回复
哥啊,我是说真的,你自己亲自写一下玩玩咯。教我啊。我觉得写不出。
像edit控件的on_change事件,这个事件触发是通过WM_TEXTCHANGE消息的,接着触发change()事件。
以下是我从IDE里拷出来的部分代码

TEdit = class(TCustomEdit)


TCustomEdit = class(TWinControl)
private
FOnChange: TNotifyEvent;
procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
protected
procedure Change; dynamic;

procedure TCustomEdit.CMTextChanged(var Message: TMessage);
begin
inherited;
if not HandleAllocated or (GetWindowLong(Handle, GWL_STYLE) and
ES_MULTILINE <> 0) then Change;
end;

procedure TCustomEdit.Change;
begin
inherited Changed;
if Assigned(FOnChange) then FOnChange(Self);
end;


我很想知道你怎么弄啊。
ecjtu5208 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wintergoes 的回复:]
定义一个简单的类,继承自TObject,然后类里有那个变量,在它的属性里设置write, read 方法
楼上已有属性的代码的

然后把这个类弄成全局变量

嘿嘿
[/Quote]
兄弟,我也是这样想,可是我觉得写不了啊,触发怎么写啊?像edit控件的on_change貌似不好写啊。
你教教我吧,呵呵。
加载更多回复(3)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧