Concepto: RTTI (RunTime Type Information)
#1
Escrito 28 mayo 2009 - 08:49
Hace sólo una semana que he empezado a usar RTTI, y me ha dejado alucinado lo que se puede hacer con RTTI.
Aqui dejo un par de enlaces sobre el tema, mientras saco tiempo para traducirlos:
http://www.blong.com...iRTTI/CB140.htm
http://delphi.about..../delphirtti.htm
#2
Escrito 28 mayo 2009 - 08:55
Salud OS
#3
Escrito 28 mayo 2009 - 09:05
Trabajo con un proyecto "monstruoso", y al compilar con Delphi 6, hay veces que da AV en los sitios más dispares, como en rtl60.bpl o ntdll.dll y lo peor es que en algunos módulos de datos, los componentes pierden su enlace con el componente IBDatabase (y IBTransaction).
Como es tan grande el proyecto y usa multitud de componentes enlazados a datos de distintas clases, para recuperar el enlace al objeto IBDatabase en ejecución y evitar los mensajes del tipo "Database not assigned", me pregunté si habría alguna forma de asignar el objeto IBDataBase a todos esos componentes. Ahí es donde interviene la RTTI.
En vez de hacer esta "locura" o algo peor:
// A lo bestia !! for i:=0 to (TDataModule(Sender).ComponentCount - 1) do begin if (Dm.Components[i] is TpgIBDataSet) then begin TpgIBDataSet(Dm.Components[i]).Database := DatosSesion.BaseDatosGESTION5; TpgIBDataSet(Dm.Components[i]).Transaction := DatosSesion.IBTransaccion; end; if (Dm.Components[i] is TpgIBQuery) then begin TpgIBQuery(Dm.Components[i]).Database := DatosSesion.BaseDatosGESTION5; TpgIBQuery(Dm.Components[i]).Transaction := DatosSesion.IBTransaccion; end; if (Dm.Components[i] is TpgIBStoredProc) then begin TpgIBStoredProc(Dm.Components[i]).Database := DatosSesion.BaseDatosGESTION5; TpgIBStoredProc(Dm.Components[i]).Transaction := DatosSesion.IBTransaccion; end; // Y demás clases que se usan, como TIBDataSet, TIBQuery, TIBSQL, etc. end;
Lo solucioné así:
procedure Reasignar_enlace_BaseDatos(Dm: TDataModule); var i:Integer; PropInfo: PPropInfo; begin // Rutina para evitar que los TpgIBDataSet, TpgIBQuery, TpgIBStoredProc // pierdan su enlace con el componente de Base de Datos // debido a errores al cerrar el Delphi (Access Violation) // Para ello uso RTTI de Delphi, que permite buscar/leer/modificar propiedades en los componentes // 1.-Se recorren todos los objetos del módulo de datos que viene como parámetro for i:=0 to (Dm.ComponentCount - 1) do begin // 2.-Buscamos si el componente tiene la propiedad 'Database' PropInfo := TypInfo.GetPropInfo(Dm.Components[i].ClassInfo, 'Database') ; if Assigned(PropInfo) then begin // 3.-Damos el valor que queremos a la propiedad 'Database' TypInfo.SetOrdProp(Dm.Components[i], PropInfo, LongInt(DatosSesion.BaseDatosGESTION5)); // 4.-Buscamos si el componente tiene la propiedad 'Transaction' PropInfo := TypInfo.GetPropInfo(Dm.Components[i].ClassInfo, 'Transaction') ; if Assigned(PropInfo) then // 5.-Damos el valor que queremos a la propiedad 'Transaction' TypInfo.SetOrdProp(Dm.Components[i], PropInfo, LongInt(DatosSesion.IBTransaccion)); end; end;
#4
Escrito 28 mayo 2009 - 09:14
Como la definiste (si se puede saber)
Salud OS
#5
Escrito 28 mayo 2009 - 09:19
PPropInfo = ^TPropInfo; TPropInfo = packed record PropType: PPTypeInfo; GetProc: Pointer; SetProc: Pointer; StoredProc: Pointer; Index: Integer; Default: Longint; NameIndex: SmallInt; Name: ShortString; end;
#6
Escrito 28 mayo 2009 - 09:28
Salud OS
PD, no estaría nada mal que nos aportaras con un tutorial amigo, dejanos saber si te animas para crearte un acceso al foro de borradores donde puedas ir creandolo y cuando decidas publicarlo.
#7
Escrito 28 mayo 2009 - 09:38
pero dispongo de poco tiempo para ello (ahora mismo estoy en el trabajo y mi jefe no está),
y cuando salgo de trabajar sobre las 19:00, tengo una niña pequeña que consume el 98% de mi tiempo, de 23:30 a 01:00 + o - me dedico a estudiar para unas oposiciones de la Junta de Castilla-La Mancha, pero prometo que revisaré los libros de la Guía de Desarrollo Delphi 5 de Steve Teixeira y Xavier Pacheco para hacer un tutorial sobre RTTI.
#8
Escrito 28 mayo 2009 - 10:17
Gracias egostar, de buenas intenciones estoy lleno,
pero dispongo de poco tiempo para ello (ahora mismo estoy en el trabajo y mi jefe no está),
y cuando salgo de trabajar sobre las 19:00, tengo una niña pequeña que consume el 98% de mi tiempo, de 23:30 a 01:00 + o - me dedico a estudiar para unas oposiciones de la Junta de Castilla-La Mancha, pero prometo que revisaré los libros de la Guía de Desarrollo Delphi 5 de Steve Teixeira y Xavier Pacheco para hacer un tutorial sobre RTTI.
No te preocupes amigo, primero lo primero no corre prisa.
Salud OS