hola estoy haciendo una aplicacion
y en ella tengo una tabla con los datos de la empresa y sus campos blob tipo binary
y todo bien.
pero quiero hacer una clase donde pueda tener los datos de la empresa y tambien las imagenes
del logo y la cedula de la empresa que estan en la base de datos.
como puedo tener los tipos de datos jpg como un miembro y luego aisginalo a a un timage?
estoy haciendo la clase.
clase con soporte a imagen=?
Comenzado por
angelo2007
, nov 08 2011 11:37
7 respuestas en este tema
#1
Escrito 08 noviembre 2011 - 11:37
#2
Escrito 08 noviembre 2011 - 11:48
Buenas,
Puedes definir una propiedad de tipo TPicture
O si conoces de antemano el formato de la imagen, pues ya directamente de ese formato
Espero te sirva
Nos leemos
Puedes definir una propiedad de tipo TPicture
delphi
property Picture: TPicture read FPicture write SetPicture;
O si conoces de antemano el formato de la imagen, pues ya directamente de ese formato
Espero te sirva
Nos leemos
#3
Escrito 09 noviembre 2011 - 04:20
hola al final lo hice asi.
[pascal]
unit ClasEmpresaU;
interface
uses
Forms, Windows, ActiveX, shlobj, ShellAPI, SysUtils, Registry, IniFiles,
Dialogs, DBU, Classes, DB, MemDS, DBAccess, IBC,
Graphics, jpeg, pngimage, ExtCtrls;
type
TClasEmpresa = Class(TObject)
private
QEmpresa: TIBCQuery;
Transaction: TIBCTransaction;
constructor create; virtual;
destructor destroy; override;
public
ID: integer;
RFC: string;
NOMBRE: string;
PERSONALIDAD: string;
ESQUEMAFACTURACION: string;
CALLE: string;
NUMEXT: string;
NUMINT: string;
COLONIA: string;
CP: string;
LOCALIDAD: string;
ESTADO: string;
MUNICIPIO: string;
PAIS: string;
imgLogo: TImage;
imgCedula: TImage;
procedure CargaInfoEmp(RFCEMP: string);
published
End;
implementation
constructor TClasEmpresa.create;
begin
inherited create;
end;
destructor TClasEmpresa.destroy;
begin
inherited destroy;
end;
procedure TClasEmpresa.CargaInfoEmp(RFCEMP: string);
var
sql: string;
I: integer;
MemoryStreamLogo: TMemoryStream;
JpgLogo: TJpegImage;
fldCampoLogo: TField;
StreamLogo: TStream;
// variables para cedula
MemoryStreamCedula: TMemoryStream;
JpgCedula: TJpegImage;
fldCampoCedula: TField;
StreamCedula: TStream;
begin
sql := 'SELECT ';
sql := sql + ' ID, RFC, NOMBRE, PERSONALIDAD, ESQUEMAFACTURACION, ';
sql := sql + ' CALLE, NUMEXT, NUMINT, COLONIA, CP, LOCALIDAD, ESTADO, ';
sql := sql + 'MUNICIPIO, PAIS, LOGO, CEDULA ';
sql := sql + 'FROM EMPRESAS WHERE RFC = ';
if RFCEMP <> '' then
begin
// creamos un componente query nuevo que se ocnecte a la db
imgLogo := TImage.create(nil);
QEmpresa := TIBCQuery.create(nil);
Transaction := TIBCTransaction.create(nil);
// Transaction.DefaultDataBase := Hilo_DataBase;
Transaction.DefaultConnection := DBF.IBCConnection1;
// Transaction.DefaultAction := TARollback;
Transaction.Params.Clear;
Transaction.Params.Add('read_committed');
Transaction.Params.Add('rec_version');
Transaction.Params.Add('nowait');
Transaction.StartTransaction;
QEmpresa := TIBCQuery.create(nil);
QEmpresa.Transaction := Transaction;
QEmpresa.Close;
QEmpresa.sql.Clear;
QEmpresa.sql.Add(sql + '''' + RFCEMP + '''');
QEmpresa.Execute;
// si el rfc no esta vacio entonces cargamos toda la infor de la empresa seleccionada
// trataremos de cargar los logos y cedula si es que existen
for I := 0 to QEmpresa.RecordCount - 1 do
begin
// rellenamos los datos a los edits
ID := QEmpresa.Fields[0].AsInteger;
RFC := QEmpresa.Fields[1].AsString;
NOMBRE := QEmpresa.Fields[2].AsString;
PERSONALIDAD := QEmpresa.Fields[3].AsString;
ESQUEMAFACTURACION := QEmpresa.Fields[4].AsString;
CALLE := QEmpresa.Fields[5].AsString;
NUMEXT := QEmpresa.Fields[6].AsString;
NUMINT := QEmpresa.Fields[7].AsString;
COLONIA := QEmpresa.Fields[8].AsString;
CP := QEmpresa.Fields[9].AsString;
LOCALIDAD := QEmpresa.Fields[10].AsString;
ESTADO := QEmpresa.Fields[11].AsString;
MUNICIPIO := QEmpresa.Fields[12].AsString;
PAIS := QEmpresa.Fields[13].AsString;
//procesamos el campo para logos
JpgLogo := nil;
MemoryStreamLogo := nil;
try
MemoryStreamLogo := TMemoryStream.create;
fldCampoLogo := QEmpresa.FieldByName('logo') as TBlobField;
StreamLogo := QEmpresa.CreateBlobStream(fldCampoLogo, bmRead);
MemoryStreamLogo.LoadFromStream(StreamLogo);
JpgLogo := TJpegImage.create;
JpgLogo.LoadFromStream(MemoryStreamLogo);
imgLogo.Picture.Assign(JpgLogo);
except
imgLogo.Picture.Assign(nil);
JpgLogo.Free;
end;
JpgLogo.Free;
MemoryStreamLogo.Free;
//procesamos el campo para la cedula
JpgCedula := nil;
MemoryStreamCedula := nil;
try
MemoryStreamCedula := TMemoryStream.create;
fldCampoCedula := QEmpresa.FieldByName('CEDULA') as TBlobField;
StreamCedula := QEmpresa.CreateBlobStream(fldCampoCedula, bmRead);
MemoryStreamCedula.LoadFromStream(StreamCedula);
JpgCedula := TJpegImage.create;
JpgCedula.LoadFromStream(MemoryStreamCedula);
imgCedula.Picture.Assign(JpgCedula);
except
imgCedula.Picture.Assign(nil);
JpgCedula.Free;
end;
JpgCedula.Free;
MemoryStreamCedula.Free;
QEmpresa.Next;
end;
end
else
begin
end;
//
end;
end.
[/pascal]
y lo llamo asi.
[pascal]
var
Empresa: TClasEmpresa;
begin
Empresa := TClasEmpresa.Create;
Empresa.CargaInfoEmp('RFCEMPRESA');
end
[/pascal]
pero algo hago mal.
por que quiero que la query se quede activa y que se cree al crearse la clase
en el constructorpongo esto
constructor TClasEmpresa.create;
begin
inherited create;
Transaction := TIBCTransaction.create(nil);
// Transaction.DefaultDataBase := Hilo_DataBase;
Transaction.DefaultConnection := DBF.IBCConnection1;
// Transaction.DefaultAction := TARollback;
Transaction.Params.Clear;
Transaction.Params.Add('read_committed');
Transaction.Params.Add('rec_version');
Transaction.Params.Add('nowait');
Transaction.StartTransaction;
QEmpresa := TIBCQuery.create(nil);
QEmpresa.Transaction := Transaction;
end;
y en el metodo
[pascal]
procedure TClasEmpresa.CargaInfoEmp(RFCEMP: string);
var
sql: string;
I: integer;
MemoryStreamLogo: TMemoryStream;
JpgLogo: TJpegImage;
fldCampoLogo: TField;
StreamLogo: TStream;
// variables para cedula
MemoryStreamCedula: TMemoryStream;
JpgCedula: TJpegImage;
fldCampoCedula: TField;
StreamCedula: TStream;
begin
sql := 'SELECT ';
sql := sql + ' ID, RFC, NOMBRE, PERSONALIDAD, ESQUEMAFACTURACION, ';
sql := sql + ' CALLE, NUMEXT, NUMINT, COLONIA, CP, LOCALIDAD, ESTADO, ';
sql := sql + 'MUNICIPIO, PAIS, LOGO, CEDULA ';
sql := sql + 'FROM EMPRESAS WHERE RFC = ';
if RFCEMP <> '' then
begin
// creamos un componente query nuevo que se ocnecte a la db
imgLogo := TImage.create(nil);
QEmpresa.Close;// AQUI ME DA UN ERROR DE ACCESO DE MEMORIA O ALGO ASI.
QEmpresa.sql.Clear;
QEmpresa.sql.Add(sql + '''' + RFCEMP + '''');
QEmpresa.Execute;
// si el rfc no esta vacio entonces cargamos toda la infor de la empresa seleccionada
// trataremos de cargar los logos y cedula si es que existen
for I := 0 to QEmpresa.RecordCount - 1 do
begin
// rellenamos los datos a los edits
ID := QEmpresa.Fields[0].AsInteger;
RFC := QEmpresa.Fields[1].AsString;
NOMBRE := QEmpresa.Fields[2].AsString;
PERSONALIDAD := QEmpresa.Fields[3].AsString;
ESQUEMAFACTURACION := QEmpresa.Fields[4].AsString;
CALLE := QEmpresa.Fields[5].AsString;
NUMEXT := QEmpresa.Fields[6].AsString;
NUMINT := QEmpresa.Fields[7].AsString;
COLONIA := QEmpresa.Fields[8].AsString;
CP := QEmpresa.Fields[9].AsString;
LOCALIDAD := QEmpresa.Fields[10].AsString;
ESTADO := QEmpresa.Fields[11].AsString;
MUNICIPIO := QEmpresa.Fields[12].AsString;
PAIS := QEmpresa.Fields[13].AsString;
//procesamos el campo para logos
JpgLogo := nil;
MemoryStreamLogo := nil;
try
MemoryStreamLogo := TMemoryStream.create;
fldCampoLogo := QEmpresa.FieldByName('logo') as TBlobField;
StreamLogo := QEmpresa.CreateBlobStream(fldCampoLogo, bmRead);
MemoryStreamLogo.LoadFromStream(StreamLogo);
JpgLogo := TJpegImage.create;
JpgLogo.LoadFromStream(MemoryStreamLogo);
imgLogo.Picture.Assign(JpgLogo);
except
imgLogo.Picture.Assign(nil);
JpgLogo.Free;
end;
JpgLogo.Free;
MemoryStreamLogo.Free;
//procesamos el campo para la cedula
JpgCedula := nil;
MemoryStreamCedula := nil;
try
MemoryStreamCedula := TMemoryStream.create;
fldCampoCedula := QEmpresa.FieldByName('CEDULA') as TBlobField;
StreamCedula := QEmpresa.CreateBlobStream(fldCampoCedula, bmRead);
MemoryStreamCedula.LoadFromStream(StreamCedula);
JpgCedula := TJpegImage.create;
JpgCedula.LoadFromStream(MemoryStreamCedula);
imgCedula.Picture.Assign(JpgCedula);
except
imgCedula.Picture.Assign(nil);
JpgCedula.Free;
end;
JpgCedula.Free;
MemoryStreamCedula.Free;
QEmpresa.Next;
end;
end
else
begin
end;
//
end;
[/pascal]
No entiendo por que da error se supone que al crearlo en el
constructor, el componente para querys debe de estar activo de forma que lo pueda usar.
y reutilizar. pues ya esta creado y es accesible a la clase.
[pascal]
unit ClasEmpresaU;
interface
uses
Forms, Windows, ActiveX, shlobj, ShellAPI, SysUtils, Registry, IniFiles,
Dialogs, DBU, Classes, DB, MemDS, DBAccess, IBC,
Graphics, jpeg, pngimage, ExtCtrls;
type
TClasEmpresa = Class(TObject)
private
QEmpresa: TIBCQuery;
Transaction: TIBCTransaction;
constructor create; virtual;
destructor destroy; override;
public
ID: integer;
RFC: string;
NOMBRE: string;
PERSONALIDAD: string;
ESQUEMAFACTURACION: string;
CALLE: string;
NUMEXT: string;
NUMINT: string;
COLONIA: string;
CP: string;
LOCALIDAD: string;
ESTADO: string;
MUNICIPIO: string;
PAIS: string;
imgLogo: TImage;
imgCedula: TImage;
procedure CargaInfoEmp(RFCEMP: string);
published
End;
implementation
constructor TClasEmpresa.create;
begin
inherited create;
end;
destructor TClasEmpresa.destroy;
begin
inherited destroy;
end;
procedure TClasEmpresa.CargaInfoEmp(RFCEMP: string);
var
sql: string;
I: integer;
MemoryStreamLogo: TMemoryStream;
JpgLogo: TJpegImage;
fldCampoLogo: TField;
StreamLogo: TStream;
// variables para cedula
MemoryStreamCedula: TMemoryStream;
JpgCedula: TJpegImage;
fldCampoCedula: TField;
StreamCedula: TStream;
begin
sql := 'SELECT ';
sql := sql + ' ID, RFC, NOMBRE, PERSONALIDAD, ESQUEMAFACTURACION, ';
sql := sql + ' CALLE, NUMEXT, NUMINT, COLONIA, CP, LOCALIDAD, ESTADO, ';
sql := sql + 'MUNICIPIO, PAIS, LOGO, CEDULA ';
sql := sql + 'FROM EMPRESAS WHERE RFC = ';
if RFCEMP <> '' then
begin
// creamos un componente query nuevo que se ocnecte a la db
imgLogo := TImage.create(nil);
QEmpresa := TIBCQuery.create(nil);
Transaction := TIBCTransaction.create(nil);
// Transaction.DefaultDataBase := Hilo_DataBase;
Transaction.DefaultConnection := DBF.IBCConnection1;
// Transaction.DefaultAction := TARollback;
Transaction.Params.Clear;
Transaction.Params.Add('read_committed');
Transaction.Params.Add('rec_version');
Transaction.Params.Add('nowait');
Transaction.StartTransaction;
QEmpresa := TIBCQuery.create(nil);
QEmpresa.Transaction := Transaction;
QEmpresa.Close;
QEmpresa.sql.Clear;
QEmpresa.sql.Add(sql + '''' + RFCEMP + '''');
QEmpresa.Execute;
// si el rfc no esta vacio entonces cargamos toda la infor de la empresa seleccionada
// trataremos de cargar los logos y cedula si es que existen
for I := 0 to QEmpresa.RecordCount - 1 do
begin
// rellenamos los datos a los edits
ID := QEmpresa.Fields[0].AsInteger;
RFC := QEmpresa.Fields[1].AsString;
NOMBRE := QEmpresa.Fields[2].AsString;
PERSONALIDAD := QEmpresa.Fields[3].AsString;
ESQUEMAFACTURACION := QEmpresa.Fields[4].AsString;
CALLE := QEmpresa.Fields[5].AsString;
NUMEXT := QEmpresa.Fields[6].AsString;
NUMINT := QEmpresa.Fields[7].AsString;
COLONIA := QEmpresa.Fields[8].AsString;
CP := QEmpresa.Fields[9].AsString;
LOCALIDAD := QEmpresa.Fields[10].AsString;
ESTADO := QEmpresa.Fields[11].AsString;
MUNICIPIO := QEmpresa.Fields[12].AsString;
PAIS := QEmpresa.Fields[13].AsString;
//procesamos el campo para logos
JpgLogo := nil;
MemoryStreamLogo := nil;
try
MemoryStreamLogo := TMemoryStream.create;
fldCampoLogo := QEmpresa.FieldByName('logo') as TBlobField;
StreamLogo := QEmpresa.CreateBlobStream(fldCampoLogo, bmRead);
MemoryStreamLogo.LoadFromStream(StreamLogo);
JpgLogo := TJpegImage.create;
JpgLogo.LoadFromStream(MemoryStreamLogo);
imgLogo.Picture.Assign(JpgLogo);
except
imgLogo.Picture.Assign(nil);
JpgLogo.Free;
end;
JpgLogo.Free;
MemoryStreamLogo.Free;
//procesamos el campo para la cedula
JpgCedula := nil;
MemoryStreamCedula := nil;
try
MemoryStreamCedula := TMemoryStream.create;
fldCampoCedula := QEmpresa.FieldByName('CEDULA') as TBlobField;
StreamCedula := QEmpresa.CreateBlobStream(fldCampoCedula, bmRead);
MemoryStreamCedula.LoadFromStream(StreamCedula);
JpgCedula := TJpegImage.create;
JpgCedula.LoadFromStream(MemoryStreamCedula);
imgCedula.Picture.Assign(JpgCedula);
except
imgCedula.Picture.Assign(nil);
JpgCedula.Free;
end;
JpgCedula.Free;
MemoryStreamCedula.Free;
QEmpresa.Next;
end;
end
else
begin
end;
//
end;
end.
[/pascal]
y lo llamo asi.
[pascal]
var
Empresa: TClasEmpresa;
begin
Empresa := TClasEmpresa.Create;
Empresa.CargaInfoEmp('RFCEMPRESA');
end
[/pascal]
pero algo hago mal.
por que quiero que la query se quede activa y que se cree al crearse la clase
en el constructorpongo esto
constructor TClasEmpresa.create;
begin
inherited create;
Transaction := TIBCTransaction.create(nil);
// Transaction.DefaultDataBase := Hilo_DataBase;
Transaction.DefaultConnection := DBF.IBCConnection1;
// Transaction.DefaultAction := TARollback;
Transaction.Params.Clear;
Transaction.Params.Add('read_committed');
Transaction.Params.Add('rec_version');
Transaction.Params.Add('nowait');
Transaction.StartTransaction;
QEmpresa := TIBCQuery.create(nil);
QEmpresa.Transaction := Transaction;
end;
y en el metodo
[pascal]
procedure TClasEmpresa.CargaInfoEmp(RFCEMP: string);
var
sql: string;
I: integer;
MemoryStreamLogo: TMemoryStream;
JpgLogo: TJpegImage;
fldCampoLogo: TField;
StreamLogo: TStream;
// variables para cedula
MemoryStreamCedula: TMemoryStream;
JpgCedula: TJpegImage;
fldCampoCedula: TField;
StreamCedula: TStream;
begin
sql := 'SELECT ';
sql := sql + ' ID, RFC, NOMBRE, PERSONALIDAD, ESQUEMAFACTURACION, ';
sql := sql + ' CALLE, NUMEXT, NUMINT, COLONIA, CP, LOCALIDAD, ESTADO, ';
sql := sql + 'MUNICIPIO, PAIS, LOGO, CEDULA ';
sql := sql + 'FROM EMPRESAS WHERE RFC = ';
if RFCEMP <> '' then
begin
// creamos un componente query nuevo que se ocnecte a la db
imgLogo := TImage.create(nil);
QEmpresa.Close;// AQUI ME DA UN ERROR DE ACCESO DE MEMORIA O ALGO ASI.
QEmpresa.sql.Clear;
QEmpresa.sql.Add(sql + '''' + RFCEMP + '''');
QEmpresa.Execute;
// si el rfc no esta vacio entonces cargamos toda la infor de la empresa seleccionada
// trataremos de cargar los logos y cedula si es que existen
for I := 0 to QEmpresa.RecordCount - 1 do
begin
// rellenamos los datos a los edits
ID := QEmpresa.Fields[0].AsInteger;
RFC := QEmpresa.Fields[1].AsString;
NOMBRE := QEmpresa.Fields[2].AsString;
PERSONALIDAD := QEmpresa.Fields[3].AsString;
ESQUEMAFACTURACION := QEmpresa.Fields[4].AsString;
CALLE := QEmpresa.Fields[5].AsString;
NUMEXT := QEmpresa.Fields[6].AsString;
NUMINT := QEmpresa.Fields[7].AsString;
COLONIA := QEmpresa.Fields[8].AsString;
CP := QEmpresa.Fields[9].AsString;
LOCALIDAD := QEmpresa.Fields[10].AsString;
ESTADO := QEmpresa.Fields[11].AsString;
MUNICIPIO := QEmpresa.Fields[12].AsString;
PAIS := QEmpresa.Fields[13].AsString;
//procesamos el campo para logos
JpgLogo := nil;
MemoryStreamLogo := nil;
try
MemoryStreamLogo := TMemoryStream.create;
fldCampoLogo := QEmpresa.FieldByName('logo') as TBlobField;
StreamLogo := QEmpresa.CreateBlobStream(fldCampoLogo, bmRead);
MemoryStreamLogo.LoadFromStream(StreamLogo);
JpgLogo := TJpegImage.create;
JpgLogo.LoadFromStream(MemoryStreamLogo);
imgLogo.Picture.Assign(JpgLogo);
except
imgLogo.Picture.Assign(nil);
JpgLogo.Free;
end;
JpgLogo.Free;
MemoryStreamLogo.Free;
//procesamos el campo para la cedula
JpgCedula := nil;
MemoryStreamCedula := nil;
try
MemoryStreamCedula := TMemoryStream.create;
fldCampoCedula := QEmpresa.FieldByName('CEDULA') as TBlobField;
StreamCedula := QEmpresa.CreateBlobStream(fldCampoCedula, bmRead);
MemoryStreamCedula.LoadFromStream(StreamCedula);
JpgCedula := TJpegImage.create;
JpgCedula.LoadFromStream(MemoryStreamCedula);
imgCedula.Picture.Assign(JpgCedula);
except
imgCedula.Picture.Assign(nil);
JpgCedula.Free;
end;
JpgCedula.Free;
MemoryStreamCedula.Free;
QEmpresa.Next;
end;
end
else
begin
end;
//
end;
[/pascal]
No entiendo por que da error se supone que al crearlo en el
constructor, el componente para querys debe de estar activo de forma que lo pueda usar.
y reutilizar. pues ya esta creado y es accesible a la clase.
#4
Escrito 09 noviembre 2011 - 04:32
Qué error te da? Y en qué linea?
#5
Escrito 09 noviembre 2011 - 09:06
con eureka log
me da este error
Exception:
--------------------------------------------------------------------------------------------------------------
2.1 Date : Wed, 9 Nov 2011 21:00:47 -0600
2.2 Address : 00585B8E
2.3 Module Name : AdminEmp.exe
2.4 Module Version:
2.5 Type : EAccessViolation
2.6 Message : Access violation at address 00585B8E in module 'AdminEmp.exe'. Read of address 00000000.
2.7 ID : 5C9D
2.8 Count : 1
2.9 Status : New
2.10 Note :
User:
la linea en el archivo es la linea 93
como que trato de acceder a una zona de memoria que ya se libero
aqui la unit
y adjunto la unit
gracias por tu apoyo..
me da este error
Exception:
--------------------------------------------------------------------------------------------------------------
2.1 Date : Wed, 9 Nov 2011 21:00:47 -0600
2.2 Address : 00585B8E
2.3 Module Name : AdminEmp.exe
2.4 Module Version:
2.5 Type : EAccessViolation
2.6 Message : Access violation at address 00585B8E in module 'AdminEmp.exe'. Read of address 00000000.
2.7 ID : 5C9D
2.8 Count : 1
2.9 Status : New
2.10 Note :
User:
la linea en el archivo es la linea 93
como que trato de acceder a una zona de memoria que ya se libero
aqui la unit
delphi
unit ClasEmpresaU; interface uses Forms, Windows, ActiveX, shlobj, ShellAPI, SysUtils, Registry, IniFiles, Dialogs, DBU, Classes, DB, MemDS, DBAccess, IBC, Graphics, jpeg, pngimage, ExtCtrls; type TClasEmpresa = Class(TObject) private QEmpresa: TIBCQuery; Transaction: TIBCTransaction; constructor create; virtual; destructor destroy; override; public ID: integer; RFC: string; NOMBRE: string; PERSONALIDAD: string; ESQUEMAFACTURACION: string; CALLE: string; NUMEXT: string; NUMINT: string; COLONIA: string; CP: string; LOCALIDAD: string; ESTADO: string; MUNICIPIO: string; PAIS: string; imgLogo: TImage; imgCedula: TImage; procedure CargaInfoEmp(RFCEMP: string); published End; implementation constructor TClasEmpresa.create; begin inherited create; QEmpresa := TIBCQuery.create(nil); Transaction := TIBCTransaction.create(nil); Transaction.DefaultConnection := DBF.IBCConnection1; Transaction.Params.Clear; Transaction.Params.Add('read_committed'); Transaction.Params.Add('rec_version'); Transaction.Params.Add('nowait'); Transaction.StartTransaction; QEmpresa := TIBCQuery.create(nil); QEmpresa.Transaction := Transaction; end; destructor TClasEmpresa.destroy; begin inherited destroy; end; procedure TClasEmpresa.CargaInfoEmp(RFCEMP: string); var sql: string; I: integer; MemoryStreamLogo: TMemoryStream; JpgLogo: TJpegImage; fldCampoLogo: TField; StreamLogo: TStream; // variables para cedula MemoryStreamCedula: TMemoryStream; JpgCedula: TJpegImage; fldCampoCedula: TField; StreamCedula: TStream; begin sql := 'SELECT '; sql := sql + ' ID, RFC, NOMBRE, PERSONALIDAD, ESQUEMAFACTURACION, '; sql := sql + ' CALLE, NUMEXT, NUMINT, COLONIA, CP, LOCALIDAD, ESTADO, '; sql := sql + 'MUNICIPIO, PAIS, LOGO, CEDULA '; sql := sql + 'FROM EMPRESAS WHERE RFC = '; if RFCEMP <> '' then begin // creamos un componente query nuevo que se ocnecte a la db imgLogo := TImage.create(nil); imgCedula := TImage.create(nil); QEmpresa.Close; [b]// aqui da error linea 93[/b] QEmpresa.sql.Clear; QEmpresa.sql.Add(sql + '''' + RFCEMP + ''''); QEmpresa.Execute; // si el rfc no esta vacio entonces cargamos toda la infor de la empresa seleccionada // trataremos de cargar los logos y cedula si es que existen for I := 0 to QEmpresa.RecordCount - 1 do begin // rellenamos los datos a los edits ID := QEmpresa.Fields[0].AsInteger; RFC := QEmpresa.Fields[1].AsString; NOMBRE := QEmpresa.Fields[2].AsString; PERSONALIDAD := QEmpresa.Fields[3].AsString; ESQUEMAFACTURACION := QEmpresa.Fields[4].AsString; CALLE := QEmpresa.Fields[5].AsString; NUMEXT := QEmpresa.Fields[6].AsString; NUMINT := QEmpresa.Fields[7].AsString; COLONIA := QEmpresa.Fields[8].AsString; CP := QEmpresa.Fields[9].AsString; LOCALIDAD := QEmpresa.Fields[10].AsString; ESTADO := QEmpresa.Fields[11].AsString; MUNICIPIO := QEmpresa.Fields[12].AsString; PAIS := QEmpresa.Fields[13].AsString; //procesamos el campo para logos JpgLogo := nil; MemoryStreamLogo := nil; try MemoryStreamLogo := TMemoryStream.create; fldCampoLogo := QEmpresa.FieldByName('logo') as TBlobField; StreamLogo := QEmpresa.CreateBlobStream(fldCampoLogo, bmRead); MemoryStreamLogo.LoadFromStream(StreamLogo); JpgLogo := TJpegImage.create; JpgLogo.LoadFromStream(MemoryStreamLogo); imgLogo.Picture.Assign(JpgLogo); except imgLogo.Picture.Assign(nil); JpgLogo.Free; end; JpgLogo.Free; MemoryStreamLogo.Free; //procesamos el campo para la cedula JpgCedula := nil; MemoryStreamCedula := nil; try MemoryStreamCedula := TMemoryStream.create; fldCampoCedula := QEmpresa.FieldByName('cedula') as TBlobField; StreamCedula := QEmpresa.CreateBlobStream(fldCampoCedula, bmRead); MemoryStreamCedula.LoadFromStream(StreamCedula); JpgCedula := TJpegImage.create; JpgCedula.LoadFromStream(MemoryStreamCedula); imgCedula.Picture.Assign(JpgCedula); except imgCedula.Picture.Assign(nil); JpgCedula.Free; end; JpgCedula.Free; MemoryStreamCedula.Free; QEmpresa.Next; end; end else begin end; // end; end.
y adjunto la unit
gracias por tu apoyo..
#6
Escrito 10 noviembre 2011 - 02:47
Buenas,
Veo que creas 2 veces el Query en el constructor, mira que no sea por eso (aunque no creo). También te falta asignarle el Database.
También es buena costumbre de, en el destructor, destruir los objetos creados (en este caso el Query)
Nos leemos
Veo que creas 2 veces el Query en el constructor, mira que no sea por eso (aunque no creo). También te falta asignarle el Database.
También es buena costumbre de, en el destructor, destruir los objetos creados (en este caso el Query)
Nos leemos
#7
Escrito 10 noviembre 2011 - 07:06
arregle el destructor y el contructor
pero sigue dando error cuando lo quiero usar
la unit completa
sera un error de los componentes
uso los ibdac de devart.
no se si sea eso. todo parece bien. :SS
delphi
constructor TClasEmpresa.create; begin inherited create; Transaction := TIBCTransaction.create(nil); Transaction.DefaultConnection := DBF.IBCConnection1;//conexion en un datamodule Transaction.Params.Clear; Transaction.Params.Add('read_committed'); Transaction.Params.Add('rec_version'); Transaction.Params.Add('nowait'); Transaction.StartTransaction; QEmpresa := TIBCQuery.create(nil); QEmpresa.Transaction := Transaction; QEmpresa.Connection := DBF.IBCConnection1; //conexion en un datamodule QEmpresa.AutoCommit := True; end; destructor TClasEmpresa.destroy; begin inherited destroy; Transaction.Free; QEmpresa.Free; end;
pero sigue dando error cuando lo quiero usar
delphi
// creamos un componente query nuevo que se ocnecte a la db imgLogo := TImage.create(nil); imgCedula := TImage.create(nil); QEmpresa.Close; //<---- Sige dando error aqui QEmpresa.sql.Clear; QEmpresa.sql.Add(sql + '''' + RFCEMP + ''''); QEmpresa.Execute;
la unit completa
delphi
unit ClasEmpresaU; interface uses Forms, Windows, ActiveX, shlobj, ShellAPI, SysUtils, Registry, IniFiles, Dialogs, DBU, Classes, DB, MemDS, DBAccess, IBC, Graphics, jpeg, pngimage, ExtCtrls; type TClasEmpresa = Class(TObject) private QEmpresa: TIBCQuery; //<--- los declaro aqui por que segun deben de estar accesibles a esta unidad solamente Transaction: TIBCTransaction; //<--- los declaro aqui por que segun deben de estar accesibles a esta unidad solamente constructor create; virtual; destructor destroy; override; public ID: integer; RFC: string; CONTRA:string; NOMBRE: string; PERSONALIDAD: string; ESQUEMAFACTURACION: string; CALLE: string; NUMEXT: string; NUMINT: string; COLONIA: string; CP: string; LOCALIDAD: string; ESTADO: string; MUNICIPIO: string; PAIS: string; imgLogo: TImage; imgCedula: TImage; procedure CargaInfoEmp(RFCEMP: string); published End; implementation constructor TClasEmpresa.create; begin inherited create; Transaction := TIBCTransaction.create(nil); Transaction.DefaultConnection := DBF.IBCConnection1;//conexion en un datamodule Transaction.Params.Clear; Transaction.Params.Add('read_committed'); Transaction.Params.Add('rec_version'); Transaction.Params.Add('nowait'); Transaction.StartTransaction; QEmpresa := TIBCQuery.create(nil); QEmpresa.Transaction := Transaction; QEmpresa.Connection := DBF.IBCConnection1; //conexion en un datamodule QEmpresa.AutoCommit := True; end; destructor TClasEmpresa.destroy; begin inherited destroy; Transaction.Free; QEmpresa.Free; end; procedure TClasEmpresa.CargaInfoEmp(RFCEMP: string); var sql: string; I: integer; MemoryStreamLogo: TMemoryStream; JpgLogo: TJpegImage; fldCampoLogo: TField; StreamLogo: TStream; // variables para cedula MemoryStreamCedula: TMemoryStream; JpgCedula: TJpegImage; fldCampoCedula: TField; StreamCedula: TStream; begin sql := 'SELECT '; sql := sql + ' ID, RFC, CONTRA, NOMBRE, PERSONALIDAD, ESQUEMAFACTURACION, '; sql := sql + ' CALLE, NUMEXT, NUMINT, COLONIA, CP, LOCALIDAD, ESTADO, '; sql := sql + 'MUNICIPIO, PAIS, LOGO, CEDULA '; sql := sql + 'FROM EMPRESAS WHERE RFC = '; if RFCEMP <> '' then begin // creamos un componente query nuevo que se ocnecte a la db imgLogo := TImage.create(nil); imgCedula := TImage.create(nil); QEmpresa.Close; //<---- Sige dando error aqui QEmpresa.sql.Clear; QEmpresa.sql.Add(sql + '''' + RFCEMP + ''''); QEmpresa.Execute; // si el rfc no esta vacio entonces cargamos toda la infor de la empresa seleccionada // trataremos de cargar los logos y cedula si es que existen for I := 0 to QEmpresa.RecordCount - 1 do begin // rellenamos los datos a los edits ID := QEmpresa.Fields[0].AsInteger; RFC := QEmpresa.Fields[1].AsString; CONTRA := QEmpresa.Fields[2].AsString; NOMBRE := QEmpresa.Fields[3].AsString; PERSONALIDAD := QEmpresa.Fields[4].AsString; ESQUEMAFACTURACION := QEmpresa.Fields[5].AsString; CALLE := QEmpresa.Fields[6].AsString; NUMEXT := QEmpresa.Fields[7].AsString; NUMINT := QEmpresa.Fields[8].AsString; COLONIA := QEmpresa.Fields[9].AsString; CP := QEmpresa.Fields[10].AsString; LOCALIDAD := QEmpresa.Fields[11].AsString; ESTADO := QEmpresa.Fields[12].AsString; MUNICIPIO := QEmpresa.Fields[13].AsString; PAIS := QEmpresa.Fields[14].AsString; //procesamos el campo para logos JpgLogo := nil; MemoryStreamLogo := nil; try MemoryStreamLogo := TMemoryStream.create; fldCampoLogo := QEmpresa.FieldByName('logo') as TBlobField; StreamLogo := QEmpresa.CreateBlobStream(fldCampoLogo, bmRead); MemoryStreamLogo.LoadFromStream(StreamLogo); JpgLogo := TJpegImage.create; JpgLogo.LoadFromStream(MemoryStreamLogo); imgLogo.Picture.Assign(JpgLogo); except imgLogo.Picture.Assign(nil); JpgLogo.Free; end; JpgLogo.Free; MemoryStreamLogo.Free; //procesamos el campo para la cedula JpgCedula := nil; MemoryStreamCedula := nil; try MemoryStreamCedula := TMemoryStream.create; fldCampoCedula := QEmpresa.FieldByName('cedula') as TBlobField; StreamCedula := QEmpresa.CreateBlobStream(fldCampoCedula, bmRead); MemoryStreamCedula.LoadFromStream(StreamCedula); JpgCedula := TJpegImage.create; JpgCedula.LoadFromStream(MemoryStreamCedula); imgCedula.Picture.Assign(JpgCedula); except imgCedula.Picture.Assign(nil); JpgCedula.Free; end; JpgCedula.Free; MemoryStreamCedula.Free; QEmpresa.Next; end; end else begin end; // end; end.
sera un error de los componentes
uso los ibdac de devart.
no se si sea eso. todo parece bien. :SS
#8
Escrito 12 noviembre 2011 - 02:07
Antes de la linea que te da el error mira de poner esto
Si es problema del QEmpresa, esto evitará el AV
Nos leemos
delphi
if not Assigned(QEmpresa) then begin ShowMessage('Query no creado'); Exit; end;
Si es problema del QEmpresa, esto evitará el AV
Nos leemos