PDA

Ver la Versión Completa : Obtener Nombre de la Unidad en Uso


rmendoza83
29-02-2016, 16:30:47
Buenos Dias compa;eros, un saludo cordial a todos.

Queria saber si alguno dispondra de una funcion que obtenga el nombre de la unidad en uso (UnitName), investigando en internet vi algo relacionado a la unidad RTTI que trabaja en base a esto, pero por falta de tiempo queria ver si ya alguien por aqui tendra alguna desarrollada! Estoy terminando un modulo de tratamiento de errores y quisiera incorporar en en log esta cadena para mejor soporte de usuarios.

Gracias.

escafandra
29-02-2016, 19:25:44
¿No te sirve extraerla de GetCurrentDirectory (https://msdn.microsoft.com/es-es/library/windows/desktop/aa364934(v=vs.85).aspx)?

Saludos.

roman
29-02-2016, 19:37:29
¿No te sirve extraerla de GetCurrentDirectory (https://msdn.microsoft.com/es-es/library/windows/desktop/aa364934(v=vs.85).aspx)?


Creo que el compañero se refiere a que, en una excepción, por ejemplo, poder mostrar el nombre de la unidad donde se produjo el error.

LineComment Saludos

ecfisa
29-02-2016, 22:54:42
Hola.

Podrías usar RTTI, por ejemplo:

unit uException;

interface

uses SysUtils;

type
TAppExceptHandler = class(TObject)
public
procedure Handle(Sender: TObject; E: Exception);
end;

var
AppExceptHandler: TAppExceptHandler;

implementation

uses TypInfo, Dialogs;

procedure TAppExceptHandler.Handle(Sender: TObject; E: Exception);
var
Ptd: PTypeData;
begin
Ptd := GetTypeData(Sender.ClassInfo);
if Assigned(Ptd) then
ShowMessage(Format('Se produjo un error en %s%s%s',[Ptd^.UnitName, #10, E.Message]))
else
//...
;
end;
end.



program Project1;

uses
Forms,
uException in 'uException.pas',
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},
Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
Application.OnException := AppExceptHandler.Handle;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


Forzar errores en distintas unidades :

unit Unit1;
...
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
...

implementation

uses Unit2, Unit3;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Visible := False;
Edit1.SetFocus; // Asignar foco a ctrl invisible
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self); // TStrings.LoadFromFile
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Form3 := TForm3.Create(Self); // ADOQuery sin configurar
end;

...


Resultado:
http://s7.postimg.org/b2fd97vy3/rmendoza.gif

Saludos :)

roman
01-03-2016, 00:22:03
Estupendo Daniel! Una pregunta, esta información (unit name) ¿viene en cualquier RTTI o sólo en las últimas versiones de Delphi?

LineComment Saludos

Casimiro Notevi
01-03-2016, 00:32:23
¡Qué monstruo! y lo fácil que parece.

ecfisa
01-03-2016, 00:45:19
Hola roman.

UnitName ya está definido en el tipo TTypeData en En Delphi 7, desconozco si lo está en versiones anteriores.

Saludos :)

roman
01-03-2016, 00:56:32
Gracias! No recordaba haberlo visto, pero qué bueno que lo aclaras.

LineComment Saludos

AgustinOrtu
01-03-2016, 04:52:23
Pues en Delphi 2010, la clase TObject ya dispone del siguiente metodo de clase:



TObject = class
public
class function UnitName: string;


La cual retorna el nombre de la unidad del tipo de clase en cuestion, y siendo que todo deriva de TObject :D

Asi que esto basicamente funciona:


ShowMessageFmt('UnitName %s', [TObject.UnitName]);
ShowMessageFmt('UnitName %s', [TForm1.UnitName]);
ShowMessageFmt('UnitName %s', [DescendienteDeTObject.UnitName]);

rmendoza83
01-03-2016, 16:14:05
Hola Saludos a todos! exactamente lo que me muestra ecfisa es lo necesito! Lo revisare a fondo! Gracias compa;ero!!!

rmendoza83
01-03-2016, 16:32:43
Ahora bien, que seria mas recomendable? utilizar una sola unidad para el control de errores? o hacer el control propiamente dentro de cada código en los bloques try...except que manejo? de esta manera esta bastante simplificada y esta totalmente adaptable a mi proyecto, aunque básicamente como lo vengo haciendo lo que necesitaba conocer era la linea de código de GetTypeData que me obtiene el apuntador con toda la información de donde se esta ejecutando el código en cuestión. Yo estoy trabajando con BDS 2006, que opinan?

elrayo76
09-03-2016, 15:12:19
Como recomendación te puedo decir que el try..except lo tienes que hacer. Igualmene puede llamar a tu código cuando se produce eun errror que tienes atrapado y ahí decidir que mostrar de acuerdo al error.

Cuando tenemos centralizada la funcionalidad para atrapar los errores, lo que hacemos muchos es mediante el código de error que le pasamos personalizamos el mensaje que se quiere mostrar. Des esta forma en todos los lugares donde se de el mismo error siempre saldrá el mismo mensaje. Eso si, tienes que saber que tipo de error dio ese código porque puede que dos errores de distintos tipos tengan el mismo código.

Si quieres puedes mandar otro parámetro mas a esa función para escribir algo mas que necesites en algún lugar particular. Esto es una primera ayuda, despues tu puedes ir complicandola lo mas que necesites.

Saludos,
El Rayo