2

Devart(Core Lab)TCRDBGrid検索バーに入力されたテキストにアクセスする方法はありますか?

OnKeyDownイベントを実装しようとしましたが、グリッド自体が選択されている場合にのみ、検索フィールドへの入力中にイベントが発生しませんでした。関連性があると思われる他のイベントはありません。

テキストは、TCRDBGridの一部であるがプライベートであるTCRGridTitleEditの一部であるTEditに入っているように見えます。

検索テキストを取得する方法はありますか?

TCFGBGridの例:

+---------+------------+
| UserId  |  UserName  | <- Column titles
+---------+------------+
|[987654] | [        ] | <- Search bar (searching for UserId 987654)
+---------+------------+
| 123456  |  Wile Cau  | <- Data
+---------+------------+
|   ...   |    ...     | <- More data

UserId 987654が存在しない場合、「新しいユーザー987654を作成しますか?」のようなプロンプトを表示したいと思います。UserIdを987654に設定して新しいレコードを作成する可能性があります。

4

1 に答える 1

3

TCRDBGridはソースコードとともに配布されます。ソースコードは次のように変更できます。

イベントタイプを宣言します。

  TOnTextChanged = procedure (Sender: TObject; Text: string) of object;

TCRGridTitleEditクラスにイベント宣言を追加します。

private 
    FOnFilterChanged: TOnTextChanged;
    FOnSearchChanged: TOnTextChanged;

public
    property OnFilterChanged: TOnTextChanged read FOnFilterChanged write FOnFilterChanged;
    property OnSearchChanged: TOnTextChanged read FOnSearchChanged write FOnSearchChanged;

ProcessEditプロシージャでこのイベントを呼び出します。

procedure TCRGridTitleEdit.ProcessEdit;
begin
  if (FActiveColumn = nil) or (CRDBGrid = nil) or not FEdit.Modified then
    Exit;

  if FAsFilter then
    with CRDBGrid do begin
      try
        TCRColumn(FActiveColumn).GetFilterExpression(FEdit.Text);
        FFilterExpressions[FActiveColumn.Index] := FEdit.Text;
        Self.Caption := FFilterExpressions[FActiveColumn.Index];
        if Assigned(FOnFilterChanged) then
          FOnFilterChanged(self, FEdit.Text);
      except
        on EConvertError do begin
          FEdit.SelectAll;
          raise;
        end;
      end;
    end
  else
    try
      with FActiveColumn.Field do
        DataSet.Locate(FieldName, {$IFDEF CLR}Variant{$ENDIF}(FEdit.Text), [loCaseInsensitive,loPartialKey]);
      if Assigned(FOnSearchChanged) then
        FOnSearchChanged(self, FEdit.Text);
    except
      on EConvertError do
        Exit;
    end;
end;

TCRDBGridクラスにイベント宣言を追加します。

private
  function GetOnFilterChanged: TOnTextChanged;
  procedure SetOnFilterChanged(Value: TOnTextChanged);
  function GetOnSearchChanged: TOnTextChanged;
  procedure SetOnSearchChanged(Value: TOnTextChanged);

published
  property OnFilterChanged: TOnTextChanged read GetOnFilterChanged write SetOnFilterChanged;
  property OnSearchChanged: TOnTextChanged read GetOnSearchChanged write SetOnSearchChanged;

実装

function TCRDBGrid.GetOnFilterChanged: TOnTextChanged;
begin
  Result := CRGridTitleEdit.OnFilterChanged;
end;

procedure TCRDBGrid.SetOnFilterChanged(Value: TOnTextChanged);
begin
  CRGridTitleEdit.OnFilterChanged := Value;
end;

function TCRDBGrid.GetOnSearchChanged: TOnTextChanged;
begin
  Result := CRGridTitleEdit.OnSearchChanged;
end;

procedure TCRDBGrid.SetOnSearchChanged(Value: TOnTextChanged);
begin
  CRGridTitleEdit.OnSearchChanged := Value;
end;
于 2010-10-22T12:03:45.223 に答える