Delphi TValueListEditor Strings prop-ed quirk?

时间:2014-09-09 17:02:58

标签: delphi

调查用于生成过滤器的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。

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