Странное поведение TCheckListBox, первый символ не отображается

Итак, у меня есть CheckListBox с 6 элементами:

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;

Почему я не могу получить первый символ из своего предмета?


person CiucaS    schedule 04.11.2014    source источник
comment
Уверены, что строки такие, как показано выше? .ValueFromIndex должен возвращать значение из списка Name=Value. Доступ к элементу будет иметь CheckListBox1.Items[I].   -  person bummi    schedule 04.11.2014
comment
Да, я уверен. Я хочу получить текст из каждого элемента. Есть ли другой способ сделать это? Помимо ValueFromIndex?   -  person CiucaS    schedule 04.11.2014
comment
как показано в моем первом комментарии CheckListBox1.Items[I]. Но .ValueFromIndex должен возвращать пустые строки с показанным вами содержимым списка.   -  person bummi    schedule 04.11.2014


Ответы (2)


Попробуйте вставить элементы в правильном порядке, как это

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;
person Gianluca Colombo    schedule 04.11.2014
comment
Я сделал это, я вставляю элементы из DataSet в свою программу, но свойство ValueOfIndex[] почему-то не возвращает первый Char. - person CiucaS; 04.11.2014
comment
Да, я пробовал с Items[I] и работает. Спасибо, но почему у ValueOfIndex такое странное поведение? - person CiucaS; 04.11.2014
comment
Это действительно должен быть только один ответ, а не два. Здесь вы демонстрируете использование свойства Items (фактически не упоминая его), а в другом своем ответе вы объясняете, почему свойство ValueFromIndex не подходит для предполагаемой задачи. Было бы лучше явно сказать, что Items - это то, что нужно, продемонстрировать это, как здесь, а затем объяснить, что не так с исходным кодом, как вы сделали в другом ответе. Это сделало бы один хороший ответ вместо двух так себе ответов. (Изображение и код для ручного заполнения списка не имеют отношения к любому ответу.) - person Rob Kennedy; 04.11.2014
comment
На мой взгляд, два ответа более понятны, чем один, в данном случае только один ответ был слишком длинным, на мой взгляд. Когда кто-то ищет решение, лучше всего найти краткое решение, которое упростит и ускорит понимание, где пользователь может скопировать, вставить, а затем попробовать решение... Прилагаемое изображение показывает, что все элементы завершены и не усекается, поэтому решение работает нормально... Во всяком случае, я не могу понять причину вашего комментария. - person Gianluca Colombo; 04.11.2014

Вы не можете использовать 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 — это символ, используемый для разделения пары имя-значение. По умолчанию это знак равенства (=), в результате чего образуются пары Имя=Значение.

Можно установить двоеточие для пар Имя: Значение.

взгляните на источник 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;
person Gianluca Colombo    schedule 04.11.2014
comment
Исходник VCL, несомненно, глючит, но это простительная ошибка. Я имею в виду, что он не обрабатывает случай, когда список не содержит пар имя/значение. И что? - person mg30rg; 04.11.2014
comment
И что?? поэтому вы не можете использовать ValueFromIndex для выставленной porpouse. Ничего больше. - person Gianluca Colombo; 04.11.2014
comment
Но... но... но... назначение свойства .ValueFromIndex в другом. Глючное поведение заключается только в том, что даже что-то возвращается, а не в том, что возвращается неправильное значение. - person mg30rg; 04.11.2014
comment
Classes.TStrings не дает этого нежелательного побочного эффекта, по крайней мере, с Delphi-XE. - person LU RD; 04.11.2014