gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:34:08 30 4
gpt4 key购买 nike

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

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

文本似乎进入了 TEdit,它是 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com