Редактирование значений в TDrawGrid 


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



ЗНАЕТЕ ЛИ ВЫ?

Редактирование значений в TDrawGrid



Для отображения значений в TDrawGrid необходимо реализовать обработчик события OnDrawCell. Пример:

 

procedure TForm1.dgMtrDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

var

V: Integer;

begin

if ACol=0 then begin

if ARow=0 then

Exit;

V:= ARow

end

else if ARow=0 then

V:= ACol

else

V:= ACol*ARow;

dgMtr.Canvas.TextRect(Rect,Rect.Left+3,Rect.Top+1,IntToStr(V));

end;

 

Для того, чтобы значения в TDrawGrid можно было редактировать необходимо включить флаг goEditing в Options и реализовать обработчик события On GetEditText. Пример:

 

procedure TForm1.dgMtrGetEditText(Sender: TObject; ACol, ARow: Integer;

var Value: String);

begin

Value:= IntToStr(FMtr[ARow-1, ACol-1]);

end;

 

(здесь FMtr – массив значений ячеек)

 

Для того, чтобы значения, отредактированные в TDrawGrid, сохранялись необходимо реализовать обработчик события On SetEditText. Пример:

procedure TForm1.dgMtrSetEditText(Sender: TObject; ACol, ARow: Integer;

const Value: String);

var

V: Integer;

begin

if TryStrToInt(Value,V) then

FMtr[ARow-1, ACol-1]:= V;

end;

 

(здесь FMtr – массив значений ячеек)

 

 

50. Работа с компонентом TListView. Отображение в ListView больших объёмов данных в виртуальном режиме (OwnerData=true).

Компонент Список элементов (TListView)

В отличие от компонента TListBox, представляющего собой стандартный список строк, существующий еще с первых версий Windows, список элементов содержит значительно больше возможностей представления информации.

ВНИМАНИЕ Данный компонент ориентирован на представление данных в виде

структуры "объект — набор свойств", например файлов вместе со своими характеристиками: размером, датой создания, атрибутами. Использовать его как список однородной информации некорректно.

 

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

Режим его будущей работы определяется значением свойства ViewStyle. Возможны

следующие значения.

VsIcon

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

можно перетаскивать. Так работают папки Windows 9x в режиме Крупные значки

v sSmallIcon

Каждый элемент представлен маленьким значком с подписью справа от него. Эти

значки можно перетаскивать. Так работают папки Windows 9x в режиме Мелкие

значки

VsList

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

Эти значки, расположенные по столбцам, перетаскивать нельзя. Там работают

папки Windows 9x в режиме Список

VsReport

Объект работает как обычный список с несколькими столбцами

 

Число и свойства столбцов задаются в свойстве Columns, которое представляет собой

коллекцию объектов THnaTListColumn. Основное их свойствоCaption. Оно содер-

жит заголовок столбца. Пользователь может редактировать его во время работы

программы, если значение свойства списка Readonly не равно True и если заголовки

не работают в режиме кнопок.

 

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

фокус перескакивает по элементам списка в соответствии с набранной пол ьзователем строкой.

Данные для списка формируются в свойстве Items (тип TListltems), представляю-

щим собой список объектов типа TListItem. Эти объекты можно создавать на этапе

проектирования с помощью специального редактора (рис. 4.20, стр 285).

После щелчка на кнопке New Item (Новый элемент) в поле Caption (Заголовок) задается

его имя, в поле Image Index (Номер рисунка) — номер рисунка (значка) из списка рисун-

ков LargeImages или SmallImages (см. ниже), в поле State Index (Номер состояния) —

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

может состоять из нескольких вложенных элементов (больший уровень вложенности не допускается), представляющих собой, по замыслу создателей, свойства

этого элемента.

Названия элементов и номера картинок хранятся в свойстве Items, а обратиться к

вложенным объектам (свойствам) можно через подсвойство SubItems (см, далее).

 

Настройка структуры и внешнего вида списка осуществляется с помощью свойств:

АllосВу

Число элементов списка, хранимое в памяти. Управляя этим значением, можно существенно повысить быстродействие некоторых операций по работе со списком, например сортировки

Checkboxes

