解決方法
我們要借用的就是 MoveBy method。我們要呼叫此 method 二次,第一次是將 grid 向下捲動使原本在 grid 中間的記錄變為在 grid 的第一筆,但這麼一來記錄指標就不是指在原本的記錄上,所以再呼叫第二次 MoveBy 使指標移回原來的記錄。
問題又來了,TDBGrid 並沒有屬性可讓我們知道 grid 有幾列。此時我們若稍稍向下探索 VCL 就會發現 TCustomGrid 有 VisibleRowCount 屬性,雖然該屬性為 protected 所以無法讓我們程式中存取。我們可以自訂一個繼承自 TCustomGrid 的類別,再將 TDBGrid 做型別轉換,如此便可存取 VisibleRowCount 了。
以下是程式碼:
type TMyGrid = class(TCustomGrid); ... ... procedure TForm1.Button1Click(Sender: TObject); var Distance: integer; begin // 尋找某一筆記錄 Table1.Locate('Common_Name','Firefish',[]); // 找到符合的記錄, 該記錄的位置在 grid 的中間列, // 向下捲動 grid, 使目標記錄往上至第一列 Distance := Table1.MoveBy(TMyGrid(DBGrid).VisibleRowCount-1); // 再將資料表指標往回移至原來的記錄 Table1.MoveBy(-Distance); end;
沒有留言:
張貼留言