HonradosHP
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Ayuda con el comando IfMain

2 participantes

Ir abajo

Ayuda con el comando IfMain Empty Ayuda con el comando IfMain

Mensaje  Esteban R Vie Jul 23, 2010 7:16 pm

Hola amigos, estoy empezando a programar en System
y quiero que me ayuden con esto. Tengo algo así:

:: "Matriz:" 0 29
'DROPFALSE 27 13 30 40 21 { 3 } BINT4 "ayuda" MINUSONE MINUSONE MINUSONE MINUSONE
1 1 'DROPFALSE "TITULO"
FLASHPTR IfMain ;

El menu quedaría

[EDIT][CHOOS][ ][ ][CANCL][ OK ]

Quiero que al presionar [EDIT], abra el editor de matrices,
para crear una nueva o lleve la actual para editarla, además
que compruebe que la matriz sea "real" y que tenga por ejemplo
una dimensión nx2 (n real), de no ser asi que haga:

:: #B914 ("Invalid object type") FlashWarning ;
ó
:: #501 ("Invalid dimensión") FlashWarning ;

dependiendo del error

Al presionar [CHOOS], debe buscar una matriz en el FILER
y actuar del mismo modo en caso de error

Finalmente quiero que la matriz se vea en el IfMain
como un GROB y no como STRING que es como se muestra.

Les agradeceria que expliquen los codigos.

PD: estoy usando ROM 2.09 (hp 50G)
Esteban R
Esteban R
Baby HP
Baby HP

Cantidad de envíos : 17
Localización : Paraguay
Calculadora : HP 50g
ROM : 2.09

Volver arriba Ir abajo

Ayuda con el comando IfMain Empty Re: Ayuda con el comando IfMain

Mensaje  Jose Leonardo Ortiz Vie Jul 23, 2010 7:18 pm

Este es el código usando IfMain en el Debug4x.

*** Forma parte de una biblioteca.
*** Llama a IfMain. Usa 2 variables locales.
*** LAM NCOL es el número de columnas que debe tener el array
*** OBS: Cuando (LAM NCOL=MINUSONE) el nºcolumnas puede ser cualquiera
*** LAM NFIL es el número mínimo de filas que debe tener el array
*** Poner los Message Handler fuera ahorra memoria.

