Как я могу ограничить максимальную длину текста встроенного редактора в TDBGrid
? (Дельфи Берлин)
Тип данных — с плавающей запятой.
Как я могу ограничить максимальную длину текста встроенного редактора в 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
, чтобы вернуть 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;
Как предлагает Кобик, вы можете использовать этот класс в качестве класса интерпозера. Для этого добавьте TDBGrid = class(TMyDBGrid);
к единице измерения, которую вы хотите использовать в этой сетке. Если вы объявили TMyDBGrid
в том же блоке, в котором хотите его использовать, сделайте ссылку на тип ясной TMyDBGrid = class(Vcl.DBGrids.TDBGrid)
.