Resolución de Pantalla

Resolución de Pantalla

Postby Manuel Valdenebro » Tue Feb 26, 2008 7:33 am

Con el fin de adaptar las aplicaciones a las diferentes resoluciones de pantallas (diálogos y controles), la solución mas eficaz que he encontrado (descartada el cambio de resolución en Windows) ha sido la siguiente:

Al principio del programa, creo las variables nResoAncho y nResoAlto

nResoAncho := GetSysMetrics(0)/800
nResoAlto := GetSysMetrics(1)/600

Aplicando estas dos variables a los diálogos, get, say, button, etc, el resultado es óptimo.

Por ejemplo:

DEFINE DIALOG oDlg FROM (1 * nResoAlto), (2.5 * nResoAncho) TO ;
(30.5 * nResoAlto), (73 * nResoAncho) ....

@ 5, (10*nResoAncho) SAY "Nombre" OF oDlg PIXEL

......................

El único problema que he encontrado es que no puedo usar recursos y por tanto, las aplicaciones ya realizadas es tedioso cambiar ahora los diálogos de recursos a código.

Mi pregunta es la siguiente:

1) ¿Alguna idea para incorporar a recursos estas variables?

2) En caso contrario, ¿podría incorporar (copiar y pegar) los códigos del RC dentro del módulo del programa?
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby Antonio Linares » Tue Feb 26, 2008 7:45 am

Manuel,

> 1) ¿Alguna idea para incorporar a recursos estas variables?

Los recursos sólo admiten valores constantes :-(

>
2) En caso contrario, ¿podría incorporar (copiar y pegar) los códigos del RC dentro del módulo del programa?
>

Podrias construir facilmente una utilidad que pasase el contenido de los ficheros RC a código PRG. Nosotros recientemente hemos publicado en estos foros un prototipo de un editor de recursos realizado en FiveWin que analiza el contenido de un fichero RC. Podrías usar su código como punto de partida.

Otra solución es implementar una función que realice esos ajustes de forma automática y que la llames desde la inicialización de la caja de diálogo. De modo similar a como FiveWin usa la claúsula RESIZE16.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Resolución de Pantalla

Postby FiveWiDi » Tue Feb 26, 2008 1:23 pm

Manuel,

Haz un copiar pegar del código de la siguiente función, la compilas y la aplicas a una ventana. Juega con ella. Hay mucho comentario, elimínalo para facilitar la lectura.

En ese foro si buscas encontrarás incluso la manera de cambiar el tamaño de oFont usado (yo no lo necesité).

/* **************************************** */
#Include "FiveWin.ch"

/*
Los parámetros recibidos son:

lAutoresize: permite prescindir de la funcionalidad de esta función; permitiendo
de esta manera que la aplicación pueda tener un flag que
permita/deniegue el autoredimensionado de las pantallas. 03/03/2006.
nWhatSize: permite forzar el redimensionamiento a unos valores concretos;
permitiendo de esta manera que la aplicación pueda tener un valor
al cual redimensionar las pantallas. 03/03/2006.
oWnd: Objeto/ventana/diálogo/control a ser redimensionado.
nResolution: Número que identifica que resolución tenía la pantalla en la cual
se diseñó el objeto.
Este valor puede ser negativo, hecho que se interpretará como que
la ventana ya ha estado redimensionada previamente y se pretende
redimensionarla a su valor original. Esta característica es útil
para provocar que un control (o ventana/dialogo) concreto se le
devuelva su tamaño original según su valor de diseño. 03/03/2006
lRepaint: Indicador de si debe repintarse el objeto una vez redimensionado.

Esta función permitirá que una aplicación desarrolada en un PC con una resolución
de pantalla de por ejemplo 1024 x 768 (nResolution valdría en este caso 3), se vea
redimensionada proporcionalmente en un PC con una resolución diferente, ya sea mayor
o menor.

A falta de perfeccionar el código, se comprueba solamente la variación de la anchura
de la resolución de la pantalla para aplicar la variación del tamaño, aunque cuando
ello se realiza se hace tanto en la anchura como en la altura.
Ahora se comprueba la altura. 09/12/2005.

Esta función está orientada a ser utilizada en el evento ON INIT del ACTIVATE
de las WINDOW y DIALOG con un valor fijo de lRepaint a .T. o sin él.
Además también puede utilizarse directamente sobre un control definido posteriormente
a la ACTIVACIÓN de su contenedor ya sea éste WINDOW o DIALOG, con la salvedad que
lRepaint debe valer .T. para forzar su repintado.

Ejemplos de uso:

-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
Se redimensiona toda la ventana oWnd y sus controles.

ACTIVATE oWnd ON INIT AutoResiz( .T., 0, oWnd, 3 )

-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
Se redimensiona todo el dialogo oDlg y sus controles. Además se fuerza que el control
oMyMulGet se redimensione como si la resolución de pantalla fuera del tipo 2.

ACTIVATE oDlg ON INIT AutoResiz( .T., 0, oWnd, 3 )

AutResiz( .T., 2, oMyMulGet, 0)


-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
Se redimensiona el control oTabs.
@ 185.50,8.00 TABS oTabs OF oWnd ITEMS "Tab1","Tab2","Venga a ordenarrrrr!!" ;
PIXEL COLORS CLR_BLUE,CLR_HCYAN SIZE 288.00,9.00 MESSAGE "Mensaje del Tabs"

AutoResiz( .T., 0, oTabs, 3, .T. )

-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
*/

