« ☆Serversコンポーネントがない。 | トップページ | ☆Excelの書式設定を行う。 »

☆DBGridでのTopRow設定

ClientDataSetを使ってDBGridにデータを表示させます。
私は、このテーブルに対して検索等を行うには、次のようにクローンを作成して処理させています。
その理由は、レコードを移動させる処理を行うと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でコメントした内容をまとめています。

|

« ☆Serversコンポーネントがない。 | トップページ | ☆Excelの書式設定を行う。 »