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

数据类型为浮点型。

最佳答案

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 调用返回。无需从 TDBGrid 继承并覆盖任何内容。行为可以在逐场的基础上进行控制。
  • 创建您自己的 TDBGrid 后代,您可以在其中覆盖 GetEditLimit根据 SelectedField
  • 为就地编辑器返回 MaxLength

    方法 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 建议的那样,您可以将此类用作中介层类。为此,请在要使用该网格的单元中添加 TDBGrid = class(TMyDBGrid);。如果您在要使用它的同一单元中声明 TMyDBGrid ,请清除类型引用 TMyDBGrid = class(Vcl.DBGrids.TDBGrid)

    关于delphi - 限制 TDBGrid 中就地编辑器的最大文本长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45584674/

    10-10 10:06