Компоненты Delphi

Компонент StringGrid Delphi




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



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

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

StringGrid Delphi
   Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows - зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает одно из значений свойства Options.

   Итак, компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где 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 - массив, содержащий высоты строк. То есть, например, RowHeights[5] - высота строки с индексом 5
ColWidths - массив, содержащий ширины столбцов. То есть, например, ColWidths[5] - ширина строки с номером 5

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

   Поскольку ячейки компонента StringGrid можно редактировать, точно так же как и строку ввода Edit, то возникает вопрос, можно ли программно установить курсор в заданную позицию в содержимом ячейки? Оказывается, есть такая возможность. Для этого требуются дополнительный тип данных на основе таблицы и вспомогательная процедура:

type TGridCracker = class(TStringGrid);

procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
begin
  Grid.Col := Col;
  Grid.Row := Row;
  with TGridCracker(Grid) do
  InplaceEditor.SelStart := x_pos;
end;

   Теперь можно установить желаемую позицию курсора в ячейке, например, по нажатию кнопки:

procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.SetFocus;
with StringGrid1 do
SetCaretPosition(StringGrid1, Col, Row, 2);
end;

   Правда, ещё один момент! Чтобы код сработал, нужно установить в Инспекторе Объектов значение параметра goAlwaysShoweEditor свойства Options в True. Можно это сделать также и программно, в той же процедуре нажатия кнопки:

StringGrid.Options:=StringGrid.Options+[goAlwaysShoweEditor];

   Отдельно требуется осветить вопрос очистки содержимого таблицы 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 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.

Как узнать координаты ячейки при щелчке мышкой

   Методы таблицы позволяют получить индексы ячейки, по которой производится щелчок мышкой. Индексы ячейки бывают необходимы, например, при использовании контекстного меню таблицы. Когда меню появляется при щелчке правой кнопкой мышки по таблице, во первых, нужно перенести фокус в эту ячейку(сам он туда не пойдёт, проверьте!), и во вторых, обработчику нужно получить содержимое ячейки, а тут без координат данной ячейки не обойтись.

  Возможность получить координаты ячейки доступна в обработчиках событий OnMouseDown и OnMouseUp. Параметры этих событий содержат пиксельные координаты щелчка. Более естественно использовать OnMouseDown, так как это событие наступает раньше. Получив координаты в пикселах, их нужно пересчитать в индексы ячейки. Этим занимается метод таблицы StringGrid - MouseToCell:

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol, ARow: Integer;
begin
  StringGrid1.MouseToCell(X, Y, ACol, ARow);//Получаем индексы ячейки ACol и ARow
  //Перемещаем фокус в ячейку с этими индексами:
  StringGrid1.Col:=ACol;
  StringGrid1.Row:=ARow;
end;


Графические возможности компонента StringGrid

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

Совместная работа StringGrid и Excel

   Очень многие документы создаются и хранятся в формате электронных таблиц Microsoft Excel. Несмотря на то, что эти таблицы обладают возможностями для автоматической обработки документа, нам, дельфистам, гораздо приятнее работать в привычной среде, что которая и обладает к тому же гораздо более развитыми возможностями. Давайте посмотрим, как получать данные из Excel. Естественно, табличные данные будем размещать в привычную нам таблицу StringGrid. А уж в ней мы горы своротим! читать далее...


Обзор компонентов           В начало урока          Страница Additional  

На главную



Вопросы и комментарии (327)      Решение задач в Delphi

Оставить комментарий:

Имя  

Текст комментария