... Implementation {$R *.dfm} Var IsAlreadySubclassing: Boolean = False; ... Function NewEditProc(Window: HWND; uMsg: UINT; WindowParametr: WPARAM; lParam:LPARAM): Integer; Stdcall; Const MIN_VALUE = -99; MAX_VALUE = 99; Var Col, Row: Integer; Begin Col := frmMain.strgrSequence.Col; Row := frmMain.strgrSequence.Row; If uMsg = WM_PASTE Then Begin Try If (StrToInt(Clipboard.AsText) < MIN_VALUE) Or (StrToInt(Clipboard.AsText) > MAX_VALUE) Then Begin Application.MessageBox(Pchar('В буфере обмена содержится неподходящее значение!'), 'Ошибка', MB_ICONWARNING); Exit; End Else Begin frmMain.strgrSequence.Cells[Col, Row] := Clipboard.AsText; //отобразится в ячейке только когда сменишь фокус. //Т.е.кликнуть куда-то надо после вставки Exit; End; Except Application.MessageBox(Pchar('В буфере обмена находятся неподходящие данные!'), 'Ошибка', MB_ICONWARNING); Exit; End; End Else Result := CallWindowProc(Pointer(GetWindowLong(Window,GWL_USERDATA)), Window, uMsg, WindowParametr, lParam); End; Procedure TfrmMain.strgrSequenceGetEditText(Sender: TObject; ACol, ARow: Integer; Var Value: String); Var Window: HWND; begin If Not IsAlreadySubclassing Then // Если сабклассинга не было, то сабклассим. Иначе - ничего,т.к. уже сделано Begin Window := GetWindow(strgrSequence.Handle, GW_CHILD); If IsWindow(Window) Then SetWindowLong(Window,GWL_USERDATA,SetWindowLong(Window, GWL_WNDPROC, LPARAM(@NewEditProc))); IsAlreadySubclassing := True; End; End; ...