FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Una pregunta de recursos
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 11:16 AM

Hola a todos

Una pregunta por si se puede hacer. En los recursos ponemos los nombres que luego salen como textos en nuestros diálogos. Mi pregunta es, ¿se pueden capturar de alguna manera esos nombres en un array?

Ejemplo de recurso

DLGTORRE DIALOG DISCARDABLE 7, -12, 355, 300
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZEBOX|WS_VISIBLE
CAPTION "Mantenimiento de Torres"
FONT 9, "MS Sans Serif"
BEGIN
CONTROL "Torre", 1, "Static", WS_GROUP, 18, 7, 40, 8
CONTROL "Codigo Cliente", 2, "Static", WS_GROUP, 140, 5, 60, 10
CONTROL "Nombre", 3, "Static", WS_GROUP, 18, 24, 40, 8
CONTROL "Ubicación", 4, "Static", WS_GROUP, 18, 42, 40, 8
CONTROL "Población", 5, "Static", WS_GROUP, 18, 58, 40, 8
CONTROL "Provincia", 6, "Static", WS_GROUP, 18, 76, 40, 8
CONTROL "Comunidad", 7, "Static", WS_GROUP, 18, 95, 45, 8
CONTROL "Fecha Alta", 8, "Static", WS_GROUP, 220, 76, 40, 8

Lo que yo quiero capturar es el nombre que está a continuación de CONTROL, y así hacer un array con esos nombres para luego por medio de dos funciones, p.e carga_nombres y
pinta_ nombres, poder ponerlos con el color del fondo del diálogo correspondiente.
El array podría quedar algo así

aArray[1] = "Torre"
aArray[2] = "Codigo Cliente"

etc...

¿Se puede?

Un saludo a todos

Pedro

Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Una pregunta de recursos
Posted: Mon Jun 02, 2008 03:53 PM
Pedro wrote:Hola a todos

Una pregunta por si se puede hacer. En los recursos ponemos los nombres que luego salen como textos en nuestros diálogos. Mi pregunta es, ¿se pueden capturar de alguna manera esos nombres en un array?

Ejemplo de recurso


DLGTORRE DIALOG DISCARDABLE 7, -12, 355, 300
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZEBOX|WS_VISIBLE
CAPTION "Mantenimiento de Torres"
FONT 9, "MS Sans Serif"
BEGIN

CONTROL "Torre", 1, "Static", WS_GROUP, 18, 7, 40, 8
CONTROL "Codigo Cliente", 2, "Static", WS_GROUP, 140, 5, 60, 10
CONTROL "Nombre", 3, "Static", WS_GROUP, 18, 24, 40, 8
CONTROL "Ubicación", 4, "Static", WS_GROUP, 18, 42, 40, 8
CONTROL "Población", 5, "Static", WS_GROUP, 18, 58, 40, 8
CONTROL "Provincia", 6, "Static", WS_GROUP, 18, 76, 40, 8
CONTROL "Comunidad", 7, "Static", WS_GROUP, 18, 95, 45, 8
CONTROL "Fecha Alta", 8, "Static", WS_GROUP, 220, 76, 40, 8


Lo que yo quiero capturar es el nombre que está a continuación de CONTROL, y así hacer un array con esos nombres para luego por medio de dos funciones, p.e carga_nombres y
pinta_ nombres, poder ponerlos con el color del fondo del diálogo correspondiente.
El array podría quedar algo así

aArray[1] = "Torre"
aArray[2] = "Codigo Cliente"

etc...

¿Se puede?

Un saludo a todos

Pedro


Se puede, una ejemplo de eso, es lo se hizo en "RC2Prg.prg" de la carpeta Samples en tu instalación de FWH.
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 04:29 PM
Repasando lo expuesto y tu respuesta, Armando, creo que no me expliqué lo suficiente.
No quiero coger los nombres cuando "estoy programando la aplicación", si no cuando la estoy ejecutando y el fichero rc ya está incrustado en el exe.
De la misma forma que tu llamas al diálogo

DEFINE DIALOG oDlg RESOURCE "DLGDIALOGO" <------ y esta llamada se hace al recurso compilado y enlazado en la aplicación, a mi me gustaría pillar los nombres del control STATIC.

He visto el rc2prg y no sé si se podrá hacer lo mismo, es decir si oDlg:aControls[1] podría ser el nombre que busco
oDlg:aControls[2] podría ser el ID

etc...

A ver si Antonio u otro compañero me lo aclara

Un saludo

Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Posts: 408
Joined: Sun Aug 13, 2006 05:38 AM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 04:43 PM

Prueba con
aArray[ 1 ] := oCtrl1:varGet()
aArray[ 2 ] := oCtrl2:varGet()

o con
aArray[ 1 ] := oCtrl1:cCaption
aArray[ 2 ] := oCtrl2:cCaption

Saludos

Quique
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 05:03 PM
Pedro wrote:Repasando lo expuesto y tu respuesta, Armando, creo que no me expliqué lo suficiente.
No quiero coger los nombres cuando "estoy programando la aplicación", si no cuando la estoy ejecutando y el fichero rc ya está incrustado en el exe.
De la misma forma que tu llamas al diálogo

DEFINE DIALOG oDlg RESOURCE "DLGDIALOGO" <------ y esta llamada se hace al recurso compilado y enlazado en la aplicación, a mi me gustaría pillar los nombres del control STATIC.

He visto el rc2prg y no sé si se podrá hacer lo mismo, es decir si oDlg:aControls[1] podría ser el nombre que busco
oDlg:aControls[2] podría ser el ID

etc...

A ver si Antonio u otro compañero me lo aclara

Un saludo

Pedro


Tienes razón, entendí mal. En el foro hubo una consulta respecto a lo ismo. La respuesta más clara fue que eso se podía hacer siempre y cuando los textos fueran objetos, como un Say o un Get, pero que como Static identificado como -1 (como lo pone el WS) no se podía.

Espero que haya alguien que si haya podido hacerlo desde ese enotnces.... Suerte
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 05:30 PM
Pedro,

Hazlo asi, desde la claúsula ON INIT en el ACTIVATE:
   ACTIVATE DIALOG oDlg ; 
      ON INIT Textos( oDlg )

En la función Textos() a la que llamas, ya tienes el handle de ventana del diálogo, oDlg:hWnd. Y con ese handle puedes recorrer todos sus controles hijos:
#define GW_CHILD      5 
#define GW_HWNDNEXT   2

function Textos( oDlg ) 

   local hCtrl := GetWindow( oDlg:hWnd, GW_CHILD ) 
   local aTextos := {}

   while hCtrl != 0 
      if GetClassName( hCtrl ) == "Static"  // SAY 
         AAdd( aTextos, GetTextWindow( hCtrl ) ) 
      endif 
      hCtrl = GetWindow( hCtrl, GW_HWNDNEXT ) 
   end 

return aTextos
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 05:40 PM
quique wrote:Prueba con
aArray[ 1 ] := oCtrl1:varGet()
aArray[ 2 ] := oCtrl2:varGet()

o con
aArray[ 1 ] := oCtrl1:cCaption
aArray[ 2 ] := oCtrl2:cCaption


Gracias quique, pero eso no funciona, sorry

Un saludo
Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 05:43 PM
Armando Picon wrote:
Pedro wrote:Repasando lo expuesto y tu respuesta, Armando, creo que no me expliqué lo suficiente.
No quiero coger los nombres cuando "estoy programando la aplicación", si no cuando la estoy ejecutando y el fichero rc ya está incrustado en el exe.
De la misma forma que tu llamas al diálogo

DEFINE DIALOG oDlg RESOURCE "DLGDIALOGO" <------ y esta llamada se hace al recurso compilado y enlazado en la aplicación, a mi me gustaría pillar los nombres del control STATIC.

He visto el rc2prg y no sé si se podrá hacer lo mismo, es decir si oDlg:aControls[1] podría ser el nombre que busco
oDlg:aControls[2] podría ser el ID

etc...

A ver si Antonio u otro compañero me lo aclara

Un saludo

Pedro


Tienes razón, entendí mal. En el foro hubo una consulta respecto a lo ismo. La respuesta más clara fue que eso se podía hacer siempre y cuando los textos fueran objetos, como un Say o un Get, pero que como Static identificado como -1 (como lo pone el WS) no se podía.

Espero que haya alguien que si haya podido hacerlo desde ese enotnces.... Suerte


Armando, no sé si te has fijado en el ejemplo, (que es parte de un rc auténtico) pero yo no numero al control STATIC con -1, si no con un ID al igual que los EDIT, solo que los EDIT van del 201 en adelante y los STATIC desde el 1 en adelante. Eso es para poder pintarlos con el REDEFINE SAY oSay...... ID 1 ... etc.

Gracias por tu aporte

Un saludo
Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Una pregunta de recursos
Posted: Mon Jun 02, 2008 05:52 PM
Antonio Linares wrote:Pedro,

Hazlo asi, desde la claúsula ON INIT en el ACTIVATE:
   ACTIVATE DIALOG oDlg ; 
      ON INIT Textos( oDlg )

En la función Textos() a la que llamas, ya tienes el handle de ventana del diálogo, oDlg:hWnd. Y con ese handle puedes recorrer todos sus controles hijos:
#define GW_CHILD      5 
#define GW_HWNDNEXT   2

function Textos( oDlg ) 

   local hCtrl := GetWindow( oDlg:hWnd, GW_CHILD ) 
   local aTextos := {}

   while hCtrl != 0 
      if GetClassName( hCtrl ) == "Static"  // SAY 
         AAdd( aTextos, GetTextWindow( hCtrl ) ) 
      endif 
      hCtrl = GetWindow( hCtrl, GW_HWNDNEXT ) 
   end 

return aTextos


Gracias Antonio, como siempre un buen quite.
Eso es lo que buscaba, pero........jo..siempre hay un pero.
El tema es que ¿los textos se pintan en el ON INIT?

me explico

Yo ahora tengo dos funciones en un dialogo

Funtion uno (coger los nombres de los says)
Local aTextos[XX] <---- xx es la cantidad de says del dialogo

aTextos[1] := "Algo"
aTextos[2] := "Algo"
aTextos[3] := "Algo"
aTextos[4] := "Algo"
aTextos[XX] := "Algo"

Return(aTextos)
Luego
Function PintaSays(oDlg, oFont, aTextos)
Local oSay[Len(aText)]
Local nInd

For nInd := 1 TO Len(aText)
REDEFINE SAY oSay[nInd] PROMPT aText[nInd] ID nInd OF oDlg ;
COLOR RGB(0,0,0),RGB(255,204,102) FONT oFont
Next

Return nil

Pregunta, ¿Se pueden poner las dos funciones en el ON INIT, aunque sea colocando el aTextos como Static del módulo?

ACTIVATE DIALOG oDlg ;
ON INIT Textos( oDlg ), PonSays(oDlg,oFont,aTextos)


o por el contrario se puede hacer

DEFINE DIALOG oDLG RESOURCE "DLGDIALOG"
PonSays(oDlg,oFont,aTextos)
...............
...............
ACTIVATE DIALOG oDlg ;
ON INIT Textos( oDlg )

Gracias

Un saludo

Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Una pregunta de recursos
Posted: Tue Jun 03, 2008 02:54 AM
Pregunta, ¿Se pueden poner las dos funciones en el ON INIT, aunque sea colocando el aTextos como Static del módulo?

ACTIVATE DIALOG oDlg ; 
ON INIT (Textos( oDlg ), PonSays(oDlg,oFont,aTextos) )

Si lo pones entre parentesis creo que funciona...
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Una pregunta de recursos
Posted: Tue Jun 03, 2008 07:28 AM
cmsoft wrote:
Pregunta, ¿Se pueden poner las dos funciones en el ON INIT, aunque sea colocando el aTextos como Static del módulo?

ACTIVATE DIALOG oDlg ; 
ON INIT (Textos( oDlg ), PonSays(oDlg,oFont,aTextos) )

Si lo pones entre parentesis creo que funciona...


Gracias cmsoft, pero tengo un problema y es que al compilar me dice que no existe o no encuentra GetTextWindow, ¿se ha de definir como externa?

Un saludo
Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Una pregunta de recursos
Posted: Tue Jun 03, 2008 08:02 AM

Es GetWindowText() en vez de GetTextWindow()

De todas formas, no creo que te vaya a funcionar asi. Tienes que hacerlo de otra forma. Voy a buscarte un ejemplo :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Una pregunta de recursos
Posted: Tue Jun 03, 2008 08:06 AM

Pedro,

Desde el ON INIT los handles de los controles estan disponibles, por eso hay que hacerlo ahí.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Una pregunta de recursos
Posted: Tue Jun 03, 2008 08:12 AM
Prueba asi:
ACTIVATE DIALOG oDlg ; 
   ON INIT PonSays( oDlg, oFont, Textos( oDlg ) )

Y en PonSays() añade esto:
For nInd := 1 TO Len(aText) 
   REDEFINE SAY oSay[nInd] PROMPT aText[nInd] ID nInd OF oDlg ; 
      COLOR RGB(0,0,0),RGB(255,204,102) FONT oFont 
   oSay[nInd]:Initiate()  // esto!
Next
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 464
Joined: Tue Mar 21, 2006 07:30 PM
Una pregunta de recursos
Posted: Tue Jun 03, 2008 08:21 AM
Antonio Linares wrote:Prueba asi:
ACTIVATE DIALOG oDlg ; 
   ON INIT PonSays( oDlg, oFont, Textos( oDlg ) )

Y en PonSays() añade esto:
For nInd := 1 TO Len(aText) 
   REDEFINE SAY oSay[nInd] PROMPT aText[nInd] ID nInd OF oDlg ; 
      COLOR RGB(0,0,0),RGB(255,204,102) FONT oFont 
   oSay[nInd]:Initiate()  // esto!
Next


Gracias Antonio, lo probaré, si funciona bien ya podemos poner los Says de los dialogos tomándolos directamente desde el recurso con el color del dialogo, y, si se cambia un texto no hay que tocar el prg, si no el recurso.

Un saludo
Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO