Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Crear tabla... (https://www.clubdelphi.com/foros/showthread.php?t=36916)

Walterdf 27-10-2006 21:02:05

Crear tabla en tiempo de ejecución...
 
Hola a todos!
Estoy aquí nuevamente ya que necesitaría que me den una mano con lo siguiente.
Estoy tratando de cargar unos datos desde una tabla Paradox a un objeto para luego utilizarlos en otro procedimiento. En realidad estoy empezando a tratar con el tema de objetos y haciendo algunas pruebas. Lo que quiero hacer es que la aplicación sea totalmente independiente de la cantidad de tablas que cree, nombres, ubicacion, etc. Hasta ahora vine bien, hasta que me di cuenta que había un campo Blob dando vueltas, me explayo:

La clase la cree de la sig.manera (resumiendo):

Código:

Type TDatos = class
  public
    codigo,
    marca,
    rubro,
    producto : string;
    imagen : TMemoryStream; //para el campo blob
end;

(obviamente hice todo para inicializar el objeto TDatos, imagen, etc)

Lo que hago es ir leyendo uno a uno los registros de una tabla y asignándolos a cada campo de TDatos para luego mostrarlos en TEdits o lo que fuere.
No doy mucho detalle de esto, ya que el problema viene mas adelante. Los datos los asigno al objeto de la sig.manera:

Código:

  FDatos.codigo:=Tabla.Fields.Fields[0].AsString;
  FDatos.marca:=Tabla.Fields.Fields[1].AsString;
  FDatos.rubro:=Tabla.Fields.Fields[2].AsString;
  FDatos.producto:=Tabla.Fields.Fields[3].AsString;

La tabla la estoy creando en tiempo de ejecución y hasta aquí todo bien, creo las tablas que quiera, con sus nombres, ubicaciones, todo muy lindo hasta que me encontré con un campo Blob...
Si la tabla ya la tenía creada mediante el componente de la paleta BDE, no había problemas, hacía:

Código:

  TablaIMAGEN.SaveToStream(FDatos.imagen);
y listo.

Pero acá se me generó este problema, ya que al hacerlo durante la ejecución, no me genera los campos y no puedo realizar ese procedimiento. Es muy probable que me haya mandado una macana al crear la tabla o tal vez que me haya metido en un embrollo por nada.
Si alguien tiene una sugerencia será muy bienvenida.
Muchas gracias a todos.
Un abrazo.

Walter

Lepe 28-10-2006 14:51:15

Lo único que se me ocurre, es que no hayas creado el memoryStream en el constructor de tu objeto, y por tanto obtengas access violations. Tal y como lo veo sería algo así:

Código Delphi [-]
Type TDatos = class
  private 
    FStream:TMemoryStream;

   procedure SetFStream(const Value:TMemoryStream);
  function GetFStream:TMemoryStream;
  public

    constructor Create;
    codigo,
    marca,
    rubro,
    producto : string;
    property imagen : TMemoryStream read GetFStream write SetFStream; //para el campo blob
end;

implementation

constructor TDatos.Create;
begin
  FStream := TmemoryStream.Create;
end;

procedure TDatos.SetFStream(const Value:TMemoryStream);
begin
  if not Assigned(Value) then
    raise Exception.Create('no se ha suministrado un Flujo de datos válido');

  Value.SaveToStream(FStream); // lo copiamos a la variable FStream.

function TDatos.GetFStream:TMemoryStream;
begin
  Result := TMemoryStream.Create;
  FStream.SavetoStream(Result);
end;

Walterdf 28-10-2006 21:24:51

Mil gracias por responder pero el problema no pasa por access violations ya que el stream lo cree en el contructor del objeto. El problema está en la creación de la tabla en ejecución, no reconoce ningún campo como Blob.
Un abrazo y gracias nuevamente.

Walter

Walterdf 30-10-2006 16:32:14

Bueno, ya pude solucionar el tema de pasar el blob de la tabla al campo del objeto, de todos modos me sirvió lo anterior ya que había metido la pata con la inicialización del objeto.
Pongo el código que utilicé para cargar los datos de los campos del objeto con los de la tabla:

Código:

function TdmFiguras.Cargar(var FDatos : TDatos) : boolean;
var
  Stream : TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  FDatos.codigo:=dmTablas.Tabla.Fields.Fields[0].AsString;
  FDatos.marca:=dmTablas.Tabla.Fields.Fields[1].AsString;
  FDatos.rubro:=dmTablas.Tabla.Fields.Fields[2].AsString;
  FDatos.producto:=dmTablas.Tabla.Fields.Fields[3].AsString;
Stream.LoadFromStream(dmTablas.Tabla.CreateBlobStream(dmTablas.Tabla.FieldByName('FIGURA'),bmRead));
  FDatos.imagen:=Stream;
  result := true;
end;

Muchas gracias.
Walter


La franja horaria es GMT +2. Ahora son las 06:58:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi