delphi - 如何访问 TCRDBGrid 组件中的搜索文本?

标签 delphi delphi-2007 devart

有没有办法访问在 Devart(核心实验室)TCRDBGrid 搜索栏中输入的文本?

我尝试实现 OnKeyDown 事件,但仅当选择网格本身时,在搜索字段中输入时该事件才发生。没有其他看起来相关的事件。

文本似乎进入 TEdit,它是 TCRGridTitleEdit 的一部分,TCRGridTitleEdit 是 TCRDBGrid 的一部分,但是私有(private)的。

有没有办法获取搜索文本?

TCFGBGrid 示例:

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

如果 UserId 987654 不存在,我想提示“创建新用户 987654?”并可能创建一条新记录,并将 UserId 设置为 987654。

最佳答案

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;

关于delphi - 如何访问 TCRDBGrid 组件中的搜索文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995426/

相关文章:

delphi - Delphi .dproj 文件中的 <DCCReference> 标记有何作用?

arrays - 如何找到数组中最小和最大的数字?

mysql - Ef core 在查询过滤器或 TPH 中创建子查询而不是联接

delphi - 使用大 if 子句还是堆叠它们?

ios - 如何在 MyApp.entitlements 中设置 com.apple.developer.linked-domains 的值?

delphi - 如何让编辑器在 Virtualtreeview 中保持事件状态?

mysql - 避免死锁 MySQL/UniDAC/Delphi

mysql - 概念类型中的成员数不匹配

ios - XE8.1 : file was built for archive which is not the architecture being linked (arm64)

multithreading - 从线程内执行 OpenGL 绘图