FMX StringGrid向上滑動自動加載記錄(二)

寫完FMX StringGrid向上滑動自動加載記錄(一)本身也以爲不理想,實現的彆扭與複雜,如今找到更好的實現方法,原來,StringGrid從基類TCustomPresentedScrollBox繼承了OnViewportPositionChange事件,只不過沒有published出來,因此在設計期StringGrid的事件列表中沒法找到。html

想了解OnViewportPositionChange,先得了解Viewport是什麼概念,通俗的說,Viewport就是StringGrid的可見區域,或者說是ScrollBox的可見區域。當用戶在StringGrid上滑動時,不管是上下仍是左右,這個Viewport是變化的,這時候,會觸發OnViewportPositionChange事件。app

這正是須要的事件,在這個事件中,咱們能夠判斷用戶滑動的可見區域Viewport是否到了最底部,由此來加載分頁查詢回來的記錄。spa

 上圖中,標記出來StringGrid的左上角座標及左下角座標,同時也標計出Viewport的左上角及左下角的座標,初始顯示狀態,StringGrid內容區域的左上角座標與Viewport的左上角座標是相同的,都是從(0,0)開始。當在StringGrid上滑動,Viewport的左上角座標會變化,這個變化,會反應在OnViewportPositionChange事件中的NewViewportPosition參數中。也就是說,咱們能夠經過NewViewportPosition參數,能夠獲得Viewport左上角的新的座標。當Viewport滑動到StringGrid底部時,Viewport左下角的座標與StringGrid的內容區的左下角座標相等,即(0,NewViewportPosition.y+StringGrid1.ViewportSize.Height)等於(0,StringGrid1.ContentBounds.Height),好了,原理就這樣,依照這個原理,能夠判斷用戶是否滑動到StringGrid底部了:設計

procedure TMainForm.ViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); begin
  if (StringGrid1.ContentBounds.Height-NewViewportPosition.y-StringGrid1.ViewportSize.Height)<10 then
  begin pq.NextPage; end; end;

因爲OnViewportPositionChange事件沒Published出來,還須要手工聯接上面的方法。code

procedure TMainForm.FormCreate(Sender: TObject); begin

{...} StringGrid1.RowCount:=0; StringGrid1.OnViewportPositionChange:=ViewportPositionChange; end;

編譯成app,在Android上實測,達到目的。orm

環境:Delphi 10.2.3+kbmMW 5.05.11htm

相關文章
相關標籤/搜索