xNAME ABCDE ( -> arregloreal TRUE // FALSE )
:: CK0
*** Guardando estado de SystemFlag 105 en el UserFlag 105
BINT105 DUPDUP SysITE SetUserFlag ClrUserFlag
SetSysFlag ( Poniendo modo aproximado )

BINT2 BINT2
{ LAM NCOL LAM NFIL } BIND

"Matriz:" 0 29

' MSH6y22y25ARRYNCOL
29 13 30 40
BINT1 { BINT3 } BINT5
"ayuda"
MINUSONE
MINUSONE
MINUSONE MINUSONE

ONEONE
' MSHIfMain
"TITULO"
FLASHPTR IfMain

ABND

BINT105 DUP UserITE SetSysFlag ClrSysFlag ( Restaurando System Flag 105 )

;

*** Este es el Message Handler del campo Arreglo real. Se usó:
*** BINT6 ( IfMsgGetFieldGrob ) Ponemos el grob que será mostrado
*** BINT22 ( IfMsgCommandLineValid ) Validación de línea de comandos
*** BINT25 ( IfMsgEdit ) Acción al presionar tecla EDIT

NULLNAME MSH6y22y25ARRYNCOL
:: BINT6 #=casedrop ( IfMsgGetFieldGrob ) ( #field value -> #field TRUEorFALSE )
:: OVER TRUE ROT ( #field #field TRUE value )
DTYPEMATRIX?_ OVER TYPEARRY? OR ITE ( #field #field TRUE value )
ob>grobmini
:: DROPNULL$ $>grob ;
***** Esto es para mejorar la visualización en versiones antiguas.
***** Puedes omitir desde aca

3PICK ( #field #field TRUE grob #field )
TRUE ( #field #field TRUE grob #field TRUE )
FLASHPTR IfGetFieldPos ( #field #field TRUE grob #x #y #w #h )
SWAP MAKEGROB ( #field #field TRUE grob #x #y GROBwxh )
UNROT2DROP ( #field #field TRUE grob GROBwxh )
FLASHPTR GROBADDext ( #field #field TRUE grob' )
***** hasta acá puedes omitir
FLASHPTR IfSetGrob
TRUE
;
BINT22 #=casedrop ( IfMsgCommandLineValid ) ( -> TRUE/FALSE )
:: RCL_CMD palparse NOTcase2drop DROPFALSE
EVAL
DEPTH #1- NDROP ( un objeto o MINUSONE )
FLASHPTR DTYPFMAT? OVER TYPEARRY? ORNOT casedrpfls
TestMatNCOL ( vector/array/mat -> flag )
NOT
DUP IT ErrMesARRAY
;
BINT25 #=casedrop ( IfMsgEdit ) ( value -> ........ )
:: DUP xNOVAL EQUAL ITE
FLASHPTR RunDoNewMatrix ( NOVAL FALSE // NOVAL array2 TRUE )
:: DUP FLASHPTR RunDoOldMatrix ; ( array array2 TRUE // array FALSE )
ITE
SWAPDROPTRUE ( array TRUE )
DROPFALSE ( FALSE )
IT
:: FALSE ( array FALSE )
BEGIN OVER TestMatNCOL ORNOT ( ob flag )
WHILE ( ob T -> ob sigue ) ( ob T -> ob finaliza )
:: ErrMesARRAY FLASHPTR RunDoOldMatrix ( array TRUE // FALSE )
ITE
FALSE ( array FALSE )
TrueTrue ( TRUE TRUE )
;
REPEAT
DUP TestMatNCOL ( ob flag )
ITE
FLASHPTR IfSetCurrentFieldValue
DROP
;
TRUE
;
DROPFALSE
;

*** Test para el arreglo real
*** Si no es arreglo real pone FALSE
*** Si el arreglo real es un vector pone FALSE
*** Si nº de filas es menor a LAM NFIL pone FALSE
*** Si (LAM NCOL<>MINUSONE) y (nºcolumnas<>LAM NCOL) pone FALSE
*** Si pasa las pruebas mencionadas pone TRUE
*** OBS: LAM NCOL es el número de columnas que debe tener el array
*** OBS: Cuando (LAM NCOL=MINUSONE) el nºcolumnas puede ser cualquiera
*** OBS: LAM NFIL es el número mínimo de filas que debe tener el array

NULLNAME TestMatNCOL ( ob -> flag )
::
DUP TYPERARRY? NOTcase DROPFALSE ( F )
DUP FLASHPTR MDIMS ( arrayreal #r #c T // arrayreal # F )
NOTcase 2DROPFALSE ( F )
LAM NCOL #= LAM NCOL MINUSONE #= OR SWAP LAM NFIL #>=_ AND ( arryreal flag )
SWAPDROP ( flag )
;

*** Muestra el mensaje de error relativo al array con Flashwarning

NULLNAME ErrMesARRAY ( -> )
::
"Escribe ARREGLO REAL" ( $ )
LAM NCOL DUP MINUSONE #<> ITE ( $ # )
:: "\0Aen " SWAP #>$ &$ &$ " COLUMNAS" &$ ;
DROP
"\0Anº filas \8A " LAM NFIL #>$ &$ &$ ( $ )
FlashWarning
;

*** Es una alternativa a usar el comando FLASHPTR EQW3GROBmini
*** Sirve para convertir objetos algebraicos, arrays, matrices simbólicas
*** y ALGUNOS otros objetos en grobs

NULLNAME ob>grobmini ( ob -> grob )
:: DEPTH #1- ZEROZEROTWO DOBIND ( LAM1=DEPTH LAM2=ob )
BEGIN ( NECESITA TRUE PARA SALIR )
:: 2GETLAM FLASHPTR EQW3GROBmini ( ext ob #0 // .... # )
DUP#0=ITE
:: DROPSWAPDROP TRUE ;
:: DEPTH 1GETLAM #- NDROPFALSE GARBAGE ;
;
UNTIL
ABND
;

*** Este es el Message Handler del IfMain. Se usó:
*** BINT0 ( IfMsgKeyPress ) Para asignar una acción a una tecla.
*** BINT11 ( IfMsgGetMenu )
*** BINT16 ( IfMsgKeyOK ) Verificar campos al presionar OK o ENTER.

NULLNAME MSHIfMain
:: BINT0 #=casedrop ( IfMsgKeyPress )
:: OVER BINT12 #= OVER #1= AND ( quita STO )
3PICK BINT19 #= 3PICK #2= 4PICK #3= OR AND OR ( quita MTRW EQW )
3PICK BINT21 #= 3PICK DUP#1= SWAP BINT4 #= OR AND OR ( quita DROP )
3PICK BINT28 #= 3PICK #1= AND ( quita +/- )
LAM 'CurrentField FLASHPTR IfGetFieldType
DUP BINT12 #<> SWAP BINT32 #<> AND AND OR ( SI hay checks en esta lib )
EditLExists? NOTAND
case2drop 'DoBadKeyT
FALSE
;
BINT11 #=casedrop ( IfMsgGetMenu )
:: { "CHOOS"
:: TakeOver EditLExists? caseDoBadKey
BrowseFiler ( ob TRUE // FALSE )
NOT?SEMI
FLASHPTR IfSetCurrentFieldValue
;
}
*** Este argumento BINT3 indica la 2º posición en el menú del CHOOS
*** si hubieran campos Choose field, Combo field o Checkbox field
*** mover esta posición a la 3º ( BINT4 ) o 4º ( BINT5 ) posición.

BINT3
3PICK
PUTLIST
TRUE
;
BINT16 #=casedrop ( IfMsgKeyOK ) ( -> flag T ) ( si flag=F no sale )
:: BINT0 FLASHPTR IfGetFieldValue ( ob )
TestMatNCOL ( flag )
NOTcase
:: ErrMesARRAY FalseTrue ;
TrueTrue
;
DROPFALSE
;

*** Abre el Filer, mostrando sólamente los arrays reales o complejos
*** pero solo abrirá los arrays reales

NULLNAME BrowseFiler ( -> arrayreal TRUE // FALSE )
:: ZEROZERO
FALSE ( TRUE=SELECCION_MULTIPLE FALSE=NO_A_LA_SELECCION_MULTIPLE )
{ BINT4 } ( {}oMINUSONE: TIPOS DE OBJETOS QUE SE VERAN EN EL FILER )
TRUE ( TRUE para obtener valor de id / FALSE para obtener 'id' )
FLASHPTR BrowseMem.1 ( flag {}/MINUSONE FLAG -> array TRUE // FALSE // TAG )
DUPTYPETAG? case DROPFALSE
( EN LA PILA: arrayormatrix TRUE // FALSE )
ITE
:: DUP TestMatNCOL ( array flag )
ITE
TRUE ( arrayreal TRUE )
:: ErrMesARRAY DROPFALSE ; ( FALSE )
;
FALSE
;

Con el uso del comando FLASHPTR BrowseMem.1 queda superada la desventaja del IfMain (que no se podía escoger un objeto del Filer desde el IfMain).
Los llamados Extended text field del DoInputForm ahora se pueden hacer en el IfMain.
---------------------------------------------------------------------------
Probado en versiones 2.00 y 2.09
No funciona en HP49G Versión 1.24.
---------------------------------------------------------------------------
Si hubieran más campos en la pantalla cambiar el MessageHandler número 11 ( IfMsgGetMenu ) a esto:


{ :: TakeOver LAM 'CurrentField #0=ITE "CHOOS" NULL$ ;
:: TakeOver EditLExists? caseDoBadKey ( Sale si hay edición )
LAM 'CurrentField #0<> caseDoBadKey ( Sale si el campo0 no es el actual )
BrowseFiler ( ob TRUE // FALSE )
NOT?SEMI
FLASHPTR IfSetCurrentFieldValue
;
}
BINT5
3PICK
PUTLIST
TRUE
Jose Leonardo Ortiz
Jose Leonardo Ortiz
Junior HP+
Junior HP+

Masculino Cantidad de envíos : 50
Localización : Lima/Perú
Calculadora : HP 50g
ROM : 2.09

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.