红鱼儿

FMX StringGrid向上滑动自动加载记录(一)

有时候,做的app还是需要用StringGrid来显示数据,但如果用StringGrid的Livebinding绑定到一个数据集TDataset,当记录超过1000条时,效率非常低,甚至达不到实用状态,这是Livebinding的硬伤。那么只有自己把TDataSet记录填写到StringGrid了。

当一个查询结果记录非常多,那么我们要采用分页查询方法,每次查询一定数量的记录到客户端,然后追加填写到StringGrid中,问题来了:怎么判断用户查看到StringGrid显示的最后一条记录呢?查看StringGrid的事件,竟然很少,没有想用的事件。看来,FMX的可视控件,还需要进一步完善与发展,填加更多的功能,才能满足现在的需求。

向几位朋友求助,也说没有好办法,但提供了一些思路,如何判断用户查看到最后一条记录。其中,按竹子的想法,找到StringGrid的纵向ScrollBar,然后利用他的事件处理,经过实践,这个想法可行。

第一步,找到用户上下滑动触发的事件,见代码:

procedure TMainForm.StringGrid1DrawColumnHeader(Sender: TObject;
  const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF);
begin
   if Assigned(StringGrid1.VScrollBar) then
   begin
     StringGrid1.VScrollBar.OnPaint:=Self.ScrollBar1Paint;
     //Text2.Text:='onpaint已经联接上!'
   end;
end;

通过代码,可以看到,利用StringGrid.VsScrollBar找到纵向的ScrollBar对象,然后接管他的OnPaint事件。在什么时候做这个设置呢?随便找一个事件,如StringGrid1DrawColumnHeader,你可能会问,为什么不在Form.Create中处理,因为这时候取不到VScrollBar对象。

 第二步,实现OnPaint事件,判断应该为用户加载下一页记录

procedure TMainForm.ScrollBar1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
//  Text2.Text:=Format('TopRow=%d,BottomRow=%d,VisibleRows=%d,RowCount=%d',
//  [StringGrid1.TopRow,StringGrid1.BottomRow,StringGrid1.VisibleRows,StringGrid1.RowCount]);
  if StringGrid1.BottomRow+1=StringGrid1.RowCount then
  begin
    pq.NextPage;
  end;
end;

StringGrid有BottonRow,指当前显示的最后一条记录的行数,如果这个行数等于StringGrid的RowCount,那么就是显示到最后一条记录了,因为BottonRow从0开始,所以要加1,理解了这个,那么上面代码就容易明白了。

 

posted on 2018-07-02 09:49  红鱼儿  阅读(557)  评论(0编辑  收藏  举报