Fecha actual Mar Jul 01, 2025 6:03 pm

Todos los horarios son UTC + 1 hora [ DST ]




Nuevo tema Responder al tema  [ 3 mensajes ] 
Autor Mensaje
NotaPublicado: Sab Dic 23, 2006 1:12 am 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Hola a todos, una de las características del proyecto que estoy desarrollando ahora es que requiere la generación de formularios aleatoriamente. Intento conseguir el valor de la propiedad "Cargo" desde una función llamada por el evento OnTimer del control autogenerado en el nuevo formulario. El código que he desarrollado genera los objetos, pero no funciona cuando intento obtener el valor de la propiedad. También he probado sustituír tipos y pasar otras variables pero, aunque no genera error, no muestra nada. Se trata de obtener el valor de "Cargo" sin tener que generar una variable pública (o una matriz) para que todo se autodestruya al cerrar el formulario autogenerado.

El código es genérico, pero podréis comprender cómo funciona. ¿Alguna sugerencia?

*****************************************************

Function MShow(aData)
*
* aData[]:
* 01> Identificador.
* 02> Texto 1.
* 03> Posición 1.
* 04> Posición 2.
* 05> Texto 2.
* 06> Sonido.
*

Private cIdForm := AllTrim(Str(aData[1]))
Private nLenGet := (At(Chr(46), cIdForm) - 1)
Private nLenId := IIf((nLenGet < 2), Len(cIdForm), nLenGet)
Private cWindow := AllTrim(Chr(70) + Left(cIdForm, nLenId))
Private cMessager := AllTrim(Chr(77) + Left(cIdForm, nLenId))
Private cTimer := AllTrim(Chr(84) + Left(cIdForm, nLenId))
Private cTemp := AllTrim(aData[6])

Private &cWindow := TForm():Create()
Private &cMessager := TMemo():Create(&cWindow)
Private &cTimer := TTimer():Create(&cWindow)

&cWindow:Enabled := .F.
&cWindow:Visible := .F.
&cWindow:BorderStyle := bsSingle
&cWindow:BorderIcons:Minimize := .T.
&cWindow:BorderIcons:Maximize := .T.
&cWindow:Position := poDefault
&cWindow:Caption := (Chr(91) + Chr(32) + AllTrim(aData[5]) + Chr(32) + Chr(93))
&cWindow:FormStyle := fsNormal
&cWindow:Height := 110
&cWindow:Width := 300
&cWindow:ModalResult := mrNone
&cWindow:Themed := .F.
&cWindow:ShowInTaskBar := .F.
&cWindow:WindowState := wsNormal
&cWindow:Cargo := {cWindow, cTemp}

&cMessager:Enabled := .F.
&cMessager:Align := alClient
&cMessager:Alignment := taLeftJustify
&cMessager:BorderStyle := bsSingle
&cMessager:Hint := "Texto de la Alarma"
&cMessager:Font:Name := "MS Sans Seriff"
&cMessager:Font:Size := 14
&cMessager:Font:Color := clBlack
&cMessager:ReadOnly := .T.
&cMessager:RightMargin := 0
&cMessager:ScrollBars := ssNone
&cMessager:Themed := .F.
&cMessager:Visible := .T.
&cMessager:Lines := {aData[2]}

&cTimer:Enabled := .F.
&cTimer:Interval := 15000
&cTimer:OnTimer := { | oSender, &cWindow:Cargo[1], &cWindow:Cargo[2] | GenTimer(oSender, &cWindow:Cargo[1], &cWindow:Cargo[2]) }

&cWindow:Enabled := .T.
&cMessager:Enabled := .T.
&cTimer:Enabled := .T.
&cWindow:Show()
Return (Nil)

Function GenTimer(oSender, cFormName, sSound)
Private oSetWindow := cFormName

If (Len(RTrim(oSetWindow)) > 0)
If (lSoundAlarm <> .F.) .And. (&oSetWindow:WindowState <> wsMinimized)
sSound := IIf((Empty(sSound) <> .T.), sSound, sAlarmSound)
PlayTone(sSound)
EndIf
EndIf

Return (Nil)

*****************************************************

Gracias de antemano y ... ¡ FELIZ NAVIDAD !


Arriba
 Perfil  
Responder citando  
NotaPublicado: Sab Dic 23, 2006 11:43 am 
Avatar de Usuario

Registrado: Dom Oct 09, 2005 11:26 am
Mensajes: 362
Ubicación: Salamanca - España
eb4bgr escribió:
Hola a todos, una de las características del proyecto que estoy desarrollando ahora es que requiere la generación de formularios aleatoriamente. Intento conseguir el valor de la propiedad "Cargo" desde una función llamada por el evento OnTimer del control autogenerado en el nuevo formulario. El código que he desarrollado genera los objetos, pero no funciona cuando intento obtener el valor de la propiedad. También he probado sustituír tipos y pasar otras variables pero, aunque no genera error, no muestra nada. Se trata de obtener el valor de "Cargo" sin tener que generar una variable pública (o una matriz) para que todo se autodestruya al cerrar el formulario autogenerado.

El código es genérico, pero podréis comprender cómo funciona. ¿Alguna sugerencia?

*****************************************************

