Hola de nuevo:
En el ejemplo que te puse, la comprobación de si es
ReadOnly la efectúa sobre la propiedad SelectedField del DBGrid. Esta propiedad obtiene el valor a partir del DataSet al que está enlazada, de modo que funciona si el campo está definido como
ReadOnly en la Tabla/Consulta correspondiente. Si no quieres cambiarlo allí sino sólo a nivel del Grid, entonces habría que hacer la comprobación sobre la propiedad Columns, tal como indica el código que te pongo corregido:
Código:
procedure TForm1.DBGrid1ColEnter(Sender: TObject);
var
AntIndex : Integer;
begin
AntIndex := CurIndex;
with DBGrid1 do
begin
CurIndex := SelectedIndex;
if ((SelectedField <> nil) AND (SelectedField.ReadOnly)) OR
((Columns[CurIndex] <> nil) AND (Columns[CurIndex].ReadOnly)) then
begin
if AntIndex > CurIndex then
if ValidFieldIndex(CurIndex - 1) then SelectedIndex := CurIndex - 1
else
else if ValidFieldIndex(CurIndex + 1) then SelectedIndex := CurIndex + 1
end;
end;
end;
Ahora hacemos ambas comprobaciones, puesto que si es
ReadOnly en el Dataset, tampoco se podrá editar aunque no lo esté a nivel de columnas en el DBGrid.