Имеет значение True, если в начале каждой строки списка отображается флажок

ColumnClick

Имеет значение True, если заголовкам столбцов разрешено работать в режиме кнопок: допустимы щелчки на заголовках и обработка этих щелчков. Такая возможность полезна для сортировки содержимого списка щелчком на его заголовке

FlatScrollBars

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

FullDrag

Имеет значение True, если разрешается полностью перерисовывать заголовки столбцов во время перетаскивания, а не только отображать границы

GridLines

Имеет значение True, если между элементами списка рисуются разделительные линии

HideSelection

Имеет значение True, если выделение текущего элемента списка автоматически сбрасывается при переключении фокуса на другой элемент формы. Такая возможность используется, когда ведется одновременная работа с несколькими списками, что позволяет быстро определить, какой список имеет фокус

HotTrack

Имеет значение True, если выбор элемента осуществляется наведением на него указателя (без щелчка)

HotTrackStyles

Если значение свойства HotTrack равно True, то способ выделения элемента определяется комбинацией значений данного свойства (множества).

Возможные значения — htHandPoint (указатель мыши принимает вид руки),

htUnderLineCold (невыделенные элементы подчеркиваются), htUnderLineHot

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

HoverTime

Если значение свойства HotTrack равно True, то данное свойство определяет время (в миллисекундах), по истечении которого после наведения на него указателя элемент будет считаться выделенным

IconOptions

Способ упорядочения значков в списке. Имеет три подсвойства.

Подсвойство Arrangement определяет порядок выравнивания (слева направо или сверху вниз), Подсвойство AutoArrange определяет, будут ли значки переупорядочиваться автоматически. Подсвойство WrapText определяет, будет ли заголовок выравниваться по ширине значка илирасполагаться слева от него

LargeImages

Список картинок-значков. Стиль отображения определен значением vsIcon

MultiSelect

Имеет значение True, если разрешается выбирать несколько элементов списка

OwnerData

Имеет значение True, если обработка содержимого списка выполняется в тексте программы. Подобный список называется виртуальным, и разработчик берет на себя программирование его основных функций,связанных с динамическим формированием значений элементов.Это требуется при обработке больших наборов данных

OwnerDraw

Имеет значение True, если рисование списка и его элементов явно выполняется в тексте программы по алгоритму разработчика

RowSelect

Имеет значение True, если разрешается выделять целую строку списка

ShowColumnHeaders

Имеет значение True, если отображаются заголовки столбцов

SmallImages

Список картинок-значков. Стиль отображения определен значением,отличающимся от vsIcon

SortType

Способ автоматической сортировки списка. Возможные значения — stNone (сортировка не выполняется), stData (сортировка выполняется на основе значений свойства Data каждого элемента списка), stText (сортировка выполняется на основе значений свойства Caption каждого элемента списка), stBoth (сортировка выполняется на основе значений как свойства Data, так и свойства Caption)

Statelmages

Список картинок, отражающих промежуточное состояние объекта

 

ВНИМАНИЕ Общая идеология работы данного компонента не меняется при переходе к различным формам его внешнего представления и отражает работу папок Windows 9x. В крайнем левом столбце отображается значок, затем идут его имя и свойства. Над каждым столбцом выводится заголовок. В режиме vsReport самый левый столбец (с номером 0) содержит имя элемента, а все последующие — именно его свойств, что соответствует классическому представлению файлов папки.

 

Пример:

 

Рассмотрим работу списка элементов в различных режимах на примере. Заранее надо подготовить три набора картинок (значков) по три элемента в каждом. Они

будут указаны в свойствах LargeImages, SmallImages и StateImages.

Установим для свойства ViewStyle значение vsReport. Редактируя свойство Columns,

создадим три столбца: КО, К1 и К2 (рис. 4.21, стр 287).

С помощью редактора свойства Items добавим три элемента Э1, Э2 и Э3, каждый из

которых будет иметь по два подсвойства СЭ*1 и СЭ*2. Звездочкой здесь обозначен

номер элемента (рис. 4.22, стр 287).

Укажем для каждого элемента номер его картинки. Список примет вид, показан-

ный на рис. 4.23, стр 287.

 

