If (значение in State) then Выполнить действие

Именно так я проверяю во второй строчке кода наличие значения gdFocused. И только если ячейка, которую надо прорисовать имеет фокус, выполняю следующие действия. Но перед этим я прячу нашу маскированную строку ввода, потому что она могла находиться видимой в другой ячейке, и чтобы не было проблем, лучше её спрятать.

Если рисуемая ячейка в фокусе, то я проверяю, в какой колонке находиться рисуемая ячейка. Если это первая колонка (где мы должны вводить дату), то я должен показать DateEdit на месте рисуемой ячейки. Для этого я сначала присваиваю в DateEdit текст, который должен находиться в данной ячейке. Затем устанавливаю позицию и размеры компонента DateEdit, и только потом показываю его.

Как видишь, способ очень простой и элегантный. Теперь осталось только создать обработчик события OnChange для компонента DateEdit. Это событие происходит, когда данные в строке ввода изменились, а это значит, что нам их надо сразу же прописать в редактируемую ячейку сетки иначе они потеряются. Это потому что все данные вводятся в DateEdit, а не в сетку, а переносить мы их должны вручную.

procedure TMainForm.DateEditChange(Sender: TObject); begin StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:=DateEdit.Text; end;

Чтобы ещё больше закрепить материал, я сделал в последней колонке появление компонента TCheckBox, по которому можно менять значение в ячейке между «Женат» и «Холост». Как это сделано я объяснять не буду, попробуй разобраться сам, потому что код практически идентичный. А я только дам исходник:

Для начала на форму надо бросить компонент CheckBox и сделать его невидимым. Потом надо изменить событие OnDrawCell:

procedure TMainForm.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);