Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OAP(теория).doc
Скачиваний:
49
Добавлен:
15.02.2016
Размер:
687.62 Кб
Скачать

14-16 StringGrid.

Компонент StringGrid находится на странице Additionalпалитры компонентов. Там находятся "дополнительные" компоненты, но StringGrid Delphi, на мой взгляд, достоин большего уважения, лично я разместил бы его на странице Standart!    StringGrid - компонент для отображения различных данных в табличной форме. Как следует из названия, ячейки компонента StringGrid Delphi могут содержать данные, имеющие тип String, а также отображать графику.

Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows - зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает одно из значений свойства Options.    Итак, компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (ij), где где i - номер столбца, j - номер строки, имеет вид StringGrid1.Cells[i, j] и доступно как для чтения, так и для записи. Здесь, как и всегда, номера столбцов ( i ) и строк ( j ) отсчитываются от 0.    Выделенная ячейка таблицы имеет

номер столбца:

StringGrid1.Col

номер строки:

StringGrid1.Row

поэтому содержимое выделенной ячейки будет адресоваться так:    S:=StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]; Не правда ли, написание такой строки - утомительный процесс. Поэтому пользуйтесь оператором присоединения with:   with StringGrid1 do     S:=Cells[Col, Row]; А лучше сразу задать в свойстве Name имя покороче, например SG.    За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options - это раскрывающийся список, представляющий собой элементы данногомножества. Если значение элемента равно True, то он присутствует в множестве, если False - то нет.

Свойство

Значение

goFixedVertLine

Наличие вертикальных разделительных линий между "фиксированными" ячейками

goFixedHorzLine

Наличие горизонтальных разделительных линий между "фиксированными" ячейками

goVertLine

Наличие вертикальных разделительных линий между "обычными" ячейками

goHorzLine

Наличие горизонтальных разделительных линий между "обычными" ячейками

goRangeSelect

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

goDrawFocusSelected

Закрашивание ячейки с фокусом ввода

goRowSizing

Возможность менять высоту строк мышкой

goColSizing

Возможность менять ширину столбцов мышкой

goRowMoving

Возможность менять номер строки, то есть перемещать её, мышкой

goColMoving

Возможность менять номер столбца, то есть перемещать его, мышкой

goEditing

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

goTabs

При значении True фокус смещается на следующую ячейку в таблице,False - на следующий компонент

goRowSelect

Выделяется вся строка с "фокусированной" ячейкой

goAlwaysShowEditor

При значении True содержимое ячейки при получении фокуса сразу доступно редактированию, False - сначала необходимо щёлкнуть по ней мышкой, либо нажать Enter или F2 (прим.: не действует приgoRowSelect=True)

goThumbTracking

При значении True перемещение "бегунка" прокрутки мышкой вызывает немедленное перемещение ячеек,False - ячейки перемещаются только при отпускании "бегунка"

   Как следует из таблицы, за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент goEditing свойства-множества Options. В Инспекторе Объектов установите его значение вTrue. Чтобы управлять этой возможностью программно, нужно включить или исключить из множества данный элемент: StringGrid1.Options:=StringGrid1.Options+[goEditing];  //Включаем редактирование, другие элементы не трогаем StringGrid1.Options:=StringGrid1.Options-[goEditing];  //Выключаем редактирование, другие элементы не трогаем StringGrid1.Options:=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect];  //Задаём список необходимых элементов    Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным - False.    Ячеек в таблице, как правило, много, и в рамках компонента видна только часть из них. В программе доступна информация как об общем количестве строк и столбцов, так и номерах и количестве строк и столбцов, видимых в рамках таблицы.    Количество строк в Delphi StringGrid равно StringGrid1.RowCount.    Количество столбцов в Delphi StringGrid равно StringGrid1.ColCount.    Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании

StringGrid1.LeftCol

Номер столбца, видимого самым левым

StringGrid1.TopRow

Номер строки, видимой самой верхней

StringGrid1.VisibleColCount

Количество столбцов, видимых в рамках таблицы

StringGrid1.VisibleRowCount

Количество строк, видимых в рамках таблицы

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

DefaultRowHeight - высота строк по умолчанию

DefaultColWidth - ширина столбцов по умолчанию

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

RowHeights[i] - массив, содержащий высоты строк с номером i

ColWidths[i] - массив, содержащий ширины столбцов с номером i

   Все эти свойства настраиваем в обработчике события OnCreate Формы, так же как и надписи заголовков, располагающиеся в строках и столбцах "фиксированной" зоны таблицы. В результате таблица появляется уже в "настроенном" виде!    Отдельно требуется осветить вопрос очистки содержимого таблицы StringGrid. Так как таблицаStringGrid, в отличие от, например, компонента Memo, не имеет метода для очистки содержимого сразу всех ячеек, то для удаления внесённых в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам: var i, j: Integer; begin   with StringGRid1 do     for i:=1 to RowCount-1 do   //Заголовки строк не трогаем     for j:=1 to ColCount-1 do   //Заголовки столбцов не трогаем       Cells[j, i]:=''; end;     Хотя, оказывается, есть метод для очищения содержимого целого столбца или строки:   StringGrid1.Cols[i].Clear; //Очищается столбец с номером i   StringGrid1.Rows[i].Clear; //Очищается строка с номером i     Очевидно, очищение этими методами гораздо быстрее. Однако будут очищены и ячейки фиксированной зоны, содержащие, например, названия строк и столбцов, которые удалять не нужно. Их после очистки нужно просто "написать" заново, на глаз эта манипуляция совершенно незаметна. Для очистки всей таблицы достаточно последовательно очистить только строки или только столбцы: var i, j: Integer; begin   with StringGRid1 do     for i:=1 to RowCount-1 do  //Заголовки столбцов не трогаем - цикл от 1       begin         Rows[i].Clear;   Cells[0, i]:="Заголовок строки i";       end; end;     Казалось бы, можно поступить и по-другому, просто обнулить количество строк или столбцов! Однако так делать неправильно, так как при их последующем добавлении может оказаться, что каждая ячейка содержит прежние данные. А в Delphi4 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.

