Ver Mensaje Individual
  #7  
Antiguo 23-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por gustavo2
La creacion en tiempo de ejecucion de objetos es mi duda.
Ok, entonces es una pregunta acerca de objetos y realmente no tiene que ver con tablas planas de manera que deberías haberlo puesto en el foro OOP.

Para construir un objeto en tiempo de ejecución tienes que usar su constructor- en la inmensa mayoría de casos se llamará Create. Digamos que tienes una clase TMiClase y deseas crear un objeto de esta clase; si tienes una variable de tipo TMiClase bastará que le asignes el resultado del constructor:

Código:
var
  UnObjeto: TMiClase;

...

UnObjeto := TMiClase.Create(parámetros);
Pasando los parámetros pertinentes según la clase de que se trate y llenando las propiedades necesarias. En tu caso particular, necesitas un grid, una tabla y un datasource por cada tabla física:

Código:
var
  Grid: TDBGrid;
  Table: TTable;
  DSource: TDataSource;

begin
  Table := TTable.Create(nil);
  DSource := TDataSource.Create(nil);
  Grid := TDBGrid.Create(nil);

  Table.DatabaseName := alias de la base de datos;
  Table.TableName := nombre de la tabla física;
  
  DSource.DataSet := Table;

  DBGrid.DataSource := DSource;  
end;
Fíjate en el parámetro (nil en el ejemplo) de los constructores. Este parámetro es una componente que será la encargada de destruir al objeto cuando ella misma se destruya. Cuando en tiempo de diseño insertas componentes como Table en el formulario, este parámetro automáticamente se asigna al formulario mismo de manera que cuando el formulario se destruye (sea porque termina la aplicación o porque explícitamente lo hagas en código) él destruirá también a todas las componentes que posee, razón por la cual no necesitas hacerlo tú mismo. Sin embargo, si requieres destruir las componentes antes de que termine la aplicación para liberar memoria entonces te conviene pasar nil como parámetro lo cual querrá decir que nadie se va a encargar de destruirlas de forma automática y lo harás tú mismo cuando sea necesario:

Código:
Table.Free;
DSource.Free;
Grid.Free;
Ahora bie, dado que la cantidad de tablas que crees en la ejecución no es fija sino que depende de condiciones que de el usuario, te convendrá mantener una lista dinámica de ellas, por ejemplo, con un TObjectList:

Código:
type
  TDataPack = class
    Table: TTable;
    DSource: TDataSource;
    Grid: TDBGrid;
  end;
En cada item de la lista pondrías un "pack" o conjunto de las tres componentes requeridas:

Código:
var
  Pack: TDataPack;

begin
  Pack := TPack.Create;
  Pack.Table := TTable.Create(nil);
  Pack.DSource := TDataSource.Create(nil);
  Pack.Grid := TDBGrid.Create(nil);

  List.Add(Pack); // List es de tipo TObjectList
end;

y llenas el resto de las propiedades como antes.
Recuerda que deberás crear List previamente:

Código:
List := TObjectList.Create(true);
Al pasar true como parámetro hace que la lista ´'posea' los objetos que agregas de manera que cuando destruyas la lista automáticamente se destruirán todos sus elementos.

Espero que esto te sirva de guía.

Dejame comentarte que Delphi es un lenguaje orientado a objetos de manera que es fundamental tener una noción al menos básica de éstos y como funcionan en el lenguaje. Por ello te recomiendo que leas un poco acerca de ello para no estar atorándote en cuestiones que hasta cierto punto son más o menos elementales.

// Saludos
Responder Con Cita