☆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でコメントした内容をまとめています。
| 固定リンク
