Класс TList. Основные методы. Использование в программах на Delphi. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Класс TList. Основные методы. Использование в программах на Delphi.



Класс Список (TList)

Он представляет собой массив указателей на объекты произвольных типов. С помощью класса TList можно добавлять в список строк новые объекты, удалять их, находить, сортировать и переупорядочивать.

Свойства класса TList перечислены ниже

Capacity

Размер массива указателей, определяющий отводимую для него память

Count

Текущее число элементов в списке

Items

Свойство для обращения к конкретному объекту по номеру

List

Массив указателей на объекты. Лучше использовать свойство Items

Методы класса TList

function Addjltemr Pointer): Integer;

Добавление нового элемента

procedure Clear;

Удаление всех элементов

procedure Delete(Index: Integer);

Удаление конкретного элемента

procedure Exchange(Indexl, Index2: Integer);

Обмен двух элементов местами

function Expand: TList;

Расширение объема списка на 4-8-16 элементов в зависимости от его текущего размера

function IndexOf(Item: Pointer): Integer;

Номер в списке элемента, на который ссылается указатель Item. Нумерация начинается с нуля

procedure Insert(Index: Integer; Item: Pointer);

Вставка нового элемента

procedure Move(CurIndex. Newlndex: Integer);

Перемещение элемента из позиции Cutlndex в позицию Newlndex

procedure Pack;

Удаление всех элементов, имеющих значение nil, то есть удаление пустых элементов, не ссылающихся на объекты

function Remove (Item: Pointer): Integer;

Удаление элемента, который определяется первым совпадением параметра Item (указатель) со значением указателя в списке

 

Для сортировки элементов списка применяется процедура Sort В качестве единствен-

ного параметра она получает ссылку на функцию, которая выполняет действия по

сравнению значений двух объектов. Это связано с тем, что заранее не известно,

объекты какой структуры будут храниться в списке.

 

type TListSort Compare =

function (Iteml, Item2: Pointer): Integer;

procedure Sort(Compare: TListSortCompare);

 

Приведем небольшой пример создания и сортировки списка. Пусть на форме распо-

ложены два объекта: список ListBoxl и кнопка Button1. При щелчке на кнопке будет

создан список элементов типа TMyltem.

type TMyltem =record

S: string;

Ind: integer

end;

PMyltem = ^TMyltem;

Тип PMyltem — это указатель на тип TMyltem. Поле S заполняется случайными значе-

ниями из 10 символов, а поле Ind примет случайное значение от 1 до 1000. Затем

этот список сортируется по возрастанию значений поля Ind, его содержимое выво-

дится в объект ListBoxl, и, в заключение, содержимое списка вместе с его элементами

будет ликвидировано. Предварительно надо описать функцию для определения, какой

из объектов больше, которая будет использоваться при сортировке. Она должна воз-

вращать значение -1, если первый объект меньше второго, 0, если объекты равны, и

+1, если первый объект больше. Так как параметры функции имеют тип Pointer, в

теле этой подпрограммы их надо явно приводить к типу PMyltem. Объекты будут

сравниваться по значениям полей Ind.

 

 

function Compare(Iteml, Item2: Pointer): Integer;

begin

if PMyltem(Iteml)".Ind < PMyItem(Item2)Л.Ind

then Result:= -1 else

if PMyItem(Iteml)".Ind > PMyItem{Item2}Л.Ind

then Result:= +1

else Result:= 0

end;

Основная процедура (обработчик нажатия кнопки) будет выглядеть так.

procedure TForml.ButtonlClickfSender: TObject);

var List: TList;

P: PMyltem;

i, j: integer;

begin

// создание списка:

List:= TList.Create;

try

for i:= 1 to 10 do

begin

// создание нового элемента:

New(P);

// заполнение поля S случайной строкой

// (значение $40 соответствует пробелу)

РЛ.5:= ' ';

for j:= 1 to 10 do

P".S:= P".S + chr($40 + random<20)),-

// случайное значение для поля Ind:

P".Ind:= random(l000);

// добавление элемента в список:

List.Add(P);

end;

// выполнение сортировки:

List.Sort(Compare);

// заполнение списка ListBoxl:

for i:= 0 to 9 do

begin

P:= List.Items[i];

ListBoxl. Items. AddflntToStr (P^. Ind) + ' ' + P^.S);

end;

finally

// удалить из памяти список

//и все его элементы:

List.Free;

End;

(можно не нужноJ)

Компонент Список (TListBox)

Компонент Список (TListBox) очень часто применяется в программах для

Windows. Он позволяет выбрать одну или несколько строк в списке.

Первоначально компонент TListBox, размещенный на форме, изображается в виде

пустого квадрата. Его размеры можно настроить протягиванием мыши.

Список может иметь несколько столбцов. Это не означает, что каждый столбец

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

строками донизу очередная строка отображается в следующем столбце. В остальном

работать такой список будет так же, как обычный список.

1 24 Урок 2. Основы программирования в среде Delphi 7

Число столбцов задается в свойстве Columns. Если оно больше 0, то на каждую ко-

лонку отводится часть общей ширины списка (значение свойства Width, деленное

на число столбцов). Список может принадлежать к одному из трех возможных

типов (свойство Style).

Таблица 2.5. Значение свойства Style

Значение Стиль списка

