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!!!!!