FUNCTION AutResiz( lAutoresize, nWhatSize, oWnd, nResolution, lRepaint )

// Resolución de la pantalla en el momento de definir los controles.
Local nOriWidth, nOriHeight

// Lo normal sería que fuera la resolución actual de la pantalla (nWhatSize=0).
// Se permite forzar esta resolución mediante el valor de nWhatSize=1,2,3,4,5,6,7,....
Local nWidth, nHeight

// Son la relación entre la resolución de pantalla y la resolución de diseño.
Local nFactorWitdh, nFactorHeight

Local nContador

DEFAULT lRepaint := .T.

nOriWidth := 0
nOriHeight := 0
nWidth := 0
nHeight := 0
nContador := 0

If ABS(nResolution) = 1
nOriWidth := 640
nOriHeight := 480
ElseIf ABS(nResolution) = 2
nOriWidth := 800
nOriHeight := 600
ElseIf ABS(nResolution) = 3
nOriWidth := 1024
nOriHeight := 768
ElseIf ABS(nResolution) = 4
nOriWidth := 1152
nOriHeight := 864
ElseIf ABS(nResolution) = 5
nOriWidth := 1280
nOriHeight := 800
ElseIf ABS(nResolution) = 6
nOriWidth := 1280
nOriHeight := 1024
ElseIf ABS(nResolution) = 7
nOriWidth := 1600
nOriHeight := 1200
ElseIf ABS(nResolution) = 8
nOriWidth := 768
nOriHeight := 1024
Else
ScrResolution( @nOriWidth, @nOriHeight )
Endif

//If nWhatSize = 0
// ScrResolution( @nWidth, @nHeight )
//ElseIf nWhatSize = 1

If nWhatSize = 1
nWidth := 640
nHeight := 480
ElseIf nWhatSize = 2
nWidth := 800
nHeight := 600
ElseIf nWhatSize = 3
nWidth := 1024
nHeight := 768
ElseIf nWhatSize = 4
nWidth := 1152
nHeight := 864
ElseIf nWhatSize = 5
nWidth := 1280
nHeight := 800
ElseIf nWhatSize = 6
nWidth := 1280
nHeight := 1024
ElseIf nWhatSize = 7
nWidth := 1600
nHeight := 1200
ElseIf nWhatSize = 8
nWidth := 768
nHeight := 1024
Else

ScrResolution( @nWidth, @nHeight )

/*
If oWnd:ClassName() = "TMDICHILD"
nWidth := oWnd:oWnd:nRight - oWnd:oWnd:nLeft - 10
nHeight := oWnd:oWnd:nBottom - oWnd:oWnd:nTop - 0
ElseIf oWnd:oWnd:ClassName() = "TMDICHILD"
nWidth := oWnd:oWnd:oWnd:nRight - oWnd:oWnd:oWnd:nLeft - 10
nHeight := oWnd:oWnd:oWnd:nBottom - oWnd:oWnd:oWnd:nTop - 0
Else
ScrResolution( @nWidth, @nHeight )
EndIf

//ScrResolution( @nWidth, @nHeight )
*/

Endif


//ScrResolution( @nWidth, @nHeight )

/*
Traza( 1, "nOriWidth=", nOriWidth )
Traza( 1, "nOriHeight=", nOriHeight )

Traza( 1, "nWidth=", nWidth )
Traza( 1, "nHeight=", nHeight )
*/

//Traza( 1, "oWnd:ClassName()=", oWnd:ClassName() )

//If nOriWidth != nWidth // .or.
If lAutoresize .and. nOriHeight != nHeight

/* Este será el caso habitual, en el cual se pretende redimensionar
los controles a la resolución de la pantalla en la cual se estan
viendo. 01/03/2006 */
If nResolution > 0

nFactorWitdh := nWidth / nOriWidth
nFactorHeight := nHeight / nOriHeight

/* Este será el caso en el cual se pretende deshacer el redimensionamiento
de los controles realizado previamente. */
ElseIf nResolution < 0

nFactorWitdh := nOriWidth / nWidth
nFactorHeight := nOriHeight / nHeight

EndIf

//oWnd:CoorsUpdate()

If lRepaint
oWnd:Hide()
EndIf

//If nFactorWitdh > 1 // .or.
If nFactorHeight > 1

//Traza( 1, "Aumentando tamaño." )

If oWnd:ClassName() == "kalimeroquetequiero"

ElseIf oWnd:ClassName() $ "/TJ02LISMN/TLISTBOX/"
/* Traza( 1, "oWnd:nTop=", oWnd:nTop )
Traza( 1, "oWnd:nLeft=", oWnd:nLeft )
Traza( 1, "oWnd:nWidth=", oWnd:nWidth )
Traza( 1, "oWnd:nHeight=", oWnd:nHeight )
*/
oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight , ;
.F. )
Else

oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight * nFactorHeight , ;
.F. )
EndIf
EndIf

If oWnd:ClassName() == "TFOLDER"
// Traza( 1, "ValType(oWnd:aDialogs)=", ValType(oWnd:aDialogs) )
If ValType( oWnd:aDialogs ) = "A"
For nContador := 1 To Len( oWnd:aDialogs )
AutResiz( lAutoresize, nWhatSize, oWnd:aDialogs[nContador], nResolution, .F. )
EndFor
EndIf
Else
// Traza( 1, "ValType(oWnd:aControls)=", ValType(oWnd:aControls) )
If ValType( oWnd:aControls ) = "A"
For nContador := 1 To Len( oWnd:aControls )
AutResiz( lAutoresize, nWhatSize, oWnd:aControls[nContador], nResolution, .F. )
EndFor
EndIf
EndIf

//If nFactorWitdh < 1 // .or.
If nFactorHeight < 1

//Traza( 1, "Disminuyendo tamaño." )

If oWnd:ClassName() == "kalimeroquetequiero"

ElseIf oWnd:ClassName() $ "/TJ02LISMN/TLISTBOX/"

/* Traza( 1, "oWnd:nTop=", oWnd:nTop )
Traza( 1, "oWnd:nLeft=", oWnd:nLeft )
Traza( 1, "oWnd:nWidth=", oWnd:nWidth )
Traza( 1, "oWnd:nHeight=", oWnd:nHeight )
*/

//Traza( 1, "oWnd:nRight=", oWnd:nRight )
//Traza( 1, "oWnd:nBottom=", oWnd:nBottom )

oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight , ;
.F. )
//oWnd:SetSize( oWnd:nWidth * nFactorWitdh, oWnd:nHeight * nFactorHeight, .T. )
/* Traza( 1, "oWnd:nTop=", oWnd:nTop )
Traza( 1, "oWnd:nLeft=", oWnd:nLeft )
Traza( 1, "oWnd:nWidth=", oWnd:nWidth )
Traza( 1, "oWnd:nHeight=", oWnd:nHeight )
*/

Else

oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight * nFactorHeight , ;
.F. )
EndIf
EndIf

If lRepaint
oWnd:Show()
EndIf

EndIf

Return Nil
/* **************************************** */
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Re: Resolución de Pantalla

Postby Manuel Valdenebro » Wed Feb 27, 2008 6:37 am

FiveWiDi wrote: lAutoresize: permite prescindir de la funcionalidad de esta función;


Carlos,

La función Autoresize, fué la primera opción que probé, y aunque resulta practica para adaptar el tamaño de la ventana-dialogo, es complicado para cambiar Say, Get y el resto de los controles. Para mi, la solución que estoy aplicando ahora resulta muy fácil y práctica. El único problema que tengo es aplicarla a los recursos.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Resolución de Pantalla

Postby FiveWiDi » Wed Feb 27, 2008 7:52 am

Manuel Valdenebro wrote:
FiveWiDi wrote: lAutoresize: permite prescindir de la funcionalidad de esta función;


Carlos,

La función Autoresize, fué la primera opción que probé, y aunque resulta practica para adaptar el tamaño de la ventana-dialogo, es complicado para cambiar Say, Get y el resto de los controles. Para mi, la solución que estoy aplicando ahora resulta muy fácil y práctica. El único problema que tengo es aplicarla a los recursos.


Cómo usabas Autoresize? Porqué es complicado aplicarlo a Say y Get?

Saludos
Carlos G.
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Re: Resolución de Pantalla

Postby Manuel Valdenebro » Wed Feb 27, 2008 10:12 am

FiveWiDi wrote:Cómo usabas Autoresize? Porqué es complicado aplicarlo a Say y Get?


La usé en varios diálogos añadiendo autresize() a la clausula ON INIT

Resimensionaba el diálogo, pero no lo centraba en la pantalla.

Si puedes, publica un ejemplo de modificación de un diálogo, donde existan say, get, checkbock, buttonbmp, etc para ver como tu lo aplicas, tanto con codigo como desde recursos.
No es necesario pongas la funcion AUTRESIZE() que ya la tengo.



Muchas gracias
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Resolución de Pantalla

Postby FiveWiDi » Wed Feb 27, 2008 12:04 pm

Manuel Valdenebro wrote:
FiveWiDi wrote:Cómo usabas Autoresize? Porqué es complicado aplicarlo a Say y Get?


La usé en varios diálogos añadiendo autresize() a la clausula ON INIT

Resimensionaba el diálogo, pero no lo centraba en la pantalla.

Si puedes, publica un ejemplo de modificación de un diálogo, donde existan say, get, checkbock, buttonbmp, etc para ver como tu lo aplicas, tanto con codigo como desde recursos.
No es necesario pongas la funcion AUTRESIZE() que ya la tengo.
Muchas gracias


Manuel,

Busca:
If lRepaint
oWnd:Show()
EndIf
y sustitúyelo por:
If lRepaint
If( ( "DIALOG" $ oWnd:Classname() ) .and. oWnd:lCentered, WndCenter( oWnd:hWnd ) , Nil )
oWnd:Show()
EndIf

creo que ahora debería centrar los DIALOG (el nativo de FiveWin TDIALOG, y los propios tipo MYTDIALOG, ...)

Por otro lado, si se aplica en la clàusula INIT del ACTIVATE, debería redimensionar los controles.

Saludos
Carlos G.
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Re: Resolución de Pantalla

Postby Manuel Valdenebro » Thu Feb 28, 2008 11:17 am

FiveWiDi wrote:creo que ahora debería centrar los DIALOG (el nativo de FiveWin TDIALOG, y los propios tipo MYTDIALOG, ...)Por otro lado, si se aplica en la clàusula INIT del ACTIVATE, debería redimensionar los controles.


Carlos,
Realizada la modificación, ahora si vuelve a centrar el diálogo. Pero los controles del dialogo, aunque los modifica, no los realiza correctamente. El listbox no respeta la anchura de los campos que se muestran y los botones, aunque los modifica, no quedan proporcionales a como estaban antes.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Resolución de Pantalla

Postby FiveWiDi » Thu Feb 28, 2008 12:49 pm

Manuel Valdenebro wrote:
FiveWiDi wrote:creo que ahora debería centrar los DIALOG (el nativo de FiveWin TDIALOG, y los propios tipo MYTDIALOG, ...)Por otro lado, si se aplica en la clàusula INIT del ACTIVATE, debería redimensionar los controles.


Carlos,
Realizada la modificación, ahora si vuelve a centrar el diálogo. Pero los controles del dialogo, aunque los modifica, no los realiza correctamente. El listbox no respeta la anchura de los campos que se muestran y los botones, aunque los modifica, no quedan proporcionales a como estaban antes.


Busca en el código de la función el literal "TFOLDER", y donde aparezca sustituye los condicionales por los siguientes:

If oWnd:ClassName() == "TFOLDER"
If ValType( oWnd:aDialogs ) = "A"
For nContador := 1 To Len( oWnd:aDialogs )
AutResiz( lAutoresize, nWhatSize, oWnd:aDialogs[nContador], nResolution, .F. )
EndFor
EndIf
ElseIF oWnd:Classname() == "TWBROWSE"
AEval( oWnd:aColSizes, { | eCol | eCol = (eCol * nFactorWitdh) } )
Else
If ValType( oWnd:aControls ) = "A"
For nContador := 1 To Len( oWnd:aControls )
AutResiz( lAutoresize, nWhatSize, oWnd:aControls[nContador], nResolution, .F. )
EndFor
EndIf
EndIf

Este nuevo condicional no lo he probado, creo que debería funcionar al menos para los TWBROSE.

El tema de los BUTTON no lo veo claro. En principio deberían pintarse correctamente, a mi en un entorno MDI así lo hace.
Utilizas variantes de BUTTON?

Saludos
Carlos G.
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Re: Resolución de Pantalla

Postby Manuel Valdenebro » Thu Feb 28, 2008 7:51 pm

FiveWiDi wrote: ElseIF oWnd:Classname() == "TWBROWSE"
AEval( oWnd:aColSizes, { | eCol | eCol = (eCol * nFactorWitdh) } )
Este nuevo condicional no lo he probado, creo que debería funcionar al menos para los TWBROSE.


Carlos,

En primer lugar, muchas gracias por tu ayuda.

Al final, ha funcionado la redimensión de los campos del wBrowse, con lo siguiente:

// redimension automatica campos wBrowse
ElseIF oWnd:Classname() == "TWBROWSE"
FOR nSize=1 TO LEN (oWnd:aColSizes)
oWnd:AcolSizes[nSize] *= nFactorWitdh
NEXT

Aunque estoy trabajando con un sistema híbrido (el tuyo y el mio) y en este caso, como en el REDEFINE del BROWSE aparecen los SIZE, es facil multiplicar cada uno por nAncho. Por otro lado, para centrar los Headers, tambien lo hago de esta forma.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Resolución de Pantalla

Postby FiveWiDi » Thu Feb 28, 2008 10:04 pm

Manuel Valdenebro wrote:Carlos,

En primer lugar, muchas gracias por tu ayuda.

Al final, ha funcionado la redimensión de los campos del wBrowse, con lo siguiente:

// redimension automatica campos wBrowse
ElseIF oWnd:Classname() == "TWBROWSE"
FOR nSize=1 TO LEN (oWnd:aColSizes)
oWnd:AcolSizes[nSize] *= nFactorWitdh
NEXT

Aunque estoy trabajando con un sistema híbrido (el tuyo y el mio) y en este caso, como en el REDEFINE del BROWSE aparecen los SIZE, es facil multiplicar cada uno por nAncho. Por otro lado, para centrar los Headers, tambien lo hago de esta forma.


No hay de que; de paso estoy aplicando estas mejoras en mi sistema.

Saludos
Carlos G.
FiveWiDi
 
Posts: 1060
Joined: Mon Oct 10, 2005 2:38 pm

Postby Kleyber » Thu Feb 28, 2008 10:12 pm

Carlos, Manuel,

Una pregunta: ¿Esto funcionaria con dialogs hechas desde recursos?

Saludos,
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
Kleyber
 
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil

Postby Manuel Valdenebro » Thu Feb 28, 2008 10:35 pm

Kleyber wrote:Carlos, Manuel,

Una pregunta: ¿Esto funcionaria con dialogs hechas desde recursos?

Saludos,


Kleiber,

Funciona en dialogos desde recursos. Desde código, en mi opinión, es mas fácil la solución que yo propongo al principio.
Last edited by Manuel Valdenebro on Fri Feb 29, 2008 6:13 am, edited 1 time in total.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby Kleyber » Thu Feb 28, 2008 11:00 pm

Gracias, Manuel. Lo voy a probar, entonces.

saludos,
Kleyber Derick

FWH / xHb / xDevStudio / SQLLIB
User avatar
Kleyber
 
Posts: 581
Joined: Tue Oct 11, 2005 11:28 am
Location: São Luiz, Brasil

Resolución de pantalla.

Postby alfonso » Fri Feb 29, 2008 1:25 pm

Hola,

Comentaros mi experiencia al respecto de resolucion de pantalla, yo tuve ese mismo problema tiempo atràs y en el foro me aconsejaron que utilizara la funcion Autoresiz(), como utilizaba recursos tuve que realizar una serie de ajustes en la funcion como los que os han sido indicados en el foro. En el tema de recursos, el problema se centraba en los textos fijos y la solucion pasa por definirlos en el RC con un identificador (distinto de -1), por ejemplo 101, etc.), de forma que en el programa se haga lo suiguiente:

redefine say prompt ' ... ...' of odlg id 101

De esta manera, cuando se cambia la resolucion estos textos tambien se dimensionan.

Ojo, importante es no definir fonts en el RC (ya que todavia no he conseguido que se dimensionen cuando estàn definidos).

Suerte.
alfonso
 
Posts: 46
Joined: Fri Mar 09, 2007 1:31 pm
Location: España

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 73 guests