首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AfterScroll和AfterOpen on TQuery

AfterScroll和AfterOpen on TQuery
EN

Stack Overflow用户
提问于 2018-12-21 13:28:04
回答 1查看 845关注 0票数 1

我的应用程序有一个TQuery组件,我需要在它的AfterScroll()事件中做一些事情:

代码语言:javascript
复制
void __fastcall TFormMain::Query1AfterScroll(TDataSet *DataSet)
{
    // do stuff here...
}

问题是,当我执行以下操作时,AfterScroll事件显然会被触发两次:

代码语言:javascript
复制
Query1->Active = true; // first call to AfterScroll 
Query1->Locate( /* some arguments here */ ); // second call

注意:不能选择修改SQL查询而不是Note()

对AfterScroll的第一个调用是我不想处理的,所以我正在寻找一种优雅的方法来处理第二个调用。

我的第一个想法是使用AfterOpen()事件动态连接AfterScroll事件处理程序:

代码语言:javascript
复制
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
    Query1->AfterScroll = 0;
}

void __fastcall TFormMain::Query1AfterOpen(TDataSet *DataSet)
{
     Query1->AfterScroll = Query1AfterScroll;
}

这个解决方案看起来不错,但不起作用,因为AfterScroll在AfterOpen离开的时候就会被调用。

编辑:

我知道我可以设置一些标志来抑制AfterScroll中代码的执行(这就是我现在要做的事情(以及:下面的第一个答案是如何描述的),但是我认为应该有一个更优雅、更容易出错的方法。

但经过一些研究,恐怕没有更好的解决办法了。

我现在的问题是:

捕获正确的AfterScroll调用的正确方法是什么?(定位(.)后调用的那个)

EN

回答 1

Stack Overflow用户

发布于 2018-12-21 14:59:16

下面的Delphi代码覆盖了TAdoQuery的标准行为(但是应该与支持Locate()的任何其他TDataSet后代一起工作),这样AfterScroll事件就是只在调用TAdoQuery.Locate之后立即调用

基本上,它重写TAdoQuery DoAfterScroll,以便只在设置布尔标志FHandleScrollAfterLocate时调用继承的方法。DoAfterScroll是TDataSet方法,用于调用已设置的任何AfterScroll处理程序。该标志在重写的Locate函数中设置为True,每次调用DoAfterScroll时都会清除该标志。

如果您想要更改调用AfterScroll的条件,我相信您会有这样的想法。

代码语言:javascript
复制
  type
    TAdoQuery = class(ADODB.TAdoQuery)
    private
      FHandleScrollAfterLocate: Boolean;
    protected
      property HandleScrollAfterLocate : Boolean read FHandleScrollAfterLocate;
      function Locate(const KeyFields: string; const KeyValues: Variant;
        Options: TLocateOptions): Boolean; override;
      procedure DoAfterScroll; override;
    public
    end;

    TForm1 = class(TForm)
      DataSource1: TDataSource;
      DBGrid1: TDBGrid;
      DBNavigator1: TDBNavigator;
      ADOConnection1: TADOConnection;
      AdoQuery1: TADOQuery;
      AdoQuery1ID: TIntegerField;
      AdoQuery1name: TStringField;
      btnLocate: TButton;
    [etc]
    [...]

    { TAdoQuery }

    procedure TAdoQuery.DoAfterScroll;
    begin
      try
        if FHandleScrollAfterLocate then
          inherited;
      finally
        FHandleScrollAfterLocate := False;
      end;
    end;

    function TAdoQuery.Locate(const KeyFields: string;
      const KeyValues: Variant; Options: TLocateOptions): Boolean;
    begin
      FHandleScrollAfterLocate := True;
      Result := inherited Locate(KeyFields, KeyValues, Options);
    end;

    procedure TForm1.AdoQuery1AfterScroll(DataSet: TDataSet);
    begin
      Caption := 'Scrolled';
    end;

    procedure TForm1.btnLocateClick(Sender: TObject);
    begin
      AdoQuery1.Locate('ID', 5, []);
    end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53885589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档