☆DBGridでのTopRow設定
ClientDataSetを使ってDBGridにデータを表示させます。
私は、このテーブルに対して検索等を行うには、次のようにクローンを作成して処理させています。
その理由は、レコードを移動させる処理を行うとDBGridの表示が変わってしまうからです。例えば、BookMarkStrで元の位置に戻したとしても、BookMarkではDBGridの中央に指定レコードを表示するため、処理前の表示を再現することができません。
では、クローンを作成しないでレコード移動前の表示に戻せないかという質問がありました。
そこで、元の表示のTopRowを保存しておき、レコードを移動した後、TopRowとカレントレコードを戻すというサンプルを作ってみました。
※Delphi User's Forumでコメントした内容をまとめています。
私は、このテーブルに対して検索等を行うには、次のようにクローンを作成して処理させています。
その理由は、レコードを移動させる処理を行うとDBGridの表示が変わってしまうからです。例えば、BookMarkStrで元の位置に戻したとしても、BookMarkではDBGridの中央に指定レコードを表示するため、処理前の表示を再現することができません。
function LocateEx(ClientDataSet: TClientDataSet; const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean; var CloneCDS: TClientDataSet; begin CloneCDS := TClientDataSet.Create(nil); try CloneCDS.CloneCursor(ClientDataSet, True); Result := CloneCDS.Locate(KeyFields, KeyValues , Options); // if Result then // ClientDataSet.GotoCurrent(CloneCDS) finally CloneCDS.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin if not LocateEx(ClientDataSet1,'name', Edit1.Text, []) then ShowMessage('見つかりません'); end;
では、クローンを作成しないでレコード移動前の表示に戻せないかという質問がありました。
そこで、元の表示のTopRowを保存しておき、レコードを移動した後、TopRowとカレントレコードを戻すというサンプルを作ってみました。
type TDummyDBGrid = class(TCustomDBGrid); procedure TForm1.Button1Click(Sender: TObject); var RowCount, RN: Integer; TopRowRecNo, CurrentRowNo: Integer; begin ClientDataSet1.DisableControls; try // TopRowのRecNoとCurrentRowのRecNoを保存しておきます。 CurrentRowNo := TDummyDBGrid(DBGrid1).Row - 1; TopRowRecNo := ClientDataSet1.RecNo - CurrentRowNo; //レコードを移動させる処理---好きにして~。 //ClientDataSet1.Locate('name', Edit1.Text,[]); //ClientDataSet1.Last; //ClientDataSet1.First; // DBGridの表示を元に戻す処理 // 指定レコードをTopRowに移動させる処理 RowCount := TDummyDBGrid(DBGrid1).VisibleRowCount; ClientDataSet1.RecNo := TopRowRecNo; ClientDataSet1.MoveBy(RowCount); while not ClientDataSet1.BOF do begin RN := ClientDataSet1.RecNo; if RN = TopRowRecNo then Break else ClientDataSet1.Prior; end; // カーソルを元のカレントレコードに移動させる処理 ClientDataSet1.MoveBy(CurrentRowNo); finally ClientDataSet1.EnableControls; end; end;
※Delphi User's Forumでコメントした内容をまとめています。
| 固定リンク