请问一个过程如何动态执行不通的控件?(急,在线)(100分)

  • 主题发起人 主题发起人 ndust
  • 开始时间 开始时间
N

ndust

Unregistered / Unconfirmed
GUEST, unregistred user!
比如有3个checkbox,有一个事件过程,把三个checkbox的事件全部指向他,它在分别判断是哪个操作,再修改相应的属性。比如点击checkbox1,我想把checkbox1的名字提出,改为checkbox3,把checkbox3的check属性设值,下面语句有错误。
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
d:tcheckbox;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
d:=tcheckbox(s1);
d.caption:=s1;
showmessage(s);
end;
 
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
d:tcheckbox;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
d:=FindComponent(s1) as tcheckbox;
d.caption:=s1;
showmessage(s);
end;
 
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
d:tcheckbox;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
d:=tcheckbox.Create(nil);
d.Name:=s1;
d.caption:=s1;
showmessage(s);
end;
这样呢??
 
为什么除了点击checkbox2外,点击其他的checkbox,过程会被执行两边,
如果去掉d:tcheckbox如何处理
 
为什么这样不行,如何让过程执行一遍

procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
tcheckbox(s1).checked:=true;
end;

 
执行两遍是可能你循环调用了或其它原因,仅从现有代码无法看出来
去掉声明:
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
(FindComponent(s1) as tcheckbox).caption:=s1;
showmessage(s);
end;
安全的写法是:
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
d:TComponent;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
d := FindComponent(s1);
if assigned(d) and (d is tcheckbox) then
tcheckbox(d).caption:=s1;
showmessage(s);
end;
 
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
tcheckbox(s1).checked:=true;//这句不能这么写吧。S1可是string类型啊。它不是对象。
(findcomponent(s1) as Tcheckbox).checked:=true;//用这句替换上一句试试。
end;

 
procedure TForm1.CheckBox1Click(Sender: TObject);
var
s,s1:string;
d:tcheckbox;
begin
s:=tcheckbox(sender).Name;
s:=copy(s,1,length(s)-1);
s1:=s+'1';
d:=FindComponent(s1) as tcheckbox;
d.caption:=s1;
d.checked:=true; //为什么加上这句执行两边。
showmessage(s);
end;
 
因为" d.checked:=true; "使得程序引发了单击事件。建议在执行该行之前先用一个指向函数(事件)的指针来保存" checkbox "的单击事件函数地址。再设置" d.OnClick:=nil; "就可以执行" d.checked:=true; "了,之后再加"d.OnClick = "你的指向函数(事件)的指针
 
指向函数(事件)的指针可以如下定义
SomeOldFunName=TNotifyEvent;
 

Similar threads

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