There are several ways to do that but none is optimal.
1. register custom editor classes that reject the changes, by overriding isReadOnly().
2. set the "Enabled" property to false. Note that then you loose the ability scroll.
3. in your setters, ie the setters of the properties that are inspected reject the changes if they are made from the inspector, e.g use a global.
I would go for solution 1 although this requires to write a bit of code.
Example for integers:
TReadOnlyIntegerEditor = class(TIntegerPropertyEditor)
function IsReadOnly: boolean; override;
end;
function TReadOnlyIntegerEditor.IsReadOnly: boolean;
begin
result := true;
end;
initialization
RegisterPropertyEditor(TypeInfo(integer), nil, '', TReadOnlyIntegerEditor);
end.
and you need to do that for every type presents in your objects that are set as TIObject of the grid. Maybe use the generics to make this less repetitive.