简体   繁体   中英

Limit maximum text length of the inplace editor in TDBGrid

How can I limit the maximum text length of the inplace editor in TDBGrid ? (Delphi Berlin)

The Data Type is Float.

The inplace editor in a TDBGrid will update its content by calling

procedure TInplaceEdit.UpdateContents;
begin
  Text := '';
  EditMask := Grid.GetEditMask(Grid.Col, Grid.Row);
  Text := Grid.GetEditText(Grid.Col, Grid.Row);
  MaxLength := Grid.GetEditLimit;
end;

Where GetEditMask is implemented the following way:

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;

and GetEditLimit like this:

function TCustomDBGrid.GetEditLimit: Integer;
begin
  Result := 0;
  if Assigned(SelectedField) and (SelectedField.DataType in [ftString, ftWideString]) then
    Result := SelectedField.Size;
end;

There you have multiple ways to get to the desired behavior I think.

  • Use TField EditMask property for the Field you want to restrict. This will be returned by Grid.GetEditMask call. No need to inherit from TDBGrid and override anything. Behavior can be controlled on a by-field-basis.

  • Create your own TDBGrid descendant where you override GetEditLimit to return a MaxLength for the inplace editor depending on SelectedField

Code for approach 1 could look like this:

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

This will mask will require two digits before and after the decimal seperator. See TEditMask for more on masks.

For approach 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;

Like kobik suggests, you can then use this class as interposer class. To do this, add TDBGrid = class(TMyDBGrid); in the unit you want to use that grid. If you declared TMyDBGrid in the same unit you want to use it, make the type reference clear TMyDBGrid = class(Vcl.DBGrids.TDBGrid) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM