如何在TDBGrid
中限制就地编辑器的最大文本长度? (德尔福柏林)
数据类型为Float。
答案 0 :(得分:7)
TDBGrid
中的inplace编辑器将通过调用
procedure TInplaceEdit.UpdateContents;
begin
Text := '';
EditMask := Grid.GetEditMask(Grid.Col, Grid.Row);
Text := Grid.GetEditText(Grid.Col, Grid.Row);
MaxLength := Grid.GetEditLimit;
end;
以下列方式实施GetEditMask
:
function TCustomDBGrid.GetEditMask(ACol, ARow: Longint): string;
begin
Result := '';
if FDatalink.Active then
with Columns[RawToDataColumn(ACol)] do
if Assigned(Field) then
Result := Field.EditMask;
end;
和GetEditLimit
是这样的:
function TCustomDBGrid.GetEditLimit: Integer;
begin
Result := 0;
if Assigned(SelectedField) and (SelectedField.DataType in [ftString, ftWideString]) then
Result := SelectedField.Size;
end;
我认为你有多种方法可以达到理想的行为。
对要限制的字段使用TField
EditMask
属性。这将由Grid.GetEditMask调用返回。无需从TDBGrid继承并覆盖任何内容。可以在逐场的基础上控制行为。
创建您自己的TDBGrid
后代,覆盖GetEditLimit
根据{{1}}
方法1的代码可能如下所示:
SelectedField
这将掩盖在小数分隔符之前和之后需要两位数。有关蒙版的更多信息,请参阅TEditMask
。
方法2:
// Opening of dataset
...
DataSet.FieldByName('FloatField').EditMask := '00.00';
就像kobik建议的那样,你可以将这个类用作插入类。为此,请在要使用该网格的单元中添加uses
Data.DB,
Vcl.DBGrids;
type
TMyDBGrid = class(TDBGrid)
protected
function GetEditLimit: Integer; override;
end;
implementation
{ TMyDBGrid }
function TMyDBGrid.GetEditLimit: Integer;
begin
Result := inherited GetEditLimit;
if (Result = 0) and Assigned(SelectedField) and (SelectedField.DataType = ftFloat) then
Result := 5; // Whatever you decide
end;
。如果您在要使用的同一单位中声明TDBGrid = class(TMyDBGrid);
,请将类型参考设为明确TMyDBGrid
。