调查用于生成过滤器的TValueListEditor的奇怪行为 对于ClientDataSet的表达式,我已将其跟踪到第一个条目的情况 在它显然在Value列中没有任何内容,它返回#13#10作为Value,而不是 ''。
在下文中,TStringlist TL使用与ValueListEditor相同的内容进行初始化 Strings属性在我的应用程序中。对于TStringlist,Assert不会失败,但它确实适用于 ValueListEditor。这些结果发生在D7和XE4上。
procedure TDefaultForm.ApplyFilter;
var
i,
Max : Integer;
Key,
Value : String;
TL : TStringlist;
begin
TL := TStringlist.Create;
try
TL.Add('Country=');
TL.Add('Class=CON');
for i:= 0 to TL.Count - 1 do begin
Key := TL.Names[i];
Value := TL.Values[Key];
Assert(Value <> #13#10); // succeeds for all i
end;
Max := ValueListEditor1.RowCount;
for i:= 1 to Max do begin
Key := ValueListEditor1.Keys[i];
Value := ValueListEditor1.Values[Key];
// Value := ValueListEditor1.Strings.ValueFromIndex[i-1];
Assert(Value <> #13#10); //Fails for i = 1!
end;
finally
TL.Free;
end;
end;
Btw,TVLE完全在Object Inspector中设置:我只是将一个TVLE从调色板上拖下来,点击OI中的Strings,点击LH单元格并输入'Country'(没有引号),按下Down键然后键入'Class'然后右箭头并键入'CON'。
显然,我可以通过Value:= Trim(Value)来避免这种情况,但是对#13#10来自哪里感到好奇。
更新:在@ Deltic的回答和有用的评论的推动下,我决定重新跟踪我的步骤,并在我的表单中添加了另一个TVLE。 DFM的以下摘录揭示了:
object ValueListEditor1: TValueListEditor
Left = 16
Top = 224
Width = 306
Height = 135
KeyOptions = [keyEdit, keyAdd]
Strings.Strings = (
'Country='#13#10
'Class=CON')
TabOrder = 2
end
[...]
object ValueListEditor2: TValueListEditor
Left = 440
Top = 192
Width = 306
Height = 246
KeyOptions = [keyEdit, keyAdd]
Strings.Strings = (
'A='
'B=ValueOfB')
TabOrder = 5
end
所以,事后来看,我的问题真的归结为#13#10是如何进入DFM的?然后它回到我身边......
由于没有以前的TVLE经验,当我设置表单时,我陷入了需要添加第二行的位置。我尝试按[Enter],但没有做任何事情,所以我尝试了Ctrl-Enter,也没有做任何事情。但现在重复练习已经证实CR / LF是如何进入TVLE的弦乐的。
所以,似乎我q的答案是“不,TVLE没有坏掉,但是它的Strings属性编辑器 有一个关于Ctrl-Enter的怪癖“。在其他情况下,我会考虑删除我的q,因为它至少部分是由于操作员的失常引起的,但也许最好留下来帮助其他人在同一点上绊倒。
更新#2 我发现我的好奇心让我获得了-1。很公平,但我仍然倾向于离开这个q&amp;一个到位的,如果仅仅是为了说明问题具有确定性原因的事实,这通常可以通过简单的事情来识别,例如重新追踪一个人的步骤,特别是那些显然知识渊博的人,就像它一样。也许下来的选民会关心如何启发读者对未来的读者有什么帮助,例如沉默-1。
答案 0 :(得分:0)
您尚未显示您的值列表编辑器的初始化方式,我怀疑这是您的问题所在。在 TValueListEditor 后面只不过是 TStringList (严格来说是一个子类,但是子类不会改变w.r.t命名值的基本行为)。
如果值列表中显然为空的值产生#13#10 的值,那么它必须是因为它是它具有的实际值。 / p>
这个简单的测试片段验证了这一点:
var
i:Integer;
k, v:String;
begin
ed.InsertRow('Country', '', TRUE);
ed.InsertRow('Class', 'CON', TRUE);
for i:= 1 to ed.RowCount - 1 do
begin
k := ed.Keys[i];
v := ed.Values[k];
ASSERT(v <> #13#10); // Never fails
end;
end;
ed 在表单上是 TValueListEditor 。
用以下代码替换上面代码段中的第一行代码:
ed.InsertRow('Country', #13#10, TRUE);
ASSERT()失败。
我建议您调查值列表编辑器的初始化。我的猜测是,它是通过使用一种机制读取文件来填充的,该机制将整行读入一个字符串,包括行结束序列,并且为每个读取行添加值的代码不会剥离#13#10 行终止符,导致在每种情况下将值添加为&lt; name&gt; =&lt; value&gt;#13#10 。