Как получить текст из указанной строки c в списке delphi - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу получить текст из указанной строки c.

Пример.

Содержимое ListBox:

Строка 0 Строка 1

Строка 1 Строка 2

Строка 3 Строка 3

Как получить текст из строки 1 для примера?

Я пытаюсь с этим:

(listbox1.Items.Objects [1] as TText) .Text

Но генерирует нарушение произвольного доступа ...

Есть другой способ?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2020

Предполагая, что они существуют,

  • ListBox.Items[0] - первая строка в списке.
  • ListBox.Items[1] - вторая строка в списке.
  • ...
  • ListBox.Items[ListBox.Items.Count - 1] - последняя строка в списке.

Вместо

ListBox.Items[i]

вы также можете использовать

ListBox.Items.Strings[i]

, но это больше для ввода.

(Свойство TStrings.Strings явно является свойством массива, и поскольку оно объявлено как "default" , оно может доступ к нему осуществляется с помощью скобок на самом объекте.)


Дополнительный материал: использованное вами свойство массива Objects иногда используется для привязки объекта (указателя) к каждому элементу в списке. (И иногда злоупотребляют для хранения целых чисел собственного размера, которые не являются объектами, по-прежнему по одному на элемент.)

0 голосов
/ 17 февраля 2020
Items.Lines[0] - Access element 0 (first string) of Lines array -- for Kylix 

Items.Strings[0] - Access element 0 (first string) of Strings array -- for VCL/FMX

AV генерирует, когда вы пытаетесь получить доступ к памяти, которая недоступна, поэтому, другими словами, delphi не имеет проверки типов для доступа к памяти программ (двоичные данные), и это приводит к Широкий диапазон необработанных ошибок, таких как ошибка неправильного типа и исключение NullPointer, которое, однако, может быть обработано без изменения подпрограмм памяти (запись других определений типов для обеспечения проверки), указатель может быть проверен путем сравнения с nil в реализации Pascal или с помощью CMP fun c в Ассемблере.
Подробнее об этом:
Каждая переменная, константа и, конечно, метод хранятся в памяти компьютера (RAM) в процессе выполнения, в своем собственном поле, которое предоставляется процессор (ЦП) для программирования и ограничен встроенной в материнскую плату логи c, поэтому он не может записывать в память других программ.
Большинство типов данных имеет собственное байтовое выравнивание (специфицируется c сохранения 0 и 1, но, когда тип больше, чем просто один байт, он расширяется, чтобы содержать информацию о типе) t o знать, что в нем есть правильные двоичные данные, такие как Strings, Objects и Records.
String хранит свою собственную длину и кодировку в байтовом представлении своего содержимого, когда класс сохраняет фактическое имя типа, которое используется для управления вызовами функций и процедур.
Но, похоже, delphi Pascal обращается к памяти сразу после указания адреса данных, без какой-либо проверки его содержимого, поэтому в случае доступа он возвращает случайные значения неопределенные типы - типы, которые не имеют расширенной информации о типах (например, различные целочисленные типы) и AV в случае обращения к указанным типам.
Просто не забудьте проверить все типы указателей (как обычно, они начинаются с буквы P, например, как PAnsiChar) для содержания чего-либо в нем:
Пути:

// Assigned function
if Assigned(pvar) then 
DoSomething();
// = nil comparision / equation
if pvar <> nil then
DoSomething()
Else
Exit;
...