En primer lugar gracias a todos por vuestra ayuda.
Finalmente me en decidido por el sistema de Armando, y he aprovechado para hacer algunas modificaciones que espero que a alguien mas le resulten utiles.
1) En nuestro procedimiento main()
FUNCTION Main()
oApp:TAplicacion()
*
*
RETURN nil
2) Creamos la clase
// Clase para guarda los dialogos abiertos y asi evitar que se dupliquen
CLASS TAplicacion
// Nº Procedimientos abiertos (En este caso maximo 10)
DATA aProc INIT {nil,nil,nil,nil,nil,nil,nil,nil,nil,nil}
ENDCLASS
3) Creamos una funcion que comprueba los procedimientos
// Comprobacion de procedimientos abiertos (nNombre -> Nombre del procedimiento a comprobar, nMaximo -> Nº de veces que puede estar abierto a la vez)
FUNCTION FAplicacion(nNombre,nMaximo)
Local i
Local nProc:=0 // Numero de procedimientos abiertos
Local nVeces:=0 // Numero de veces que esta abierto el mismo procedimiento
// Comprueba si existe procedimiento
FOR i=1 TO LEN(oApp:aProc)
IF oApp:aProc[i] == nNombre
nVeces++
ENDIF
nProc:=nProc+IIF(oApp:aProc[i]==nil,0,1)
NEXT i
IF nVeces>=nMaximo
MsgAlert("Este procedimiento ya está abierto "+STR(nVeces,2)+" veces","Aviso")
RETURN 0
ENDIF
// En caso de que no exista o no sobrepase el maximo de veces, comprueba nº maximo de procedimientos abiertos
IF nProc>=LEN(oApp:aProc)
MsgAlert("Máximo nº de procedimientos abiertos "+STR(LEN(oApp:aProc),2)+", no puede abrir más."+CRLF+"Cierre alguno que no esté utilizando.","Aviso")
RETURN 0
ENDIF
// Guardamos nuevo procedimiento
FOR i=1 TO LEN(oApp:aProc)
IF oApp:aProc[i]==nil
oApp:aProc[i]:=nNombre
EXIT
ENDIF
NEXT i
RETURN i // Devolvemos el numero de posicion de nuestro procedimiento en el array aProc[]
4) Desde cada uno de nuestros programas llamamos a la funcion FAplicacion()
FUNCTION MiPrograma()
Local nProc
// Comprobamos si el procedimiento esta abierto
nProc:=FAplicacion(ProcName(),2) // Guardamos el nº de posicion de la tabla de procedimientos aProc[]
IF nProc==0
RETURN cCod
ENDIF
DEFINE DIALOG oDlg RESOURCE ...
*
*
ACTIVATE DIALOG oDlg CENTER ;
VALID (oApp:aProc[nProc]:=nil,.t.) // Nos aseguramos de dejar el procedimiento vacio
Un saludo a todos y gracias por vuestra ayuda