fjcg02,
Cita:
|
Empezado por fjcg02
...TClientDataset al que le creo en runtime los campos que necesito...me funciona perfectamente...cuando lanzo el proceso por segunda vez, cambiando los campos, me da un error...
|
Revisa este código:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBClient, DB, Grids, DBGrids;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
DBGrid1: TDBGrid;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
var
Form1 : TForm1;
Table : TClientDataset;
DS : TDataSource;
implementation
{$R *.dfm}
function CreateField(CDS : TClientDataset; FieldName : String) : Boolean;
var
F : TStringField;
begin
F := TStringField.Create(CDS);
F.FieldName := FieldName;
F.Name := FieldName;
F.DataSet := CDS;
F.Size := 100;
F.DisplayLabel := 'N-' + FieldName;
F.DisplayWidth := 10;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(Table) then
Table := TClientDataset.Create(nil);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(Table) and (Table.State <> dsBrowse) then
begin
CreateField(Table,'C1');
CreateField(Table,'C2');
CreateField(Table,'C3');
CreateField(Table,'C4');
Table.CreateDataset;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i : Integer;
begin
if Assigned(Table) and (Table.FieldCount <> 0) then
begin
Randomize;
Table.Open;
Table.Append;
for i := 0 to Table.FieldCount - 1 do
Table.Fields[i].Value := 'Data-' + IntToStr(Random(1000));
Table.Post;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
i : Integer;
begin
if Assigned(Table) then
begin
DS := TDataSource.Create(nil);
DS.DataSet := Table;
DBGrid1.DataSource := DS;
for i := 0 to Table.FieldCount - 1 do
DBGrid1.Columns[i].Width := 100;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
i : Integer;
begin
if Assigned(Table) and (Table.FieldCount <> 0) then
begin
DS.DataSet := nil;
DBGrid1.DataSource := nil;
for i := Table.Fields.Count - 1 to 0 do
Table.Fields[i].Free;
Table.Free;
Table := nil;
end;
if Assigned(Table) then
begin
Table.Free;
Table := nil;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32,
Permite crear y eliminar un TClientDataset de forma dinámica como se muestra en la siguiente imagen:
Espero sea útil
Nelson.