主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

向下

类事件生成 找到类似的分支


Emstem   (2002-04-12 14:05) [0]

先生们,告诉我,PLZ - 如何让班级产生事件? 我知道你需要将处理程序的地址分配给带有类的指针。 但是如何在Pascal中完成? 然后,可能会有很多处理程序。



Anatoly Podgoretsky   (2002-04-12 14:15) [1]

它们不会生成事件。 使用“:=”操作完成对属性处理程序的赋值。
可以有许多处理程序,但也有属性,可以想象当处理程序的数量不等于属性的数量时,则需要根据需要进行分配。
选项

OnAlert:= MyAlertHandler1;

在哪里深处

如果某事<常数那么如果Assigned(OnAlert)那么......



Reindeer Moss Eater   (2002-04-12 14:21) [2]

处理程序的地址由类的用户分配,而不是由他的编写者分配。
类本身代码中的类编写器必须检查是否已分配处理程序,如果已分配,则调用它。



Бурундук   (2002-04-12 14:26) [3]

TMyClass = class
私立
FOnMyEvent:TMyEvent; //事件处理程序
公开
程序MyEvent; //事件生成
//开始
// if Assigned(FOnMyEvent)then FOnMyEvent(...);
//结束
结束;



Emstem   (2002-04-12 14:48) [4]

处理程序的地址由类的用户分配,而不是由他的编写者分配。
类本身代码中的类编写器必须检查是否已分配处理程序,如果已分配,则调用它。


这是可以理解的。 问题是如何分配一个处理程序(类型为运算符+ = C#代表委托)



Reindeer Moss Eater   (2002-04-12 14:56) [5]

> Emstem
我不太了解你。
您是否希望您编写的课程有活动,或者您是否想要使用您的处理程序回复课程以外的活动?



Emstem   (2002-04-12 15:01) [6]

具体来说 - 有一个班级

TTest = class(TObject)
private
m_Text: string;

m_OnChange: TNotifyEvent;

function getText: string;
procedure setText(value: string);
published
constructor Create;
property Text: string read getText write setText;
property OnChange: TNotifyEvent read m_OnChange write m_OnChanged;
end;
...
//Генерация
procedure TTest.setText(value: string);
begin
m_Text := value;
if (Assigned(m_OnChange) then
m_OnChang(self);
end;
...
//Обработчик(???)
procedure TForm1.OnTestChange(Sender: TObject);
begin
Label1.Caption := (Sender as TTest).Text;
end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
Tst := TTest.Create;

//И как это должно выглядеть?
Tst.OnTextChanged := TForm1.OnTestChange;//На это ругается
end;




Бурундук   (2002-04-12 15:07) [7]

这就是--Tst.OnTextChanged - 我没有看到这样的圣岛。

这是应该如何工作的。
Tst.OnChange:= TForm1.OnTestChange;



Игорь Шевченко   (2002-04-12 15:08) [8]

美好的一天,

Tst.OnTextChanged:= OnTestChange;

真诚的,



Anatoly Podgoretsky   (2002-04-12 15:08) [9]

Tst.OnTextChanged:= OnTestChange; 并宣布Tst



Emstem   (2002-04-12 15:25) [10]

Igor Shevchenko,Anatoly Podgoretsky
该死的,当然。 我为lamer道歉。

如果有几个处理程序怎么办?



kull   (2002-04-12 15:29) [11]

2Podgoretsky

>事件不会生成,它们会发生。


耸耸肩,是吗? :)



Игорь Шевченко   (2002-04-12 15:44) [12]

美好的一天,Emstem,

>如果有几个处理程序怎么办?
我能解释一下吗?

如果一致,那么从另一个打电话......

真诚的,



Anatoly Podgoretsky   (2002-04-12 16:08) [13]

kull©(12.04.02 15:29)
你有没有决定淡出?



Emstem   (2002-04-12 16:11) [14]

Anatoly Podgoretsky,驯鹿苔藓食者,花栗鼠,Igor Shevchenko,kull
SPA-SR博!

伊戈尔舍甫琴科
嗯,例如,其他几个人应该对一个类中的事件作出反应。 在我看来,从一个类爬到另一个类并在一个处理程序中执行所有操作是不合逻辑的。



Игорь Шевченко   (2002-04-12 16:34) [15]

美好的一天,

确定应该响应的那些类中对事件的反应。 确定应该响应的类组。 了解TWinControl如何将事件消息发送到其控件。

真诚的,



Бурундук   (2002-04-12 16:43) [16]

>如果有几个处理程序怎么办?

在这里,标准方案通常不太适合。
可能有不同的方案。
如果事先知道应该处理此事件
几个独立的处理程序彼此不了解 - 在最一般的情况下,您可以列出处理程序

TTest = class(TObject)
私立
m_Text:string;

m_OnChangeHandlers:TMethodList;
//需要一个特殊列表,因为类方法引用是8字节

function getText:string;
procedure setText(value:string);
出版
构造函数创建;
property文本:string read getText write setText;
//属性OnChange:TNotifyEvent读取m_OnChange写入
m_OnChanged;
过程AddOnChange(AOnChange:TNotifyEvent);
procedure RemoveOnChange(AOnChange:TNotifyEvent);
结束;

//一代
procedure TTest.setText(value:string);
var i:整数;
开始
m_Text:= value;
for i:= 0 to m_OnChangeHandlers.Count-1 do
TNotifyEvent(m_OnChangeHandlers [i])(self);
结束;

procedure TForm1.FormCreate(Sender:TObject);
开始
Tst:= TTest.Create;
Tst.AddOnChange(OnTestChange);
结束;

其他选项是可能的 - 例如,将用户消息发送到对象列表(或者如果它们来自同一祖先,则在相同的对象列表上调用预定义方法),等等。



Emstem   (2002-04-12 17:51) [17]

伊戈尔舍甫琴科
一般来说,这是一个问题,而不是学术问题,它只是有趣,首先,如何做到这一点,其次,如何正确地做到这一点。

花栗鼠
原则很清楚。 我只是觉得有一些标准工具。



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

楼上





内存:0.6 MB
时间:0.033 c
1-80987
Starkom
2002-04-12 15:21
2002.04.25
关于对象构造函数的问题


1-80877
Rammst
2002-04-14 06:17
2002.04.25
Ini文件


3-80815
强尼
2002-04-04 17:20
2002.04.25
DBNavigator工作不正确。


14-81041
VLV
2002-03-19 18:50
2002.04.25
数据库 - 单词


4-81119
masik
2002-02-20 12:02
2002.04.25
系统设备?





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский