Pregunta

Estoy tratando de dividir mi aplicación monolítica Delphi-Win32 en bibliotecas, así que recibo algunas preguntas sobre cómo compartir variables globales y objetos entre mis bibliotecas usando Delphi 2009. Por ejemplo, tengo 3 objetos globales (derivados de TObject): para información de usuario, para información de sesión actual y para almacenar la conexión de base de datos activa y administrar operaciones con esta base de datos. Mis bibliotecas requieren trabajar con estos objetos. Además, ciertas bibliotecas darían un objeto derivado de TForm para ser alojado para otro control principal en el formulario principal. Cada objeto derivado de TForm pasado a la forma principal tiene sus propios métodos y propiedades, es decir, sus clases son diferentes entre sí.

Estoy pensando en poner los objetos globales en una biblioteca separada pero supongo que haría las cosas más difíciles, pero considérelo, por favor.

¿Cómo llegar a trabajar esta situación?

Una pregunta más, ¿cuál es mejor usar: carga estática o dinámica para bibliotecas? ¿Me puede recomendar algunos libros o sitios para aprender más sobre esto?

Gracias de antemano.

¿Fue útil?

Solución

Lo que hemos hecho en el pasado para compartir variables entre módulos (utilizamos BPL) fue pasarlas a través de una TStringList compartida. En términos generales, es mejor tener un objeto compartido global con todas sus variables compartidas.

Cualquier cosa a la que se haga referencia entre más de una biblioteca debe estar en su propia biblioteca . El consejo de Mason fue sólido .

Vaya con carga estática, a menos que realmente necesite dinámica por alguna razón específica (que no parece). Deje que el administrador de memoria de Windows intercambie bibliotecas innecesarias de la memoria.

Un consejo de alguien que administró una aplicación grande dividida en múltiples bibliotecas. Teníamos nuestros componentes en paquetes, el VCL, algunas rutinas comunes de aplicaciones y luego una biblioteca para cada "pantalla". o segmento de la aplicación. Para los cambios en las pantallas, era posible liberar esa biblioteca actualizada, pero para los cambios en cualquiera de los otros tipos de bibliotecas, descubrimos que generalmente tenía que volver a implementar todo. Por lo tanto, era raro que disfrutamos de una ventaja de la configuración.

Otros consejos

Parece que por '' bibliotecas '' te refieres a los paquetes BPL, así que aquí están las pautas:

Cada BPL, cuando se carga, carga todas las unidades que contiene. Ninguna unidad se puede cargar más de una vez. Eso significa que si más de un paquete necesita acceso a una de las globales, entonces debe estar en uno de los paquetes que los otros tienen en su lista Requiere , o en un paquete separado que todos los demás requieren.

En cuanto a la carga estática frente a la dinámica, si su programa lo necesita absolutamente, hágalo estáticamente vinculado. La carga dinámica es para funciones opcionales, como complementos. (Si desea seguir esa ruta, eche un vistazo a JVPlugin en JVCL. Es un sistema muy útil).

NO entiendo por qué la gente menciona la versión de Delphi para una pregunta simple como esta, la respuesta es sí, es mejor colocar las variables compartidas en una unidad separada antes de la palabra clave de implementación. Cada objeto (formulario, clase, control) se deriva de TObject, incluso si define una clase como

type TMyClass = class
  // no inheritance ?
end;

la clase anterior todavía se deriva de TObject (lea la ayuda de Delphi). Sus variables globales se pueden declarar de tipo TObject o Pointer y, cuando acceda a ellas, use TForm (MyPointerVariable). Método, es decir,

var MyPointerVariable: Pointer; // I presume it is already initialized and is a pointer to a TForm descendant
...
begin
     TForm(MyPointerVariable).Caption := 'Stack Overflow';
end;

Para obtener más información, lea el tutorial de Delphi en mi blog, debería ser muy sencillo de entender.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top