
- •1.Компоненты Button и BitBtn
- •2.Компоненты Edit, label.
- •3. Компоненты ComboBox, ListBox.
- •4. Компоненты CheckBox, RadioButton.
- •5.Компоненты StringGrid, DrawGrid.
- •Как узнать координаты ячейки при щелчке мышкой
- •Графические возможности компонента StringGrid
- •Совместная работа StringGrid и Excel
- •6.Компоненты ScrollBar, TrackBar.
- •7.Компоненты Form, Panel.
- •8.Компоненты Shape, Image
- •9.Компоненты MainMenu, PopupMenu
- •10.Компоненты TabControl, PageControl
- •11.Компоненты FontDialog, ColorDialog
- •12.Функции InputBox, ShowMessage, MessageDlg
5.Компоненты StringGrid, DrawGrid.
омпонент StringGrid находится на странице Additional палитры компонентов. Там находятся "дополнительные" компоненты, но StringGrid Delphi, на мой взгляд, достоин большего уважения, лично я разместил бы его на странице Standart! StringGrid - компонент для отображения различных данных в табличной форме. Как следует из названия, ячейки компонента StringGrid Delphi могут содержать данные, имеющие тип String, а также отображать графику. |
|
|
Таблица 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 - то нет.
|
|
|
Как следует из таблицы, за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент 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 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.