自制控件中TStringList类型属性的问题 (已解决 - 下午散分) ( 积分: 200 )

  • 主题发起人 主题发起人 tt.t
  • 开始时间 开始时间
T

tt.t

Unregistered / Unconfirmed
GUEST, unregistred user!
1。自制控件中使用TstringList类型的属性,如
Published
property Lines: TStringlist read FLines write SetLines;
SetLines是不是只能写成
procedure SomeClass.SetLines(NewLines: TStringList);
{var
i: integer;}
begin
FLines.Assigned(NewLines);
//这里能不能用其他方式,如
{
for i := 0 to NewLines.Count - 1 do
begin
FLines.Add(NewLines)

FAnotherList.Add(DoSomeProcess(NewLines));
。。。
end;

FLines.Assigned(NewLines);
for i := 0 to FLines.Count - 1 do
begin
FAnotherList.Add(DoSomeProcess(FLines));
。。。
end;
//等其他方式?
//因为在复制NewLines时还需同时需进行其他处理所以这样作。
}
end;
才能通过属性编辑器提供的编辑功能修改其内容,并被成功保存?
因为我发现采用其他方式,运行时FLines的Count有数量,而实际StringList中没有值。
我用的时d6。
2。还有就是用属性编辑器添加内容后,TStringList类型的属性什么时候被赋值?是否会出发事件?
 
1。自制控件中使用TstringList类型的属性,如
Published
property Lines: TStringlist read FLines write SetLines;
SetLines是不是只能写成
procedure SomeClass.SetLines(NewLines: TStringList);
{var
i: integer;}
begin
FLines.Assigned(NewLines);
//这里能不能用其他方式,如
{
for i := 0 to NewLines.Count - 1 do
begin
FLines.Add(NewLines)

FAnotherList.Add(DoSomeProcess(NewLines));
。。。
end;

FLines.Assigned(NewLines);
for i := 0 to FLines.Count - 1 do
begin
FAnotherList.Add(DoSomeProcess(FLines));
。。。
end;
//等其他方式?
//因为在复制NewLines时还需同时需进行其他处理所以这样作。
}
end;
才能通过属性编辑器提供的编辑功能修改其内容,并被成功保存?
因为我发现采用其他方式,运行时FLines的Count有数量,而实际StringList中没有值。
我用的时d6。
2。还有就是用属性编辑器添加内容后,TStringList类型的属性什么时候被赋值?是否会出发事件?
 
建议你那个控件属性改成Tstrings

另外你的控件creat的时候FLines creat了没有?
 
create什么的都没问题,注册成可视控件前都测试通过了,就是用属性编辑器编辑时出了问题,不清楚怎么解决。
 
属性编辑器。。。。和上面的代码有什么关系

你那个不是把一个Tstringlist传给你的控件吗?
 
就像Memo的lines属性可以在属性编辑器里面直接编辑一样,我也想直接通过属性编辑器编辑,可是出错了
 
看看典型控件的封装吧。
 
1、属性象你那样定义大体是没有问题的,但是最好把类型改为TStrings
2、TStrings有OnChange事件的,如果你定义了一个这样的事件任何对你的Lines属性的改变都会执行那个事件的;

建议参考一下TQuery的SQL属性的写法:)
 
可以用你说的两种方式!
 
duhai_lee,
我没在封装其他控件,上面只是一个例子。
yeskert1,godelphi2004,
我也觉得应该没问题,可是确实出现了问题,

找到原因了:
调试发现,运行期FAnotherList中没有值,而且在SetLines上下断也不会中断,猜想运行期SetLines实际上并没有运行。
经跟踪证明了上面的猜想。
SetLines只在用属性编辑器编辑完成,点击确定后才会执行。
运行初始化时,属性编辑器保存的值会通过TStringlist.Add方法直接赋给FLines,根本不会调用SetLines。所以FAnotherList中自然也不会有值了。
结论:
在SetLines中加入与FLines无关的代码是毫无意义的,只能用其他方法实现。
 
设计时在属性编辑器里的赋值,只是引用这个属性(然后调用这个属性的add),而没有对这个属性赋值。
如果象这样
obj.lines:=slist1;
才能执行到SetLines!
---------
不过,我印象中以前的版本好像不是这样。
现在,属性编辑器里的值直接通过属性的方法(如add)赋值给内部对象了,以前好像是先
把属性编辑器的内容给一个临时对象,然后调用SetLines这样的方法。
 
yeskert1,
至少d6是在控件创建后,初始化其published属性时会向我说的那样做,或许是出于效率的考虑吧。
对TStringList类的来说,初始化时会通过TStrings的private方法ReadData调用TStringList的Add方法来直接初始化,根本不执行SetLines。
不知其他版本怎么样。

没怎么编过控件,好不容易编一次又遇到这种问题,烦人。
 
这样好像提高效率了,但肯定也带来问题!
现在,你可以为tstringlist的onchange事件写个过程给它,在这个过程里处理其他事情就行了。
 
不会用onchange去做,那不是我想要的,我要重新设计结构流程来解决这个问题
散分
 

Similar threads

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