关于vcl的问题 请大侠伸伸手帮帮忙吧 (50分)

  • 主题发起人 主题发起人 hstod
  • 开始时间 开始时间
H

hstod

Unregistered / Unconfirmed
GUEST, unregistred user!
Unit No;

interface

uses
Windows, Messages, SysUtils, Classes, Dialogs;

type
TEvent= procedure(sender of Tobject) of object
TNo = class(TComponent)
private
FNO: Integer;
FNoIS: String;
FEvent: TEvent;
procedure SetNOis(const Value: String);
procedure setFno(const Value: Integer);
procedure SetEvent;(conset Value: TEvent);
protected
{ Protected declarations }
public
Constructor Create(AOwner: TComponent); Override;

published
property NO: Integer Read Fno Write setFno;
Property ONNOIs: String Read FNOis Write SetNOis;

property OnEvent : TEvent read FEvent write SetEvent;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('HSTDB', [TNo]);
end;

{ TNo }

constructor TNo.Create(AOwner: TComponent);
begin
inherited;
if csDesigning in ComponentState Then
begin
Fno:= 0;
FNois:= 'aa';
End else
if (Fnois='123456') and (fno=123) then
if assigned(FEvent) then FEvent(self);
end;


procedure TNo.setFno(const Value: Integer);
begin
Fno := Value;
end;

procedure TNo.SetNOis(const Value: String);
begin
FNois:= Value;
end;

procedure SetEvent;(conset Value: TEvent);
BEgin
FEvent:= Value;
End;

end.
楼上众多人都说出了毛病 我也知道了 就是不能放在Create事件内
我想问一下 不放的Create事件内放的什么地方 可出作出
让这段代码运行 if assigned(FEvent) then FEvent(self);
 
没有人会吗???
 
你的另外一个帖子里不是已经有人答了吗
 
因为fnois在create时尚未赋值
SetNOis在create之后执行。
 
Create最先执行试再显示之前应先赋值
 
那在什么地方写 才能同时获得这两个值呢??
 
to siyan
那是事件本来也问了 但没说出对 但是分已经给了 我想也就算了 再开个帖子问一下这个问题 这次是属性 用户输入完属性值后 一运行 值为空
to lb_icesea79
我是想让用户输入的

因为我刚学vcl 有不懂的地方还很多 请大家多多帮忙
 
写一个方法
比如
public
Constructor Create(AOwner: TComponent); Override;
procedure ShowCompmessage;

procedure TNo.ShowCompmessage;
begin
if not(csDesigning in ComponentState) Then
showmessage(inttostr(fno)+'::::'+fnois);
end;

调用Tno的showcompmessge方法就可以了。
 
试试先 谢谢了
 
不行呀 realLearning
关间是 我还要更具这个值 来吊用相应的 事件 我想让它自动判断 面不是运行时用户再去手到激活它
 
在你的setFno和setFnois里都调用ShowCompmessage;
在ShowCompmessage;里进行你的判断处理
 
大侠都休息了吗??
 
写在窗体创建之后,
你的代码执行得太早了,组件的属性还没有进行Load呢,所以你读到的是
属性拥有预先设置的值之前的值 ,
这个地方通常是给组件的属性初始化用的,保存到窗体资源中的值,
此时还没有调入呢
 
那么 "窗体创建之后" 是那个事件 该在什么地方写
 
没人知道吗??
 
我觉得不是在窗体创建之后执行,而应该是在控件读取Fno和Fnois的值时执行
可以把代码写在一个函数里,然后在你的setFno和setFnois里都调用这个函数
函数里要根据Fno和FNois的值进行判断
 
那么代码怎么改呢?? 谢谢了大侠
 
procedure TNo.setFno(const Value: Integer);
begin
if FNo<>Value then
begin
Fno := Value;
DoSomething();
end;
end;

procedure TNo.SetNOis(const Value: String);
begin
if FNois<>Value then
begin
FNois:= Value;
DoSomething();
end;
end;

procedure TNO.DoSomething();
begin
//根据FNO和FNOis的值判断是否执行你的操作
end;
 
但是这样 会触发两次DoSomething()过程
怎样只触发一次 因为我还要更具这两个值 作出响应的事件反映
如果DoSomething()加入这样的代码 就不行了吧
if (FNois=XXX) and (Fno=XXX) then
begin
...
if assigned(FEvent) then FEvent(self);
...
end;
这样的画 FEvent是不会被激活的或被激活了两次 这是具个例子
有没有判断vcl装载完毕的事件??
 
procedure CreateWnd; override;
不要写在构造函数在

写在createwnd中试试
 
后退
顶部