如何在 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
方法 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/