Компонент StringGrid умеет не хранить в своих ячейках не только текстовую информацию, но и графику. Графические возможности StringGrid определяются наличием у таблицы свойстваCanvas - холста, на котором можно воспроизводить любую графику стандартными методами Delphi. Кроме того, компонент StringGrid имеет дополнительные методы, помогающие выводу графики в ячейки компонента. Графическими методами в таблице StringGrid можно, например, выводить текст в ячейке не только в одну, но и в несколько строк, произвольно раскрашивать ячейки, размещать рисунки и т.д.    Работа с графическими свойствами компонента StringGrid происходит в обработчике OnDrawCell. По событию OnDrawCell происходит перерисовка таблицы, и следовательно, код в обработчике этого события будет управлять выводом на холст таблицы необходимой графики. Переменные этого обработчика помогут определить и прямоугольник, в котором будет происходить вывод графики: procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;   Rect: TRect; State: TGridDrawState); begin   //ACol - индекс столбца   //ARow - индекс строки   //Rect - прямоугольник вывода, заданный ячейкой (ACol, ARow) end;    Для начала давайте выведем в ячейку (1, 1) компонента StringbGrid какой-нибудь рисунок. Вывести рисунок в ячейку компонента StringGrid проще всего, предварительно загрузив его в компонент Image: Image1.Picture.LoadFromFile('Имя_файла');    Загрузить рисунок в компонент Image можно, конечно, уже на этапе проектирования, в Инспекторе Объектов, вызвав графический редактор нажатием кнопочки в свойстве Picture.    Затем нужно определить размеры загруженного рисунка: W:=Image1.Picture.Width; H:=Image1.Picture.Height;    Далее, готовим ячейку под размещение рисунка. Для этого нужно задать её размеры кратными размерам рисунка. Например, сделаем размеры ячейки в 10 раз меньше размеров рисунка: StringGrid1.ColWidths[1]:=Round(W/10); StringGrid1.RowHeight[1]:=Round(H/10);    Все эти манипуляции делаем предварительно, в обработчике OnCreate Формы, например. Ну и, наконец, в обработчике OnDrawCell выводим рисунок: procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;   Rect: TRect; State: TGridDrawState); begin if ACol*ARow=1 then //Условие ACol*ARow=1 тождественно (ACol=1)and(ARow=1)   StringGrid1.Canvas.StretchDraw(Rect, Image1.Picture.Graphic); end;    Таким образом, при перерисовке таблица просматривает все ячейки и, встретив комбинацию ACol=1 и ARow=1, выводит в эту ячейку рисунок.    Таким же способом можно и раскрасить заданные по любому условию ячейки в нужные цвета. Например, раскрасим ячейки с положительными числами в зелёный цвет, с отрицательными - в красный, с равными нулю в синий: procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;   Rect: TRect; State: TGridDrawState); var X: Real; begin with StringGrid1 do   begin    try     X:=StrToFloat(Cells[ACol, ARow]);     if X>0 then Canvas.Brush.Color:=clGreen;     if X<0 then Canvas.Brush.Color:=clRed;     if X=0 then Canvas.Brush.Color:=clBlue;    except    end;    Canvas.FillRect(Rect); //Текст тоже будет закрашен, его нужно перерисовать:    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);   end; end;    Осталось рассмотреть возможности компонента StringGrid по выводу текста в ячейку таблицы в несколько строк. Если строки для вывода уже подготовлены, достаточно просто выводить строки со сдвигом по вертикали на высоту строки. Высота ячейки таблицы должна позволять вывод нескольких строк текста. Например, заголовок первого столбца: //В обработчике OnCreate Формы подготавливаем высоту строки: StringGrid1.RowHeight[0]:=(StringGrid1.Canvas.TexHeight('A')+2)*N; //N - количество строк //теперь в обработчике OnDrawCell выводим текст: if (ACol=1) and (ARow=0) then   begin     Canvas.TextOut(Rect.Left+2, Rect.Top+2, 'Многострочный заголовок');     Canvas.TextOut(Rect.Left+2, Canvas.TextHeight('A')+Rect.Top+2, 'Вторая строка');     Canvas.TextOut(Rect.Left+2, Canvas.TextHeight('A')*2+Rect.Top+2, 'Третья строка');   end;    Разумеется, вывод лучше делать в цикле, заголовки столбцов записать в массив, ну и добавить возможность центрирования заголовка в строке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]