2009-07-27 10 views
5

Tengo un problema con el mantenimiento en un viejo programa Delphi (D7). Gran parte de la lógica del programa se encuentra en el archivo DPR (no se trata de un programa de ventana), y algunas unidades proporcionan cosas como el acceso a la base de datos. Necesitamos eliminar algunas depuraciones de la unidad DB, pero la funcionalidad de depuración está en el DPR. No podemos quitar fácilmente la funcionalidad de depuración, ya que utiliza cosas que son únicas para el DPR, como su tubería principal. Separarlo sería como tratar de separar los espaguetis y la salsa de albóndigas.Cómo acceder a la función delphi en el alcance DPR

Entonces, ¿cómo llamamos a una función declarada en el ámbito DPR desde una unidad usada subordinada? ¿Cuál es el equivalente del operador :: en C++?

No me digas que vuelva a diseñar la aplicación. Me encantaría, pero no tendremos el tiempo necesario. Además, si rediseñamos este cachorro, no estaría en Delphi.

Respuesta

14

Puede declarar una variable de método en la unidad que coincida con la firma de la función en el DPR. Al comienzo del programa, establece la variable de método para la función. Dentro de la unidad llamas a la variable de método.

Ejemplo:

(DPR)

uses 
    Unit1; 

function DoSomething(Par: Integer): Integer; 
begin 
... 
end; 

... 
begin 
    DoSomethingVar := DoSomething; 
    ... 
end; 

(unidad)

unit Unit1; 

interface 
... 
var 
    DoSomethingVar: function(Par1: Integer): Integer; 
... 
implementation 
... 
    SomeResult := DoSomethingVar(SomeParameter); 
... 
+1

Sinple, elegante y funciona, gracias. Esto nos dará el tiempo para refactorizar el código correctamente. –

+0

klever kludge! :-) – Argalatyr

4

No puede. La jerarquía de la unidad es rígida.

hay dos opciones posibles:

  • tire de las partes pertinentes de la .dpr a una nueva unidad. Tenga en cuenta que los usos móviles de la implementación pueden interrumpir los ciclos de importación. Las cosas de createform * probablemente no sean seguras para moverse, eso probablemente molestaría al gerente de proyecto.
  • o defina algunas funciones de devolución de llamada (función, tipos de método, como functionpointer en C), y mueva el código de la inicialización de la unidad relevante a un procedimiento que llame desde .dpr si es necesario.
3

No sé cómo usar las funciones de .dpr en otras unidades, pero si tiene que cambiar el código simplemente cambie .dpr a la unidad normal y luego use sus funciones/rutinas en .dpr nuevo y en otros unidades.

0

.dpr es el archivo de proyecto pascal más fundmental.

Podemos utilizar cualquier archivo de unidad en el proyecto, por lo tanto, puede usar las funciones/procedimientos en las unidades.

Si es necesario, puede prefijar el nombre de la unidad para acceder a la función/procedimiento .

Si la función/procedimiento pertenece a una clase específica, necesita para crear una instancia para acceder a la función/procedimiento porque es un método.

De todos modos, Delphi usa el objeto pascal como su núcleo, puede acceder al cualquier método/procedimiento/función/propiedades necesario con los conceptos pascuales y los conceptos pascales de objeto.

No importa qué archivo necesite llamarlo, y el único excepto es el archivo de decantación de alguna biblioteca externa.

Cuestiones relacionadas