IbStandard Стандартный список (стиль по умолчанию)

IbOwnerDrawFixed Каждый элемент списка имеет фиксированную высоту, но способ его

отображения определяется программистом

IbOwnerDrawVariable Кроме способа рисования в тексте программы необходимо явно

задавать размер каждого элемента списка (что позволяет создавать

списки с элементами разных размеров)

Если значение свойства Style не равно IbStandard, программист должен сформиро-

вать для списка обработчик события OnDrawItem, в котором самостоятельно органи-

зовать отрисовку содержимого. Такой список может содержать не только текст, но

и другие объекты, например рисунки. Узнать высоту элемента в пикселах можно,

обратившись к свойству ItemHeight

Если высота элементов списка может быть различной, то перед обработкой события

OnDrawItem надо обработать событие OnMeasureltem. В заголовке соответствующего

обработчика имеется параметр, описанный так:

var Height: Integer;

В этот параметр, передаваемый по ссылке, надо записать размер очередного эле-

мента (его номер указывается в параметре Index), а затем уже обработать событие

OnDrawItem с учетом текущей высоты элемента.

Выбирать элементы в списке можно по одному, а можно и по нескольку одновре-

менно. Свойство MultiSelect (тип Boolean) позволяет выбирать несколько элементов,

если его значение равно True. Выделить сразу группу элементов можно, если при

щелчке на последнем из них держать нажатой клавишу SHIFT. Такая возможность

появляется, если в свойство ExtendedSelect занесено значение True.

Свойство SelCount (оно доступно только для чтения и не \южет быть изменено в

тексте программы) содержит число выделенных строк списка. Чтобы определить,

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

ству Selected, представляющему собой массив типа Boolean, Значение выражения

ListBox.Selected!4]

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

Если выделение нескольких элементов не разрешено, то узнать, какой элемент выде-

лен, можно, обратившись к свойству Itemlndex, хранящему номер единственного

выделенного элемента.

Создание программ для Windows 125

'1 ПОДСКАЗКА Исходно выделенные элементы в списке отсутствуют. Это означа-

ет, что в свойстве Ifemlndex записано значение -1- При попытке

обратиться к какому-то свойству, допускающему индексацию

(например, Items), используя Itemlndex в качестве индекса, возник-

нет ошибка выхода индекса за допустимые границы. Поэтому жела-

тельно после первого заполнения списка явно выделить один из

элементов в тексте программы, занеся в свойство Itemlndex значе-

ние, отличное от -1.

Содержимое списка хранится в уже знакомом нам свойстве Items (список строк,

класс TStrings). Строки можно задать на этапе проектирования, в специальном редак-

торе, так же, как задавалось содержимое группы переключателей, а можно и во

время работы программы с помощью метода Add класса TStrings.

Например, если имеется потребность в занесении в список значений, получаемых

в результате сложения, то на форму можно добавить новую кнопку Добавить (она

автоматически получит название Button?), а в обработчике щелчка на этой кнопке

(событие OnClick) вызывать метод Add (рис. 2.12).

/'MvForm

Г

HodbSuttqnl;

Рис. 2.12. В левом нижнем углу формируется список результатов

procedure TMyForm.Button2Click(Sender: TObject);

Begin

ListBoxl.Items.Add(Labell.Caption ];

end;

Элементы списка можно упорядочить в алфавитном порядке, занеся в свойство

Sorted значение True. После этого при добавлении новых элементов они будут сорти-

роваться автоматически.

1 26 Урок 2. Основы программирования в среде Delphi 7

Для очистки всего содержимого списка используется метод Clear:

ListBoxl. Clear;

Для удаления конкретного элемента служит метод DeleteString:

ListBoxl.DeleteString(4};

При этом, конечно, помимо перерисовки списка вносятся соответствующие изме-

нения в свойство Items.

Еще один полезный метод, который часто используется для вызова контекстного

меню конкретного элемента списка, называется ItemAtPos. Он переводит коорди-

нату точки внутри списка в номер элемента, в рамках которого лежит эта точка.

Его удобнее всего использовать в обработчике щелчка (отпускания) кнопки мыши

для объекта ListBox.

procedure TMyForm.ListBoxlMouseUp (Sender: TObject;

Button: TMouseButCon,-

Shift: TShiftState; X, Y: Integer);

var Point: TPoint;

Index: Integer;

begin

Point.X:= X; Point.Y:= Y;

Index:= ListBoxl.ItemAtPos (Point, True),-

end,-

В переменную Index запишется номер элемента, на область которого внутри списка

пришелся щелчок мыши.

У функции ItemAtPos два параметра. Первый — объект типа TPoint, содержащий

координаты точки. Второй параметр определяет, какое значение будет возвращено,

если щелчок выполнен вне границ реально присутствующих в списке строк (это

может быть только в области за последней строкой). Если в такой ситуации в качестве

второго параметра указано значение True, функция вернет значение -1, если False -

увеличенный на единицу номер последнего элемента списка.

ЗАМЕЧАНИЕ Для вызова контекстного меню, привязанного к конкретному

объекту, можно использовать обработчик события OnContextPopup

(которое генерируется по умолчанию, если пользователь нажимает

правую кнопку мыши над областью объекта).__

 



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 1115; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.202.187 (0.162 с.)