限制 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)
。
如何在 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)
。