Собственно вот что у меня получилось:
Код: Выделить всё
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
const
// собственно длина каждой строки
lengtharr: array [1..16] of integer = (50,30,50,50,40,40,1,6,6,6,4,4,4,4,4,100);
// коды разрешённых клавиш
acceptarr: array [1..31] of word = (8,9,13,16,17,18,20,27,33,34,35,36,37,38,39,40,46,44,145,19,144,112,113,114,115,116,117,118,119,120,121);
// проверка - есть ли клавиша среди разрешённых
function InArr(value:integer):boolean;
var i:integer;
r:boolean=false;
begin
i:=Low(acceptarr);
while i<=High(acceptarr) do
if acceptarr[i]=value then begin r:=true; break; end
else inc(i);
InArr:=r;
end;
begin
with StringGrid1 do begin
case Col of
1: if (UTF8Length(Cells[Col,Row])>=lengtharr[Row]) and not InArr(Key) then Key:=0;
2: if (UTF8Length(Cells[Col,Row])>=100) and not InArr(Key) then Key:=0;
end;
end;
end;
... остается только обработать вставку текста из буфера... это можно и валидацией.
Добавлено спустя 4 минуты 3 секунды:а может как-нибудь можно эту самую вставку из буфера отследить? через clipbrd например? или может ещё как?