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

Limit maximum text length of the inplace editor in TDBGrid

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

数据类型为浮点型。

TDBGrid 中的就地编辑器将通过调用

更新其内容
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 调用 return 编辑。无需继承自 TDBGrid 并覆盖任何内容。可以按字段控制行为。

  • 在您覆盖 GetEditLimit 的位置创建您自己的 TDBGrid 后代 return 就地编辑器的 MaxLength 取决于 SelectedField

方法 1 的代码可能如下所示:

// Opening of dataset
...
DataSet.FieldByName('FloatField').EditMask := '00.00';

此掩码将要求小数点分隔符前后两位数。有关面具的更多信息,请参阅 TEditMask

对于方法 2:

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;

正如 kobik 所建议的那样,您可以使用此 class 作为插入器 class。为此,请在要使用该网格的单元中添加 TDBGrid = class(TMyDBGrid);。如果您在要使用的同一单元中声明了 TMyDBGrid,请明确类型引用 TMyDBGrid = class(Vcl.DBGrids.TDBGrid)