Реклама
 


  •  

    Компонент Delphi - ListBox

     

    1 - Компонент Delphi ListBox это компонент, служащий для хранения и обработки текстовой информации. Каждая строка Delphi ListBox хранит строку данных в формате String.

    Компонент ListBox - это массив строк. ListBox может загружать данные с диска, и сохранять информацию в файл. Также ListBox может сортировать строки. Доступ к строкам предоставляет свойство Items этого компонента. В соответствии с этим, вот как происходит обращение к строке с номером i:

    ListBox1.Items[i-1]; // Минус один, так как нумерация строк в компоненте начинается с нуля.

    2 - Прежде всего рассмотрим методы добавления строк в компонент Delphi ListBox:

    1)Считывание из файла;

    2)Добавление строки в конец списка;

    3)Добавление строки перед строкой с номером i;

    4)Добавление строк на этапе конструирования

    1) Считывание из файла!

    Компонент Delphi ListBox может обращаться напрямую к текстовому файлу как для считывания информации из файла, так и для сохранения всех своих строк в текстовый файл. Каждая запись в файле будет записана в виде одной строки компонента, и при сохранении каждая строка будет сохранена в виде одной записи файла:

    ListBox1.Items. LoadFromFile('Имя_Файла'); // Процедура считывания из файла

    ListBox1.Items. SaveToFile('Имя_Файла'); // Процедура записи в файл

    2)Добавление строки в конец списка!

    Программист может последовательно добавлять строки в компонент, не заботясь об их нумерации, и они будут размещаться в конец списка:

    ListBox1.Items. Add('Новая_Строка'); //Добавление строк в конец списка

    Так как количество строк в компоненте равно ListBox1.Items. Count, то новая (последняя) строка имеет номер ListBox1.Items. Count-1. Это объясняется тем, что нумерация строк начинается от 0.

    3)Добавление строки перед строкой с номером i.

    Программист может разместить новую строку среди существующих строк там, где ему необходимо. Для этого нужно воспользоваться методом Insert, и указать номер строки, перед которой необходимо записать новую строку:

    ListBox1.Items. Insert(i, 'Новая_Строка'); // Добавление строки перед строкой с номером i

    При этом новая строка получает номер i.

    4)Добавление строк на этапе конструирования!

    В Инспекторе Объектов зайдите на строчку Items и нажмите на появившуся кнопку. Появится окно редактора содержимого, где и можно внести нужную информацию. После нажатия кнопки OK содержимое редактора появится в компоненте ListBox на Форме.

    3 - Пользователь может выделить строку, щёлкнув по ней мышкой. Номер выделенной строки возвращает свойство компонента ListBox. ItemIndex. То есть, получить текст выделенной строки можно так:

    S := ListBox1.Items[ListBox1.ItemIndex];

    Не забывайте пользоваться оператором присоединения with. С его использованием это присваивание выглядит так:

    with ListBox1 do

    begin

    S := Items[ItemIndex];

    end;

    При многократном использовании свойств компонента данная запись очень экономит силы. Кстати, оператор присоединения допускает работу с несколькими компонентами, которые нужно разделить запятой. Например, присваивание строки компонента ListBox ячейке таблицы StringGrid выглядит так:

    with ListBox1, StringGrid1 do

    begin

    Cells[i, j] := Items[ItemIndex];

    end;

    Для удаления строк из компонента применяется метод Delete. Удаление строки с номером i:

    ListBox1.Items. Delete(i);

    Чтобы при добавлении каждая строка была отсортирована (сортировка идёт только по возрастанию), нужно установить:

    ListBox1.Sorted := True;

    Также возможно установить это свойство на этапе конструирования в Инспекторе Объектов.

    К сожалению, компонент не обладает возможностью добавлять только уникальные данные. Один и тот же текст запишется несколько раз. Для реализации этой возможности приходится дополнительно применять невизуальный аналог компонента ListBox - объект StringList, обладающий такой возможностью:

    procedure TForm1.Button1Click(Sender: TObject);

    var SL: TStringList;

    S: String;

    begin

    SL:=TStringList. Create; // Создаём список строк типа TStringList

    SL. Sorted:=True; // Устанавливаем свойство - сортировать строки

    SL. Add(S); // Пробуем добавить строку в объект StringList

    ListBox1.Items. Add(S); // Добавляем строку в компонент ListBox

    except

    Caption:='Попытка добавить дубликат';

    // Попытка добавить дубликат вызовет ошибку в первой строке секции try/except,

    // прерывание и переход к секции except/end.

    // Добавления в ListBox не будет.

    end;

    end;

    Компонент ListBox автоматически добавит полосу прокрутки, если количество строк не помещается по высоте компонента. Высота каждой строки равна ItemHeight. Если нужно чтобы при добавлении новой строки полоса прокрутки точно не возникла, этот размер нужно добавить к высоте компонента. Но делать это нужно только начиная с определённого количества строк. Поэтому нужно делать проверку:

    ListBox1.Items. Add('Новая_строка');

    with ListBox1 do

    if (Items. Count > (Height/ItemHeight))

    then Height := Height + ItemHeight;

    Но если высота компонента не нацело делится на высоту строки, то прокрутка всё равно возникнет. Поэтому нужно отнять единичку:

    ListBox1.Items. Add('Новая_строка');

    with ListBox1 do

    if (Items. Count > (Height/ItemHeight)-1)

    then Height := Height + ItemHeight;

    Однако на долю секунды полоса прокрутки всё-таки появляется. Поэтому сначала сделаем проверку, а затем уже будем добавлять строку. В этом случае уже нужно отнимать не 1, а 2:

    with ListBox1 do

    if (Items. Count > (Height/ItemHeight)-2)

    then Height := Height + ItemHeight;

    ListBox1.Items. Add('Новая_строка');

    4 - Компонент ListBox представляет из себя прямоугольную область, заполненную списком однострочных текстовых элементов. С помощью клавиатуры или за счет выбора мыши, можно осуществить отбор необходимы элементов в программе.

    Свойство в котором находится список строк это Items типа TString. На этапе проектирования, для его заполнения, необходимо нажать на кнопке с многоточием напротив этого свойства в окне Инспектора Объектов. В приложении поставить в любой обработчик (допустим событие кнопки)

    ListBox1.Items. Add('Книга');

    или

    ListBox1.Items. Add(Edit1.Text); // добавление будет из компонента Edit1.Text

    Для полной очистки списка:

    ListBox1.Clear;

    Чтобы удалить выделенный элемент:

    ListBox1.DeleteSelected;

    По умолчанию список состоит из одной колонки. И если список большой и не все элементы помещаются в нем автоматически справа появляется или исчезает вертикальная полоса прокрутки (первый и второй компонент ListBox на рисунке ниже). Для того чтобы появилась горизонтальная полоса прокрутки необходимо свойству Columns типа Integer поставить значение больше нуля. Третий компонент - Columns равен 1, второй 2.

    Свойство Sorted равное true дает возможность расположить элементы в алфавитом порядке. За счет сортировки списка в алфавитом порядке будет легче увидеть необходимый элемент, особенно если список большой. Применив сортировку в Инспекторе Объектов отменить сортировку не удастся.

    Для того чтобы определить какой элемент был выбран пользователем воспользуемся данной записью, включив его в обработчик какого нибудь события:

    ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);

    где ShowMessage() - простейшая функция вывода на экран текстовых сообщений, а ListBox1.ItemIndex - номер текущего элемента.

    MultiSelect - свойство благодаря которому можно можно выбрать не 1 элемент, а более. Для этого ставим его равным TRUE. Щелкая мышью, при нажатой клавише CTRL, выбираем произвольные элементы. Если свойство ExtendedSelect равно TRUE, удерживая клавишу SHIFT выделим непрерывный диапазон списка. Для определения выделен компонент или нет обратимся к свойству Selected. Выражение:

    ListBox. Selected[3]

    равно TRUE, если четвертый элемент в компоненте выделен (номера элементов начинаются с нуля).

    ItemAtPos свойство, которое переводит координаты щелчка внутри списка в индекс элемента. Расположим на форме компоненты ListBox, Panel и Label согласно рисунку. Для компонента ListBox в обработчике отпускания кнопки мыши напишем следующий код.

    procedure TForm1.ListBox1MouseUp(Sender:

    TObject; Button: TMouseButton;

    Shift: TShiftState; X, Y: Integer);

     



  • На главную