Ver Mensaje Individual
  #4  
Antiguo 12-12-2012
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Reputación: 22
movorack Va camino a la famamovorack Va camino a la fama
Ok... me cogiste de buenas pulgas y pues...

Antes que leas el código recuerda:

Buscar siempre en google.
Aquí una entrada en Delphi FAQ's
temas relacionados en About.com

Ahora sí... una aproximación a lo que te sugerí. La implementación depende de tu programa.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    function OpenDataset(DataSet : TDataSet; StrSQL : string; Parameters : array of Variant) : Boolean;
  public
    { Public declarations }
    //Mi propia función de manejo de excepciones
    procedure MyOnException(Sender: TObject; E : Exception);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyOnException(Sender: TObject; E: Exception);
begin
  {Aquí puedo manejar cualquier cosa antes de mostrare el mensaje de error
   Ej: Escribir en un log, Enviar alguna notificación}

  //No se debe volver a hacer raise de la excepción ya que
  //Esto generaría un bucle que llevaría a error
  Application.ShowException(E);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Al crear el formulario Establezco mi función
  //como manejador de excepciones global
  Application.OnException := MyOnException;
end;

procedure TForm1.Button1Click(Sender: TObject);
  var
    lQry : TQuery;
begin
  lQry := TQuery.Create(Self);
  try
    try
      if lQry.Active then
        lQry.Close;
      lQry.Open;
    except
      on e : EDatabaseError do
      begin
        if Pos('NO SQL', UpperCase(E.Message)) > 0 then
          raise Exception.Create('No ha establecido la cadena de consulta.')
        else
          raise Exception.Create('Ha ocurrido un error en el acceso a datos. Error: '+e.Message);
      end;
      on e : exception do
      begin
        raise Exception.Create('Ha ocurrido un error general al ejecutar la consulta. Error: '+e.Message);
      end;
    end;
  finally
    lQry.Free;
  end;
end;

function TForm1.OpenDataset(DataSet: TDataSet; StrSQL: string;
  Parameters: array of Variant): Boolean;
  var
    i : Integer;
begin
  if DataSet.Active then
    DataSet.Close;

  if DataSet is TQuery then
  begin
    TQuery(DataSet).SQL.Text := StrSQL;
    for i := 0 to Length(Parameters) - 1 do
    begin
      TQuery(DataSet).Params[i].Value := Parameters[i];
    end;
  end;

  try
    DataSet.Open;
  except
    on e : Exception do
    begin
      {Aquí darle el manejo que necesito para tratar de solucionar el error}
      raise;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
    lQry : TQuery;
begin
  lQry := TQuery.Create(Self);
  try
    OpenDataset(lQry, 'select * from tabla where id = :id', [123456]);
  finally
    lQry.Free;
  end;
end;

end.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita