PDA

Ver la Versión Completa : Crear tabla...


Walterdf
27-10-2006, 21:02:05
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):


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:


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:


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í:


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:


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