fjcg02,
Cita:
|
Empezado por fjcg02
...la sentencia mágica que ha hecho que funcione todo bien, es la que ha apuntado Caminante (CDS.FieldDefs.Clear)...
|
Cita:
|
Empezado por fjcg02
...El problema ocurre cuando cambio los campos que quiero visualizar...Si los campos son los mismos, no hay problema...el ejemplo de nlsgarcia...en el que los campos son siempre los mismos, no reproduce mi problema...
|
Revisa este código (Solo para complementar):
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBClient, DB, Grids, DBGrids, Math;
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;
B : Boolean;
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
Randomize;
B := Not B;
if Assigned(Table) and (Table.State <> dsBrowse) and B then
begin
CreateField(Table,'C' + IntToStr(RandomRange(10,19) + 1));
CreateField(Table,'C' + IntToStr(RandomRange(20,29) + 1));
CreateField(Table,'C' + IntToStr(RandomRange(30,39) + 1));
CreateField(Table,'C' + IntToStr(RandomRange(40,49) + 1));
Table.CreateDataset;
end;
if Assigned(Table) and (Table.State <> dsBrowse) and not B then
begin
CreateField(Table,'C' + IntToStr(RandomRange(50,59) + 1));
CreateField(Table,'C' + IntToStr(RandomRange(60,69) + 1));
CreateField(Table,'C' + IntToStr(RandomRange(70,79) + 1));
CreateField(Table,'C' + IntToStr(RandomRange(80,89) + 1));
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 con campos aleatorios de forma dinámica como se muestra en la siguiente imagen:
Nota: El ejemplo mostrado es básicamente similar al indicado en el
Msg #8, la diferencia radica
en que los campos creados son aleatorios.
Espero sea útil
Nelson.