Function MShow(aData)
*
* aData[]:
* 01> Identificador.
* 02> Texto 1.
* 03> Posición 1.
* 04> Posición 2.
* 05> Texto 2.
* 06> Sonido.
*

Private cIdForm := AllTrim(Str(aData[1]))
Private nLenGet := (At(Chr(46), cIdForm) - 1)
Private nLenId := IIf((nLenGet < 2), Len(cIdForm), nLenGet)
Private cWindow := AllTrim(Chr(70) + Left(cIdForm, nLenId))
Private cMessager := AllTrim(Chr(77) + Left(cIdForm, nLenId))
Private cTimer := AllTrim(Chr(84) + Left(cIdForm, nLenId))
Private cTemp := AllTrim(aData[6])

Private &cWindow := TForm():Create()
Private &cMessager := TMemo():Create(&cWindow)
Private &cTimer := TTimer():Create(&cWindow)

&cWindow:Enabled := .F.
&cWindow:Visible := .F.
&cWindow:BorderStyle := bsSingle
&cWindow:BorderIcons:Minimize := .T.
&cWindow:BorderIcons:Maximize := .T.
&cWindow:Position := poDefault
&cWindow:Caption := (Chr(91) + Chr(32) + AllTrim(aData[5]) + Chr(32) + Chr(93))
&cWindow:FormStyle := fsNormal
&cWindow:Height := 110
&cWindow:Width := 300
&cWindow:ModalResult := mrNone
&cWindow:Themed := .F.
&cWindow:ShowInTaskBar := .F.
&cWindow:WindowState := wsNormal
&cWindow:Cargo := {cWindow, cTemp}

&cMessager:Enabled := .F.
&cMessager:Align := alClient
&cMessager:Alignment := taLeftJustify
&cMessager:BorderStyle := bsSingle
&cMessager:Hint := "Texto de la Alarma"
&cMessager:Font:Name := "MS Sans Seriff"
&cMessager:Font:Size := 14
&cMessager:Font:Color := clBlack
&cMessager:ReadOnly := .T.
&cMessager:RightMargin := 0
&cMessager:ScrollBars := ssNone
&cMessager:Themed := .F.
&cMessager:Visible := .T.
&cMessager:Lines := {aData[2]}

&cTimer:Enabled := .F.
&cTimer:Interval := 15000
&cTimer:OnTimer := { | oSender, &cWindow:Cargo[1], &cWindow:Cargo[2] | GenTimer(oSender, &cWindow:Cargo[1], &cWindow:Cargo[2]) }

&cWindow:Enabled := .T.
&cMessager:Enabled := .T.
&cTimer:Enabled := .T.
&cWindow:Show()
Return (Nil)

Function GenTimer(oSender, cFormName, sSound)
Private oSetWindow := cFormName

If (Len(RTrim(oSetWindow)) > 0)
If (lSoundAlarm <> .F.) .And. (&oSetWindow:WindowState <> wsMinimized)
sSound := IIf((Empty(sSound) <> .T.), sSound, sAlarmSound)
PlayTone(sSound)
EndIf
EndIf

Return (Nil)

*****************************************************

Gracias de antemano y ... ¡ FELIZ NAVIDAD !


Hola, EB....

Mira no acabo de entender muy bien lo que pretendes..., pero al ver tu codigo lo que ''me hace daño a la vista'' son la cantidad de macro-sustituciones que utilizas, yo en principio las eliminaria, recuerdo los tiempos de Clipper en los que se aconsejaba la utilización mínima de esta caracteristica por variados motivos....
Yo no he necesitado CASI NUNCA su uso, por lo que te repito que tratases de eliminarlas.....

FELICIDADES PARA TODOS!!!!!

_________________
Un saludo.
Jesús P. Melgar Velasco


Arriba
 Perfil  
Responder citando  
 Asunto: Macros
NotaPublicado: Sab Dic 23, 2006 1:40 pm 

Registrado: Dom Feb 12, 2006 3:28 pm
Mensajes: 54
Hola Jesús, acabas de descubrir por qué elegí este lenguaje a pesar de usar otros compiladores con mayor rendimiento. Yo no puedo vivir sin las macros de xBase, las adoro. Las he usado siembre, desde que empezé a programar este entorno con dBase III Plus, Summer '87, ... A mí nunca me han fallado. Espero no seguir causándote dolor en la vista, :-)))

Lo que pretendo es lo siguiente...

1) Crear un formulario nuevo pasándole un array como valor de la propiedad "Cargo" sin crear una variable pública que contenga el nombre del formulario o la instancia. Esto funciona perfectamente con el ejemplo que he enviado.

2) Que el formulario creado ejecute un evento "OnTimer" genérico, definido en el código del programa, para reproducir un sonido que se obtiene de uno de los valores de la matriz que está almacenada en la propiedad "Cargo" del formulario nuevo. Esto quiere decir que la función "OnTimer" genérica tiene que identificar el formulario que le envía el sonido y obtener de él los valores de la matriz almacenada en la propiedad "Cargo".

De esta forma, cuando cierras el formulario se borra todo, y no queda ninguna variable pública en memoria que se vaya acumulando con cada nuevo formulario creado.

¡¡¡ FELIZ NAVIDAD !!!


Arriba
 Perfil  
Responder citando  
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 3 mensajes ] 

Todos los horarios son UTC + 1 hora [ DST ]


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a: