Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-12-2012
Pedrote Pedrote is offline
Miembro
 
Registrado: dic 2007
Posts: 35
Poder: 0
Pedrote Va por buen camino
Problema con una excepción que no consigo resolver.

El código es el siguiente:
Código Delphi [-]
......
.....
function TForm1.GetValIni(secc, val: string): string;
begin
  INI := TINIFILE.Create(Config);
  Result := INI.ReadString(secc, val, '');
  INI.Free;
end;

// Configura los parámetros de conexión a MSSQL
function TForm1.ObtenerDatosConnDB: boolean;
begin
  if CheckValIni('BD', 'Inst') and CheckValIni('BD', 'Usuario') and
    CheckValIni('BD', 'Usuario') then
  begin
    MSSQLConnection1.HostName := GetValIni('BD', 'Inst');
    MSSQLConnection1.UserName := GetValIni('BD', 'Usuario');
    MSSQLConnection1.Password := descifrar(GetValIni('BD', 'Pass'));
    Result := True;
    exit;
  end;
  Result := False;
end;

// Obtiene el nombre de la BD del ejercicio de año actual
function TForm1.ObtenerBDEjActual: string;
begin
  if ObtenerDatosConnDB then
  begin
    MSSQLConnection1.DatabaseName := 'COMU0001';
    MSSQLConnection1.Connected := True;
    if MSSQLConnection1.Connected then
    begin
      SQLQuery1.SQL.Text := 'SELECT [CONEXION] ' +
                            'FROM ejercici ' +
                            'WHERE [ANY] = '
                                   + '''' + FormatDateTime('yyyy', Now) + ''';';
      SQLQuery1.Open;
      Result := SQLQuery1.FieldByName('CONEXION').AsString;
      SQLQuery1.Close;
      exit;
    end;
    MSSQLConnection1.Connected := False;
  end;
end;               
...
...
procedure TForm1.Button3Click(Sender: TObject);
var
  prueba: string;
begin
    prueba := ObtenerBDEjActual;
    ShowMessage(prueba);
end;

El problema es al pulsar por segunda vez el botón que me genera una excepción de la clase 'External: SIGSEGV', la primera vez obtengo sin problemas los datos de la query. ¿Cómo puedo solucionarlo?. Gracias de antemano.

Última edición por Casimiro Notevi fecha: 16-12-2012 a las 14:25:11.
Responder Con Cita
  #2  
Antiguo 16-12-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Los errores SIGSEGV se producen porque se intenta acceder a memoria fuera del marco de memoria de la aplicación. Normalmente se debe a que se olvidó crear algún objeto o se destruyó algún objeto y luego se intentó usar. La única forma de descubrir lo que falla es saber en qué punto se produce el error.

Por otro lado, ¿por qué creas y destruyes el objeto INI cada vez que accedes a una variable? Eso es una merma de rendimiento enorme. Lo mejor es que cargues el archivo INI al principio de ObtenerDatosConnDB, obtengas todos los valores, y destruyas el objeto antes del IF.

De todas formas, ¿te compila? Porque estás usando cadenas de caracteres en lugares donde se esperan expresiones booleanas. A mi nunca me deja compilar cosas así (Free Pascal).
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 16-12-2012
Pedrote Pedrote is offline
Miembro
 
Registrado: dic 2007
Posts: 35
Poder: 0
Pedrote Va por buen camino
Ya lo solucione, era un objeto que no estaba creado. Respecto a lo del objeto INI tienes razón, pero es que no lo uso solo para obtener los parámetros de conexión de la BD si no para otras configuraciones de la aplicación FTP, ciertos directorios, etc. ¿Ves conveniente hacerme una función especifica que me recoja las variables de cada determinada sección del INI?. Yo no veo donde dices que mezclo tipos :S compilar compila.
Responder Con Cita
  #4  
Antiguo 16-12-2012
pedrolazarus pedrolazarus is offline
Miembro
NULL
 
Registrado: sep 2012
Posts: 91
Poder: 12
pedrolazarus Va por buen camino
Cita:
Empezado por Pedrote Ver Mensaje
El código es el siguiente:

El problema es al pulsar por segunda vez el botón que me genera una excepción de la clase 'External: SIGSEGV', la primera vez obtengo sin problemas los datos de la query. ¿Cómo puedo solucionarlo?. Gracias de antemano.
Nada, no habia visto q lo solucionaste.
Responder Con Cita
  #5  
Antiguo 18-12-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por Pedrote Ver Mensaje
Respecto a lo del objeto INI tienes razón, pero es que no lo uso solo para obtener los parámetros de conexión de la BD si no para otras configuraciones de la aplicación FTP, ciertos directorios, etc. ¿Ves conveniente hacerme una función especifica que me recoja las variables de cada determinada sección del INI?
No, no es conveniente. Lo que debes hacer, entonces, es crear el objeto INI en una unidad (por ejemplo, uno que se llame "config.pas") y acceder a él cuando necesites obtener información.

Código Delphi [-]
UNIT config;
(* Carga y permite el acceso a la configuración. *)

INTERFACE

  CONST
  (* Nombre del archivo de configuración. *)
    ArchivoConfiguracion = 'config.ini';

(* Devuelve el valor de configuración solicitado. *)
  FUNCTION GetValIni (secc, val: STRING): STRING;

IMPLEMENTATION

  USES
    IniFiles;

  VAR
  (* Contiene el archivo de configuración. *)
    ArchivoIni: TIniFile;

(* Devuelve el valor de configuración solicitado. *)
  FUNCTION GetValIni (secc, val: STRING): STRING;
  BEGIN
    GetValIni := ArchivoIni.ReadString (secc, val, '');
  END;

INITIALIZATION
(* Crea y carga el objeto. *)
  ArchivoIni := TIniFIle.Create (ArchivoConfiguracion);
FINALIZATION
(* Destruye el objeto. *)
  ArchivoIni.Free;
END.
Esto mejora el rendimiento, a costa de usar un poco más de memoria.

Cita:
Empezado por Pedrote Ver Mensaje
Yo no veo donde dices que mezclo tipos :S compilar compila.
Aquí:
Código Delphi [-]
  if CheckValIni('BD', 'Inst') and CheckValIni('BD', 'Usuario') and
    CheckValIni('BD', 'Usuario') then
Se supone que CheckValIni devuelve STRING pero los IF esperan un BOOLEAN. En FreePascal no compila, y al menos cuando usaba Delphi 6 tampoco.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 18-12-2012 a las 12:22:53.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con excepción franroju Varios 7 10-11-2012 02:19:24
Como resolver el problema del 0 dauryakatimi2 C++ Builder 6 13-04-2011 13:38:59
problema con una excepcion advancexz Varios 3 07-01-2009 22:15:52
Problema con matrices que no logro resolver galmacland Varios 11 20-06-2006 19:03:45
que necesito resolver problema. evgoab SQL 5 12-03-2005 02:19:53


La franja horaria es GMT +2. Ahora son las 22:42:22.


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