2017-08-09 48 views
3

インプレースエディタの最大テキスト長を制限するにはどうすればよいですかTDBGrid? (Delphi Berlin)TDBGridのインプレイスエディタの最大テキスト長を制限する

データ型はフロートです。

+3

インプレイスエディタの最大テキスト長を尋ねる場合は、基礎となるフィールドのサイズに依存します。 – Victoria

+0

回答ありがとうございますが、私のデータはFloatで、この方法はうまくいきません。 –

+2

なぜFloatはあなたのqに言及しませんでしたか? – MartynA

答えて

7

TDBGridでのインプレースエディタがGetEditMaskは、次のように実装されている

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

呼び出すことによって、その内容を更新します。このような

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; 

をそこには複数の方法があります私が望んでいる行動に到達する。あなたが制限したいフィールドのための

  • 使用TFieldEditMaskプロパティ。これは、Grid.GetEditMask呼び出しによって返されます。 TDBGridから継承して何もオーバーライドする必要はありません。行動は、フィールドベースで制御することができます。

  • あなたはアプローチ1のためSelectedField

コードに応じて、インプレースエディタのためのMaxLengthを返すようにGetEditLimit をオーバーライドし、独自のTDBGrid子孫はこのようになります作成します。

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

これを小数点のセパレータの前後に2桁の数字が必要です。マスクの詳細については、TEditMaskを参照してください。

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が示唆のように、あなたはその後、インターポーザクラスとしてこのクラスを使用することができます。アプローチ2については

。これを行うには、そのグリッドを使用するユニットにTDBGrid = class(TMyDBGrid);を追加します。 TMyDBGridを同じユニットに使用すると宣言した場合は、型参照を明示的にTMyDBGrid = class(Vcl.DBGrids.TDBGrid)にしてください。

+1

OPまたは読者がそれが動作することを確認した場合、私はそれを+1します(今すぐ試してみる時間はありません)。 – MartynA

+3

私はこれをテストしなかった(私はそれをOPに残す)が、両方の提案がうまくいかない理由はない。 BTW *独自のTDBGridを作成... * - これにインターポーザークラスを使用できます。 – kobik

+0

非常に良い提案は、設計時にグリッドを使用することを容易にし、それを加えました。 – nil

関連する問題