限制TDBGrid中的inplace编辑器的最大文本长度

时间:2017-08-09 07:51:32

标签: delphi tdbgrid

如何在TDBGrid中限制就地编辑器的最大文本长度? (德尔福柏林)

数据类型为Float。

1 个答案:

答案 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}}

  • 返回inplace编辑器的MaxLength

方法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