Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reassigning a datasource at run-time

Tags:

delphi

tdbgrid

I did some searching and only found more unanswered questions. :)

Using D5pro.

I want to reassign the DataSource to a TDBGrid at run time. I have seven identical structured DataSets and depending on a button click I want the appropriate DataSet displayed in the grid.

I have tried everything and I cannot get it to show the next DataSet. It sticks with the first one assigned at start up. I am getting to overkill approaches and still nothing is working. Here's where I am at the moment.

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

Where am I going wrong?

Thanks

like image 264
user983145 Avatar asked Jan 14 '23 23:01

user983145


2 Answers

You can change the Dataset shown by a DBGrid quite easily at runtime quite easily. There two approaches:

1: use a single DataSource assigned to DBGrid.DataSource and change the DataSource.DataSet to the desired DataSet. Here is a simple example with all assignments made at runtime.

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: use a DataSource for each DataSet and change DBGrid.DataSource to the desired DataSource. Here is a simple example with all assignments made at runtime.

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;

If you define the columns of the DBGrid, the structure of the DataSets will need to be the the same, or you will have to change the column definitions when you change the Dataset displayed.

I prefer using a DataSource per DataSet because it is more flexible.

like image 105
crefird Avatar answered Jan 22 '23 05:01

crefird


You probably need to change the DataSource.DataSet instead:

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

Sample use:

SetDataFromDataSet(DataSource1, CustomerQuery); 

You may not want to close and open datasets globally like this, though. It's probably better to do that from the calling code. Of course, that would depend on what you need for your app.

like image 37
Ken White Avatar answered Jan 22 '23 03:01

Ken White