FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Excepcion EAccesViolation
Hola,
Cree una clase TFechaHora unit CFechaHora; interface uses Windows, Messages, Forms, Dialogs, SysUtils, StdCtrls; type TFechaHora = class // private { Private declarations } dia: integer; mes: integer; anio: integer; hora: string; // public { Public declarations } constructor Create; function getDia():integer; function getMes():integer; function getMesCadena():string; function getAnio():integer; function getFechaCad():string; function getHora():string; procedure setHoy(); procedure setFecha (d, m, a: integer); procedure setHora(h: string); end; var FechaHora: TFechaHora; implementation uses tablas1, ModUtilitarios; constructor TFechaHora.Create; begin dia:=0; mes:=0; anio:=0; end; function TFechaHora.getDia():integer; begin result:=FechaHora.dia; end; function TFechaHora.getMes():integer; begin result:=FechaHora.mes; end; unction TFechaHora.getMesCadena():string; var var_mes: integer; var_cadena: string; begin var_mes:= FechaHora.getMes(); case var_Mes of 1: var_cadena:='Enero'; 2: var_cadena:='Febrero'; 3: var_cadena:='Marzo'; 4: var_cadena:='Abril'; 5: var_cadena:='Mayo'; 6: var_cadena:='Junio'; 7: var_cadena:='Julio'; 8: var_cadena:='Agosto'; 9: var_cadena:='Septiembre'; 10: var_cadena:='Octubre'; 11: var_cadena:='Noviembre'; 12: var_cadena:='Diciembre'; end; result:= var_cadena; end; function TFechaHora.getAnio():integer; begin getAnio:=FechaHora.anio; end; function TFechaHora.getFechaCad():string; var var_dia, var_anio, var_cad: string; begin str(FechaHora.getDia(),var_dia); str(FechaHora.getAnio(),var_anio); var_cad:= var_dia+FechaHora.getMesCadena()+var_anio; showmessage(var_cad); result:= var_cad; end; function TFechaHora.getHora():string; begin getHora:=FechaHora.hora; end; procedure TFechaHora.setHoy(); begin //Completar end; procedure TFechaHora.setFecha (d, m, a: integer); var var_d, var_m, var_a: string; begin var_d:= IntToStr(d); var_m:= IntToStr(m); var_a:= IntToStr(a); showmessage('en el CONSTRUCTOR'+var_d+' '+var_m+' '+var_a); dia:=d; mes:=m; anio:=a; end; procedure TFechaHora.setHora(h: string); begin hora:=h; end; end. Por el momento hago uso de esta clase de la siguiente manera: procedure TSERrecepcion.but_registrarClick(Sender: TObject); var var_hoy: string; fecha: TFechaHora; begin fecha.Create; var_hoy:=fecha.getFechaCad(); // fecha.setFecha(28,10,2003); // FechaHora.setFecha(28,10,2003); fecha.Free; Showmessage ('Fecha Actual'+var_hoy); end; Y al momento de hacer correr me sale un error de EAccessViolation, realice un trace, al parecer el constructor se ejecuta bien (asume los valores correspondientes), pero al tratar de recuperar los valores de los atributos (getDia(), getMes(), getAnio()) salen el error. Trate de llamar a otro método (setFecha) y me vuelve a salir el error al asignar valores a los atributos. Los atributos antes eran privados (pense que ese era el error), quite la instruccion y tengo el mismo problema, también probé poniendo: Self.dia:=d; y nada. ¿¿¿Alguna sugerencia??? |
#2
|
||||
|
||||
Sin profundizar demasiado en tu código, puedo decirte que esta mal la implementación. Para crear una nueva instancia de una clase, la sintaxis es "Nombre de la Clase"+"Método Constructor" (TMiClase.Create), por lo que tu código tendría que ser algo como:
Código:
procedure TSERrecepcion.but_registrarClick(Sender: TObject); var var_hoy: string; fecha: TFechaHora; begin fecha := TFechaHora.Create; try var_hoy := fecha.getFechaCad(); ... finally fecha.Free; end; Showmessage ('Fecha Actual'+var_hoy); end; Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
|||
|
|||
Cambia la primera línea dentro del procedure:
Código:
procedure TSERrecepcion.but_registrarClick(Sender: TObject); var var_hoy: string; fecha: TFechaHora; begin fecha := TFechaHora.Create; var_hoy:=fecha.getFechaCad(); // fecha.setFecha(28,10,2003); // FechaHora.setFecha(28,10,2003); fecha.Free; Showmessage ('Fecha Actual'+var_hoy); end;
__________________
Guía de Estilo |
#4
|
||||
|
||||
Los métodos getDia, getMes, etc. de la clase TFechaHora hacen referencia a la variable global FechaHora que nunca se construye.
Además no es recomendable que los métodos de una clase hagan referencia a una variable de la misma clase. Más aún, además de estos errores en el evento Click del final "construtes" una instancia de FechaHora de manera incorrecta: fecha.create Debe ser fecha := TFechaHora.Create; // Saludos |
#5
|
||||
|
||||
Se me adelantaron delphi.com.ar y andres1569. Sólo te reitero que, aún corrigiendo lo que ellos bien te indican, también deberás fijarte en los primero que te mencioné.
// Saludos |
#6
|
||||
|
||||
Cita:
Código:
function TFechaHora.getDia():integer; begin Result := dia; end; function TFechaHora.getMes():integer; begin Result := Self.mes; end; Cita:
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#7
|
||||
|
||||
Cita:
// Saludos |
#8
|
|||
|
|||
Hola:
corregi, los errores que me mencionaron, ahora si funciona Gracias, |
#9
|
||||
|
||||
EAccesViolation
Hola a todos, estoy realizando un QReport y necesite agregar un nuevo procedimiento y no se k estoy haciendo mal pero me saca un error de 'Acces Violation at adress 005313EE in module ...'
Adjunto el codigo que eh ingresado y agradezco la ayuda k me puedan brindar. Código:
unit UInfManualET; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, QuickRpt, QRCtrls, Jpeg, Menus, QRExport, StdCtrls; type TInfManualET = class(TForm) QRManualET: TQuickRep; SUBDetalleDefectos: TQRSubDetail; QRWMFFilter1: TQRWMFFilter; PopupMenu1: TPopupMenu; ............................... blanco5: TQRLabel; blanco6: TQRLabel; cantotempaque: TQRLabel; QRLblUnidad: TQRLabel; procedure QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); procedure SubDetalleEmpaquesBeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); private { Private declarations } public { Public declarations } end; var InfManualET: TInfManualET; contpartes, contador, contador1:word; imgensamble, imgpartes, imgempaque, imgestiba, nueva1, nueva2, nueva3, nueva4, cliente:string; implementation uses UDMinformes, UDMsip1, UDMsip, UInfManualSSD; {$R *.DFM} Procedure MueveTitulo; ForWard; procedure TInfManualET.QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin QRLblParte1.Caption:=''; QRLblParte2.Caption:=''; QRLblParte3.Caption:=''; QRLblRef1.Caption:=''; QRLblRef2.Caption:=''; QRLblRef3.Caption:=''; contpartes:=0; DmInformes.QPartes.Open; DmInformes.QPartes.params[0].AsString:=DmInformes.QFichaProducto['referencia']; DmInformes.QPartes.close; DmInformes.Qpartes.Open; DmSip1.TblEnsamble.open; DmSip1.TblOrdenEnsam.Open; Dmsip1.TblOrdenTrabajo.open; DmSip.Tblproductos.open; with DmInformes do begin if DmInformes.Qpartes['IMPRESION']='N' then begin contpartes:=contpartes+1; case contpartes of 1: begin QRLblParte1.Caption:=DmInformes.Qpartes['referencia_1']; QRLblRef1.caption:=DmInformes.Qpartes['descripcion_pdto']; end; 2: begin QRLblParte2.Caption:=DmInformes.Qpartes['referencia_1']; QRLblRef2.caption:=DmInformes.Qpartes['descripcion_pdto']; end; 3: begin QRLblParte3.Caption:=DmInformes.Qpartes['referencia_1']; QRLblRef3.caption:=DmInformes.Qpartes['descripcion_pdto']; end; end; DmInformes.QPartes.Next; end; imgensamble :='E:\sip\datos\productos\'+QFichaProducto['referencia']+'.jpg'; imgpartes :='E:\sip\datos\partes\'+QFichaProducto['referencia']+'.jpg'; imgempaque:='E:\sip\datos\empaques\'+QFichaProducto['referencia']+'.jpg'; imgestiba:='E:\sip\datos\estiba\'+QFichaProducto['referencia']+'.jpg'; try QRImage1.Picture.LoadFromFile(imgensamble); QRImage2.Picture.LoadFromFile(imgpartes); QRImage3.Picture.LoadFromFile(imgempaque); QRImage4.Picture.LoadFromFile(imgestiba); except begin QRImage1.picture:=nil; QRImage2.picture:=nil; QRImage3.picture:=nil; QRImage4.picture:=nil; end; end; end; end; procedure TInfManualET.SubDetalleEmpaquesBeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin contador := 0; with DmInformes do begin DmSip.TblEmpaquet.open; QLeeEmpaqueProducto.params[0].AsString := QFichaProducto['referencia']; QLeeEmpaqueProducto.params[1].AsString := cliente; QLeeEmpaqueProducto.close; QLeeEmpaqueProducto.open; QLeeProductoDefecto.open; //esto es una tbl cantotempaque.caption := ''; contador1 := 1; if (QLeeEmpaqueProducto['cantidadotros4'] = 0) or (QLeeEmpaqueProducto['cantidadotros4'] = null) then else cantotempaque.caption := FormatFloat('###,###',QLeeEmpaqueProducto['cantidadotros4']); if (QLeeEmpaqueProducto['cantidadotros3'] = 0) or (QLeeEmpaqueProducto['cantidadotros3'] = null) then else cantotempaque.caption := FormatFloat('###,###',QLeeEmpaqueProducto['cantidadotros3']); if (QLeeEmpaqueProducto['cantidadotros2'] = 0) or (QLeeEmpaqueProducto['cantidadotros2'] = null) then else cantotempaque.caption := FormatFloat('###,###',QLeeEmpaqueProducto['cantidadotros2']); if (QLeeEmpaqueProducto['cantidadotros1'] = 0) or (QLeeEmpaqueProducto['cantidadotros1'] = null) then else cantotempaque.caption := FormatFloat('###,###',QLeeEmpaqueProducto['cantidadotros1']); if (QLeeEmpaqueProducto['cantidadbolsa'] = 0) or (QLeeEmpaqueProducto['cantidadbolsa'] = null) then else cantotempaque.caption := FormatFloat('###,###',QLeeEmpaqueProducto['cantidadbolsa']); if (QLeeEmpaqueProducto['cantidad'] = 0) or (QLeeEmpaqueProducto['cantidad'] = null) then else cantotempaque.caption := FormatFloat('###,###',QLeeEmpaqueProducto['cantidad']); end; with DmSip do begin empaque1.caption := ''; empaque2.caption := ''; empaque3.caption := ''; empaque4.caption := ''; empaque5.caption := ''; empaque6.caption := ''; blanco1.caption := ''; blanco2.caption := ''; blanco3.caption := ''; blanco4.caption := ''; blanco5.caption := ''; blanco6.caption := ''; TblEmpaqueT.open; nueva1:=cliente; nueva2:=tblempaquet['referencia']; nueva3:= DmInformes.QLeeEmpaqueProducto['caja']; nueva4:=DmInformes.QLeeEmpaqueProducto['bolsa']; if TblEmpaquet.locate('referencia', DmInformes.QLeeEmpaqueProducto['caja'],[]) then begin contador := contador + 1; MueveTitulo; end; if TblEmpaquet.locate('referencia', DmInformes.QLeeEmpaqueProducto['bolsa'],[]) then begin contador := contador + 1; MueveTitulo; end; if TblEmpaquet.locate('referencia', DmInformes.QLeeEmpaqueProducto['otros1'],[]) then begin contador := contador + 1; MueveTitulo; end; if TblEmpaquet.locate('referencia', DmInformes.QLeeEmpaqueProducto['otros2'],[]) then begin contador := contador + 1; MueveTitulo; end; if TblEmpaquet.locate('referencia', DmInformes.QLeeEmpaqueProducto['otros3'],[]) then begin contador := contador + 1; MueveTitulo; end; if TblEmpaquet.locate('referencia', DmInformes.QLeeEmpaqueProducto['otros4'],[]) then begin contador := contador + 1; MueveTitulo; end; dminformes.p.next; cliente:=dminformes.p['cliente']; end; end; procedure MueveTitulo; begin if contador = 1 then InfManualSSD.empaque1.caption := ' '+DmSip.TblEmpaquet['descripcion']; if contador = 2 then InfManualSSD.empaque2.caption := ' '+DmSip.TblEmpaquet['descripcion']; if contador = 3 then InfManualSSD.empaque3.caption := ' '+DmSip.TblEmpaquet['descripcion']; if contador = 4 then InfManualSSD.empaque4.caption := ' '+DmSip.TblEmpaquet['descripcion']; if contador = 5 then InfManualSSD.empaque5.caption := ' '+DmSip.TblEmpaquet['descripcion']; if contador = 6 then InfManualSSD.empaque6.caption := ' '+DmSip.TblEmpaquet['descripcion']; end; end.
__________________
Alejandrina |
#10
|
||||
|
||||
Hola Alejandrina.
Creo que debiste publicar el mensaje como un hilo nuevo, ya que difiere significativamente del tema empezado por Tica. Seguramente algún moderador lo acomodará como corresponde. Mientras tanto, dinos en qué línea de tu código se detiene el programa cuando surge la excepción. Gracias. Al González. |
|
|
|