4

いくつか検索を行ったところ、未回答の質問がさらに見つかりました。:)

D5proを使用します。

実行時にデータソースをTDBGridに再割り当てしたいと思います。7つの同一の構造化データセットがあり、ボタンのクリックに応じて、適切なデータセットをグリッドに表示したいと思います。

すべてを試しましたが、次のデータセットを表示することができません。起動時に割り当てられた最初のものに固執します。私はアプローチをやり過ぎになりつつありますが、それでも何も機能していません。これが私が今いるところです。

procedure SetSource(var aSrc : TDataSource);
begin
  aSrc.DataSet.Close;
  dbgridShowData.DataSource:=aSrc;
  aSrc.DataSet.Open;
  aSrc.DataSet.First;
  aSrc.DataSet.Refresh;
end;

どこが間違っているのですか?

ありがとう

4

4 に答える 4

6

DBGrid によって表示されるデータセットは、実行時に非常に簡単に変更できます。2 つのアプローチがあります。

1: DBGrid.DataSource に割り当てられた単一の DataSource を使用し、DataSource.DataSet を目的の DataSet に変更します。以下は、すべての割り当てが実行時に行われる簡単な例です。

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource1;

  DataSet1.Active := true;
  DataSet2.Active := true;
  DataSet3.Active := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DataSource1.DataSet := DataSet1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DataSource1.DataSet := DataSet2;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  DataSource1.DataSet := DataSet3;
end;

2: 各 DataSet に DataSource を使用し、DBGrid.DataSource を目的の DataSource に変更します。以下は、すべての割り当てが実行時に行われる簡単な例です。

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataSource1.DataSet := DataSet1;
  DataSource2.DataSet := DataSet2;
  DataSource3.DataSet := DataSet3;

  DataSet1.Active := true;
  DataSet2.Active := true;
  DataSet3.Active := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource2;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  DBGrid1.DataSource := DataSource3;
end;

DBGrid の列を定義する場合、DataSet の構造は同じである必要があります。または、表示されるデータセットを変更するときに列の定義を変更する必要があります。

柔軟性が高いため、DataSet ごとに DataSource を使用することを好みます。

于 2013-03-14T00:33:13.453 に答える
3

DataSource.DataSetおそらく、代わりに次のように変更する必要があります。

procedure SetDataFromDataSet(const aDataSource: TDataSource;
  const aNewDataSet: TDataSet);
begin
  aDataSource.DataSet.Close;
  aDataSource.DataSet := aNewDataSet;
  if not aNewDataSet.Active then
    aNewDataSet.Open;
end;

サンプル使用:

SetDataFromDataSet(DataSource1, CustomerQuery); 

ただし、このようにデータセットをグローバルに閉じたり開いたりしたくない場合があります。おそらく、呼び出し元のコードから実行する方がよいでしょう。もちろん、それはアプリに何が必要かによって異なります。

于 2013-03-13T21:53:03.053 に答える
1

Delphi5 プロでテスト済み。

procedure TForm1.setDataSourceDataSet(var newDataSource:TDataSource);
begin
if DBgrid1.DataSource = nil then begin
   DBgrid1.DataSource:=newDataSource;
end else begin
if DBgrid1.DataSource.Name = newDataSource.Name then exit;
DBGrid1.DataSource.Enabled:=False;
DBgrid1.DataSource:=newDataSource;
end;
If DBgrid1.DataSource.DataSet.active=False then DBgrid1.DataSource.DataSet.active:=True;
DBGrid1.DataSource.Enabled:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
setDataSourceDataSet(DataSource1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
setDataSourceDataSet(DataSource2);
end;
于 2013-03-14T01:12:46.387 に答える