Теперь можно откомпилировать и запустить программу. Размеры столбцов регулируются с помощью мыши стандартным способом.

Добавим на форму четыре кнопки. Каждая из них будет отвечать за представление

списка в ином режиме.

procedure TForrnl.ButtonlClick (Sender: TObject),-

begin

ListViewl.ViewStyle:= vsReport;

end;

procedure TForml.Button2Click(Sender: TObj ect);

begin

ListViewl.ViewStyle:= vsIcon;

end;

procedure TForml.Button3Click(Sender: TObject];

begin

ListViewl.ViewStyle:= vsSmallIcon;

end;

procedure TForml. Button4Click (Sender: TObject),-

begin

ListViewl.ViewStyle:= vsList;

end;

Как только изменяется значение свойства ViewStyLe, тут же изменяется и внешний

вид списка.

Теперь научимся заполнять список динамически, во время работы программы. Допустим, требуется показывать содержимое заданного каталога: список имен всех вложенных каталогов и файлов с их характеристиками (датой создания, размером и признаками "скрытый" и "системный"). Таким образом, всего столбцов в списке будет пять, а сам список будет работать в режиме vsReport.

Создадим новое приложение и разместим на нем пустой список, текстовое поле и

кнопку. Для визуального разделения файлов и папок подготовим список (ImageList)

из двух маленьких значков, первый из которых (под номером 0) соответствует файлу,

а второй (под номером 1) — папке.

В обработчике создания формы сформируем структуру списка и определим его

внешний вид. Для добавления и настройки свойств нового столбца используется

метод Add свойства Columns, который создает новый объект класса TListColumn и

возвращает ссылку на него. Заключительный цикл устанавливает ширину каждого

столбца равной 150 пикселам.

procedure TForml.FormCreate(Sender: TObj e c t);

var NewColunm: TListColumn;

i: integer;

begin

with ListViewl do

begin

ViewStyle: = vsReport;

NewColumn:= Columns.Add;

NewColumn.Caption:= 'Название';

NewColumn:= Columns.Add;

HewColumn.Caption:= 'Дата создания';

NewColumn:= Columns.Add,-

NewColumn.Caption:= 'Размер, байтов';

NewColumn:= Columns.Add;

HewColumn.Caption:= 'Скрытый';

NewColumn;= Columns.Add,-

NewColumn.Caption:= 'Системный';

for i:= 0 to 4 do

Columns[i].Width:= 100;

end

end;

Перебор файлов будем выполнять с помощью функций Find First/Find Next, Для этого

подготовим процедуру (метод формы TForml), которая будет записывать содержи-

мое структуры TSearchRec в конец списка.

procedure TForml.AddNewFile(F: TSearchRec);

begin

with ListViewl.Items.Add, F do

begin

Caption:= Name;

if (Attr and faDirectory) о О

then Imagelndex:= 0

else Imagelndex:= 1;

SubItems.Add(DateTimeToStr((FileDateToDateTime(Time))));

SubItems.Add(IntToStr(Size));

if (Attr and faHidden] о О

then SubItems.Add('да')

else SubItems.Add ('нет');

if (Attr and faSysFile) о О

then SubItems.Add('да')

else SubItems.Add('нет');

end;

end;

В операторе with используются два параметра. Первый, представляющий собой экземпляр класса TListItem, создается динамически с помощью метода Add, а второй описывает текущую структуру TSearchRec, из которой необходимо извлечь нужную информацию для списка.

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

номер картинки в зависимости от типа файла (каталог или обычный файл). Далее

новые строки добавляются с помощью метода Add свойства SubItems, принадлежащего

свойству Items, У этого метода один параметр — текстовая спрока, записываемая в свойство Caption. Ее содержимое зависит от наличия или отсутствия различных

характеристик у анализируемого файла.

В поле Editl будет вводиться полный путь поиска для каталога и маска файла, например С:\*.*. Содержимое этого каталога будет отображаться после щелчка на кнопке

Button1. Вот обработчик этого события.

procedure TForml.ButtonlClick(Sender: TObject);

var F: TSearchRec;

fa: integer;

begin

fa:= faAnyFile;

