События
OnSelectCell возникает в момент выбора пользователем ячейки.
Если вам надо обеспечить редактирование не всех, а только отдельных ячеек, это можно сделать в обработчике события OnSelectCell, которое происходит в момент переключения фокуса в ячейку. Заголовок обработчика имеет вид:
procedure TForm1.StringGrid1SelectCell(Sender: TObject;
ACol, ARow: Integer; var CanSelect: Boolean);
Параметры ACol и ARow – индексы столбца и строки ячейки, начинающиеся с 0. Параметр CanSelect указывает, разрешается ли передать фокус в ячейку. По умолчанию CanSelect = true, но если задать в обработчике события CanSelect = false , то ячейку будет невозможно выделить.
Ниже в качестве примера приведен обработчик события OnSelectCell, обеспечивающий возможность редактирования только столбца с индексом 1:
if(ACol = 1)
then StringGrid1.Options := StringGrid1.Options + [goEditing]
else StringGrid1.Options := StringGrid1.Options - [goEditing];
В этом операторе для столбца с индексом 1 в свойство Options вводится опция goEditing, а для остальных столбцов она удаляется из множества Options.
OnSetEditText – Событие происходит, когда пользователь редактирует значение ячейки таблицы.
Если вы разрешили пользователю редактировать таблицу TStringGrid, то можно организовать контроль вводимых символов. Для этого используется обработчик события OnSetEditText, заголовок которого имеет вид:
procedure TForm1.StringGrid1SetEditText(Sender: TObject;
ACol, ARow: Integer; const Value: String);
Параметры ACol и ARow – это индексы столбца и строки ячейки, начинающиеся с 0. А в параметре Value можно прочитать текст ячейки, и проанализировать его.
Пусть, например, в столбец с индексом 3 пользователь может ввести только число - целое или действительное. Это можно сделать следующим образом:
procedure TForm1.StringGrid1SetEditText(Sender: TObject;
ACol, ARow: Integer; const Value: String);
begin
if(ACol = 3) then
try
StrToFloat(Value+'1'); // +1 для того, чтобы корректно обработать пустую строку и,
//чтобы было возможно ввести вещественое число, начинающееся с ','
except
ShowMessage('Ошибка ввода');
end;
end;
Если анализируется ячейка столбца с индексом 3 и в ячейке уже что-то написано, то делается попытка перевести функцией StrToFloat этот текст в число. Если в результате генерируется исключение, пользователю сообщается о неверно введенном символе.
OnGetEditText – Наступает при начале редактирования и позволяет задать текст встроенного в ячейку редактора. Наступает только если Options включает опцию goEditing
Если вы разрешили пользователю редактировать таблицу TStringGrid, то можно задавать начальные тексты при редактировании разных ячеек. Для этого используется обработчик события OnGetEditText, заголовок которого имеет вид:
procedure TForm1.StringGrid1GetEditText(Sender: TObject;
ACol, ARow: Integer; var Value: String);
Параметры ACol и ARow – это индексы столбца и строки ячейки, начинающиеся с 0. А в параметре Value можно прочитать текст ячейки, и занести в этот же параметр новый текст.
Пусть, например, вы хотите, чтобы в ячейки столбца с индексом 2 пользователь заносил почтовый индекс. И если он еще ничего не заносил в ячейку, то вы хотите, чтобы ему был показан текст: "Индекс:". Это можно сделать следующим образом:
procedure TForm1.StringGrid1GetEditText(Sender: TObject;
ACol, ARow: Integer; var Value: String);
begin
if(ACol = 2) and (Value = '')
then Value := 'Индекс:';
end;
Пример перевода содержимого ячейки в верхний регистр, когда пользователь начнет ее редактировать:
procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol,
ARow: Integer; var Value: String);
begin
Value := AnsiUpperCase(Value);
end;
Вначале редактирования содержимое ячейки отобразится в верхнем регистре, затем ввод текста будет осуществляться в том регистре, в котором пользователь набирает текст.
OnGetEditMask – Наступает при начале редактирования и позволяет задать маску встроенного в ячейку редактора. Наступает только если Options включает опцию goEditing.
Если вы разрешили пользователю редактировать таблицу TStringGrid, то можно задать маску редактирования. Для этого используется обработчик события OnGetEditMask, заголовок которого имеет вид:
procedure TForm1.StringGrid1GetEditMask(Sender: TObject;
ACol, ARow: Integer; var Value: String);
Параметры ACol и ARow – это индексы столбца и строки ячейки, начинающиеся с 0. А в параметр Value можно задать маску редактирования.
Пусть, например, в столбце с индексом 1 пользователь должен записывать номера телефонов. Тогда обработчик события OnGetEditMask может иметь вид:
procedure TForm1.StringGrid1GetEditMask(Sender: TObject;
ACol, ARow: Integer; var Value: String);
begin
if(ACol = 1)
then Value := '!тел: \(999\) 000-00-00;1;_';
end;
При переходе в режим редактирования пользователь увидит маску вида:
тел: (___) ___-__-__
При этом он не сможет вводить символы, отличающиеся от цифр номера телефона. После окончания редактирования текст в ячейке может иметь вид:
тел: (495) 123-45-67
Задание маски можно сочетать с заданием начального варианта текста в обработчике события OnGetEditText. Например, можно задавать в качестве начального приближения код города 056:
procedure TForm1.StringGrid1GetEditText(Sender: TObject;
ACol, ARow: Integer; var Value: String);
begin
if(ACol = 1) and ((Value = 'тел: ( ) - - ') or
(Value = ''))
then
Value := 'тел: (056)';
end;
В этом коде проверяется, редактируется ли ячейка первого столбца и не введен ли уже какой-то номер телефона. Если не введен, то в маску записывается код города 056. Обратите внимание, что значение параметра Value при наличии маски и отсутствии введенного номера равно строке, содержащей символы, фигурирующие в маске, и пробелы на месте тех символов, которые будут вводиться.
OnDrawCell – Наступает при прорисовке каждой ячейки.
В ряде случаев желательно выделить цветом текст или фон некоторых ячеек таблицы TStringGrid. Это можно сделать в обработчике события OnDrawCell.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Параметры ACol и ARow указывают индексы столбца и строки (отсчитываются от 0). Параметр Rect - это прямоугольная область канвы, соответствующая перерисовываемой ячейке. Параметр State указывает состояние ячейки: gdSelected - выделена, gdFocused - находится в фокусе, gdFixed - расположена в фиксированной области таблицы.
Ниже приведен пример обработчика события OnDrawCell, задающего красный цвет текстов в ячейках второго столбца (его индекс 1), начиная со второй строки:
procedure TForm1.StringGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
begin
if(ACol = 1) and (ARow > 0)
then begin
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.Font.Color := clRed;
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top,
StringGrid1.Cells[ACol, ARow]);
end;
end;
В примере используется свойство Canvas типа TCanvas – поверхность (холст, канва) для рисования.
Если ячейка соответствует сформулированным выше требованиям, то сначала методом канвы FillRect стирается текст, отображенный в ячейке до момента наступления данного события. Затем цвет шрифта меняется на красный и методом канвы TextOut отображается текст ячейки.
Ниже приведен текст примера, в котором выделение осуществляется не цветом текста, а цветом фона:
procedure TForm1.StringGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
begin
if(ACol = 1) and (ARow > 0)
then begin
StringGrid1.Canvas.Brush.Color := clRed;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top,
StringGrid1.Cells[ACol, ARow]);
end;
end;
Если пользователю разрешено перемещать столбцы таблицы (в свойстве Options задана опция goColMoving), то приведенные коды обеспечивает выделение цветом столбца с фиксированным индексом - в данных примерах 1. Это плохо, так как, наверное, при перемещении столбца должно вместе с ним перемещаться и выделение. Для этого достаточно ввести переменную S, в которой записать заголовок столбца, и заменить оператор if следующим:
if (StringGrid1.Cells[ACol, 0] = S) and (ARow > 0)
OnColumnMoved – Происходит сразу после изменения позиции колонки.
OnRowMoved – Событие наступает сразу после изменения позиции ряда.
Методы
MouseToCell
procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
Возвращает индексы строки и столбца ячейки, которая содержит точку с заданными координатами экрана (X,Y). Используется для идентификации ячейки под курсором мыши
MouseCoord
function MouseCoord(X, Y: Integer): TGridCoord;
где TGridCoord = record
X: Longint;
Y: Longint; end;
Возвращает в виде структуры индексы строки и столбца ячейки, которая содержит точку с заданными координатами экрана. Используется для идентификации ячейки под курсором мыши
