第2点已经解决
JSControls.DataViewAttributes.ReadOnlyColor
第1点用
TDataField.ReadOnly or (not TDataField.CanModify)不能完全解决问题,对计算字段本来就不允许改的字段不起作用,急待解决方案
源代码:
begin
lField:= lDataSet.FindField(TDataGridColumn(AColumn).FieldName);
if lField<>nil then
begin
if lField.ReadOnly or (not lField.CanModify) then
AColor:= JSControls.DataViewAttributes.ReadOnlyColor;
end;
简单做了一个测试,不知道是否是你要的效果。
其中单价和规格是只读字段,表达式字段也只读。
procedure TZDDZDSXHQBGWD.DataGridCustomDrawCell(Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TTreeListNode; AColumn: TTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean; var AText: string; var AColor: Integer; AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
var
lField : TDataField;
i : Integer;
begin
for i := 0 to DataGrid.ColumnCount - 1 do
begin
//lField.FieldKind
lField := TSQLDataSet(DataSetBrokerBZSJJ1.DataSet).FieldByName(DataGrid.Columns.FieldName);
if lField <> nil then
begin
if lField.FieldKind = TFieldKind.fkData then
begin
if (lField.ReadOnly) or (not lField.CanModify) then
DataGrid.Columns.Color := Business.System.Graphics.clRed;//JSControls.DataViewAttributes.ReadOnlyColor; //取只读颜色
end
else
DataGrid.Columns.Color := Business.System.Graphics.clRed;//JSControls.DataViewAttributes.ReadOnlyColor; //取只读颜色
end;
//lField := DataGrid.
end;
end;