if FindFirst(Edit 1.Text, fa, F] <> 0 then Exit;

AddNewFile(F);

while FindNext(F) = 0 do

AddNewFile(F);

FindClosefF);

end;

После запуска программы и щелчка на кнопке Buttonl будет получен результат,

подобный изображенному на рис. 4.24, стр 290.

Папки и файлы здесь расположены вперемешку. Это неправильно. Их надо отсорти-

ровать в соответствии с номерами картинок: первыми должны идти папки (значе-

ние свойства ImageIndex равно 0), за ними — обычные файлы. Сортировка в классе

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

все элементы в списке в порядке "возрастания" их имен, если для объекта ListViewl

не определен обработчик события OnCompare (Сравнить два элемента). Если же он

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

Сформируем такой обработчик. Два объекта, Iteml и Item2, будут сравниваться по

значениям свойства Imagelndex. Б параметр Compare записывается отрицательное

число, если первый объект "меньше" второго; 0, если они равны; положительное

число, если первый объект "больше" второго.

procedure TForml.ListViewlCompare(Sender: TObject; Iteml, Item2: TListItem; Data: Integer;

var Compare: Integer);

Begin

if Iteml.Imagelndex = Item2.Imagelndex

then Compare := 0 else

if Iteml.Iraagelndex < Itern2.Imagelndex

then Compare:= -1

else Compare:- +1

end;

Осталось только добавить в конец метода ButtonlClick вызов сортировки.

ListViewl.AlphaSort;

Теперь каталоги будут отображаться в списке первыми.

Класс TListView содержит немало дополнительных возможностей. В частности, каж-

дый элемент списка (класс TListltem) имеет свойство Data (тип Pointer), в котором

может храниться произвольная информация, связанная с конкретным элементом.

 

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

TListView (приведены ниже). Некоторые методы (например, получение элемента,

ближайшего к указанной точке клиентской области) могут показаться на первый

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

та — работа в стиле папок Windows 9x, когда пользователь может щелкать на значке или рядом с ним.

procedure Arrange(Code: TList Arrangement);

Задает способ выравнивания значков, когда значение свойства ViewStyle равно vsIcon или

VsSmallIcon

function FindCaption (StartIndex: Integer;Value: string;Partial,Inclusive, Wrap: Boolean):TListltem;

Поиск элемента списка, заголовок которого совладает со значением параметра Value. Если параметр Inclusive имеет значение True, то поиск выполняется начинал с элемента с номером, хранящимся в параметре Startlnde x. При этом, если параметр Wrap также имеет значение True, то поиск по достижении конца списка продолжается c его начала. Параметр Partial разрешает не искать полное совпадение заголовков, а использовать значение Value как подстроку

function FindData(Startlndex: Integer; Value: Pointer;Inclusive, Wrap: Boolean): TListltem;

Аналогично предыдущему, только производится сравнение не заголовков, а связанных с объектом данных (свойство Data)

function GetHitTestInfoAt(X, Y: Integer):THitTests;

Возвращает подробную информацию об указанной точке клиенткой области. Тип THitTests описывает различные местоположения точки

function GetItemAt(X, Y: Integer): TListItem;

Возвращает элемент списка, области которого принадлежит указанная точка

function GetNearestltem(Point: TPoint;Direction: TSearchDirection): TListltem;

Возвращает элемент списка, ближайший к указанной точке по заданному направлению

(параметр Direction)

function GetNextItem(StartItem: TListItem;Direction: TSearch Direction; States: TItemStates): TListItem;

Возвращает элемент списка, следующий за указанным в параметре StartItem в направлении Direction. Если используется список StateImages, то можно учитывать и наличие свойства State

function GetSearchString: String;

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

procedure Scroll(DX, DY: Integer);

Прокрутка содержимого списка на DX пикселов по горизонтали и DY пикселов по вертикали

function StringWidth(S: string): Integer;

Возвращает ширину строки S в пикселах с учетом текущего шрифта списка

procedure UpdateItems(FirstIndex, LastIndex: Integer);

Перерисовка диапазона элементов списка в диапазоне от FirstIndex до LastIndex



Поделиться:


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

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