【问题标题】:TCheckListBox strange behaviour, not showing first charTCheckListBox 奇怪的行为,不显示第一个字符
【发布时间】:2014-11-04 15:46:54
【问题描述】:

所以我有一个包含 6 个项目的 CheckListBox:

Items.Strings = (
    'Banana'
    'Apple'
    'Pomelo'
    'Orange'
    'Peach'
    'BlueBarry')

如果我想在 ShowMessage 对话框中显示它们,则打印的消息是。

'anana','pple','omelo','range','each','lueBarry'.

我使用的程序是这样的。

procedure TForm1.Button1Click(Sender: TObject);
var I : Integer;
begin
     for I := 0 to CheckListBox1.Items.Count - 1 do
          ShowMessage(CheckListBox1.Items.ValueFromIndex[I]);
end;

为什么我无法从我的项目中获取第一个字符?

【问题讨论】:

  • 确定字符串如上所示? .ValueFromIndex 应该从 Name=Value 列表中返回一个值。 CheckListBox1.Items[I] 将访问一个项目。
  • 是的,我确定。我想从每个项目中检索文本。还有其他方法吗?除了 ValueFromIndex?
  • 如我的第一条评论 CheckListBox1.Items[I] 中所示。但是.ValueFromIndex 应该返回空字符串以及您显示的列表内容。

标签: delphi tchecklistbox


【解决方案1】:

尝试像这样以正确的方式插入项目

procedure TForm1.Button1Click(Sender: TObject);
begin
  CheckListBox1.Items.Add('Banana');
  CheckListBox1.Items.Add('Apple');
  CheckListBox1.Items.Add('Pomelo');
  CheckListBox1.Items.Add('Orange');
  CheckListBox1.Items.Add('Peach');
  CheckListBox1.Items.Add('BlueBarry');
end;

结果将是:

那么……

procedure TForm1.Button2Click(Sender: TObject);
var I : Integer;
begin
     for I := 0 to CheckListBox1.Items.Count - 1 do
          ShowMessage(CheckListBox1.Items[I]);

end;

【讨论】:

  • 我这样做了,我将数据集中的项目插入到我的程序中,但属性“ValueOfIndex[]”由于某种原因没有返回第一个字符。
  • 是的,我尝试使用 Items[I] 并且工作正常。谢谢,但为什么 ValueOfIndex 会有这种奇怪的行为?
  • 这真的应该只是一个答案,而不是两个。在这里,您演示了使用 Items 属性(实际上没有提及它),在您的其他答案中,您解释了为什么 ValueFromIndex 是预期任务的错误属性。最好明确 Items 是需要的,像你在这里一样演示它,然后解释原始代码有什么问题,就像你在另一个答案中所做的那样。这将是一个很好的答案,而不是两个马马虎虎的答案。 (手动填充列表的图片和代码与任何一个答案都无关。)
  • 在我看来,两个答案比一个更清楚,在这种情况下,我认为只有一个答案太长了。当有人在寻找解决方案时,最好是找到一个简单快速的解决方案,用户可以复制,粘贴然后尝试解决方案......附上的图片显示所有项目都是完整的并且没有被截断,因此解决方案工作正常......无论如何我无法理解您评论的原因。
【解决方案2】:

您不能将 ValueFromIndex 用于您的海豚。

TStrings.ValueFromIndex

根据索引返回字符串的值部分。

声明

public property TStrings.ValueFromIndex : string
  read GetValueFromIndex
  write SetValueFromIndex;

说明

ValueFromIndex 根据字符串索引返回字符串的值部分。值部分是字符串中 NameValueSeparator 字符之后的所有字符,如果 NameValueSeparator 字符不存在,则为所有字符。

TStrings.NameValueSeparator

用于分隔名称、值对的字符的值

声明

public property TStrings.NameValueSeparator : Char
  read FNameValueSeparator
  write SetNameValueSeparator;

说明

NameValueSeparator 是用于分隔名称、值对的字符。默认情况下,这是等号 (=),产生 Name=Value 对。

它可以设置为名称:值对的冒号。

看看vcl源码:O

function TStrings.GetValueFromIndex(Index: Integer): string;
begin
  if Index >= 0 then
    Result := Copy(Get(Index), Length(Names[Index]) + 2, MaxInt) else
    Result := '';
end;

【讨论】:

  • VCL 源代码无疑是错误的,但这是一个可以原谅的错误。我的意思是它不处理列表不包含名称/值对的情况。那又怎样?
  • 那又怎样??所以你不能将 ValueFromIndex 用于暴露的海豚。没有别的了。
  • 但是...但是...但是... .ValueFromIndex 属性的目的是另外的。错误的行为只是即使返回了一些东西,而不是返回了错误的值。
  • Classes.TStrings 至少从 Delphi-XE 开始不会产生这种不需要的副作用。
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 2014-02-12
相关资源
最近更新 更多