
MEMOEDIT()
Edita o visualiza campos memo o cadenas de carácteres
------------------------------------------------------------------------------
Sintaxis
MEMOEDIT([<cCadena>],
[<nSuperior>], [<nIzquierda>],
[<nInferior>], [<nDerecha>],
[<lModoEdici.n>],
[<cfunciónUsuario>],
[<nLongitudL.nea>],
[<nTama.oTabulador>],
[<nFilaMemoInterTexto>],
[<nColumnaMemoInterTexto>],
[<nFilaVentana>],
[<nColumnaVentana>]) --> cMemoInterTexto
Argumentos
<cCadena> es el campo memo o la cadena de carácteres que se va a
copiar en la memoria intermedia de MEMOEDIT(). Si no se especifica, la
memoria intermedia de texto est. vac.a.
<nSuperior>, <nIzquierda>, <nInferior> y <nDerecha> son
las coordenadas superior izquierda e inferior derecha, respectivamente,
de la ventana. Los valores de fila especificados pueden estar
comprendidos entre cero y MAXROW() y los de columna entre entre cero y
MAXCOL(). Si no se especifican, las coordenadas por defecto son 0, 0,
MAXROW() y MAXCOL().
<lModoEdici.n> determina si la memoria intermedia de texto puede
editarse o sólo mostrarse en pantalla. Si se especifica verdadero (.T.),
el usuario puede modificar la memoria intermedia. Si se especifica falso
(.F.), sólo puede visualizarla. El valor por defecto es verdadero (.T.).
<cfunciónUsuario> es el nombre de la función que se ejecuta cuando
se pulsa una tecla no reconocida por MEMOEDIT() y cuando no quedan
teclas pendientes en la memoria intermedia del teclado.
<cfunciónUsuario> se especifica como valor de carácteres, sin paréntesis
ni argumentos. Si se especifica falso (.F.) en este argumento, se
muestra en pantalla <cCadena> y se termina inmediatamente MEMOEDIT().
Este argumento modifica el comportamiento autom.tico de MEMOEDIT().
Consulte la Descripción que se da a continúa.ión.
<nLongitudL.nea> determina la longitud de las líneas mostradas en la
ventana de MEMOEDIT(). Si una línea es mayor que <nLongitudL.nea>, el
texto salta autom.ticamente a la línea siguiente de la ventana. Si
<nLongitudL.nea> es mayor que el número de columnas de la ventana, .sta
se desplaza al llegar el cursor al borde. Si no se especifica
<nLongitudL.nea>, la longitud de línea por defecto ser. (<nDerecha> -
<nIzquierda>).
<nTama.oTabulador> determina tama.o del carácter de tabulaci.n que
se inserta cuando se pulsa la tecla Tab. Si no se especifica, se
insertan cuatro espacios en vez de un carácter de tabulaci.n.
<nFilaMemoInterTexto> y <nColumnaMemoInter Texto> definen la
posición de visualización del cursor en la memoria intermedia de texto.
<nFilaMemoInterTexto> se numera a partir de uno y
<nColumnaMemoInterTexto> a partir de cero. Si no se especifican estos
argumentos, el cursor se coloca en la fila uno y columna cero de la
ventana MEMOEDIT().
<nFilaVentana> y <nColumnaVentana> definen la posición inicial
del cursor en la ventana MEMOEDIT(). Las filas y columnas se numeran a
partir de cero. Si no se especifican estos argumentos, la posición
inicial en la ventana es la fila cero y la posición de columna actual
del cursor.
Devuelve
MEMOEDIT() devuelve la memoria intermedia modificada si el usuario
finaliza la edici.n con Ctrl-W o una copia de <cCadena> si finaliza con
Esc.
Descripción
MEMOEDIT() es una función de interfaz de usuario y de edici.n de texto,
que permite editar campos memo y cadenas de carácteres largas. La
edici.n se lleva a cabo en el .rea especificada, que puede estar situada
en cualquier parte de la pantalla. Al igual que las restántes funciónes
de usuario, (ACHOICE() y DBEDIT()), MEMOEDIT() dispone de una serie de
modos e incluye una función de usuario que permite reconfiguración de
las teclas y otras actividades relacionadas con la programaci.n de la
tarea actual de edici.n.
. Memoria intermedia de texto: Cuando se utiliza MEMOEDIT()
especificando <cCadena>, .sta se copia en la memoria intermedia de
texto. El usuario edita realmente la memoria intermedia. Si no se
especifica <cCadena>, se muestra al usuario una memoria intermedia
vac.a para su edici.n.
Cuando el usuario sale de MEMOEDIT() pulsando Ctrl-W, se devuelve el
contenido modificado de la memoria intermedia. Si sale pulsando Esc,
se descarta la memoria intermedia y se devuelve una copia de la
<cCadena> original. En cualquier caso, el valor de retorno puede
asignarse m.s tarde a un campo memo o variable, o pasarse como
argumento a otra función.
. Modos de edici.n: MEMOEDIT() utiliza dos modos de edici.n,
que se controlan mediante el valor de <lModoEdici.n>. Si
<lModoEdici.n> es verdadero (.T.), MEMOEDIT() pasa al modo de edici.n
y el usuario puede modificar la memoria intermedia de MEMOEDIT(). Si
<lModoEdici.n> es falso (.F.), MEMOEDIT() pasa al modo de
visualización y el usuario sólo puede desplazarse por la memoria
intermedia, sin editarla ni poder insertar nuevo texto. Para
facilitar la visualización, se ha modificado el desplazamiento de
pantalla para que las flechas Arriba y Abajo suban o bajen el texto
de la memoria intermedia una línea dentro de la ventana de
MEMOEDIT().
. Introducci.n y edici.n de texto: Con la función
MEMOEDIT(), es posible introducir y editar texto situando el cursor y
a.adiendo o borrando carácteres. Para facilitar la edici.n del texto,
se han modificado algunas teclas de desplazamiento y de edici.n:
Teclas de Desplazamiento y Edici.n de MEMOEDIT()
---------------------------------------------------------------------
Tecla Acción
---------------------------------------------------------------------
Arriba/Ctrl-E Sube una línea
Abajo/Ctrl-X Baja una línea
Izquierda/Ctrl-S Pasa un carácter a la izquierda
Derecha/Ctrl-D Pasa un carácter a la derecha
Ctrl-Izquierda/Ctrl-A Pasa una palabra a la izquierda
Ctrl-Derecha/Ctrl-F Pasa una palabra a la derecha
Inicio Pasa al principio de la línea actual
Fin Pasa al final de la línea actual
Ctrl-Inicio Pasa al principio de la ventana actual
Ctrl-Fin Pasa al final de la ventana actual
ReP.g Pasa a la ventana de edici.n anterior
AvP.g Pasa a la siguiente ventana de edici.n
Ctrl-ReP.g Pasa al principio del texto memo
Ctrl-AvP.g Pasa al final del texto memo
Intro Pasa al principio de la línea siguiente
Suprimir Borra el carácter de la posición del cursor
Retroceso Borra el carácter situado a la izquierda
del cursor
Tabulador Inserta un carácter de tabulador o espacios
Car.cter imprimible Inserta ese carácter
Ctrl-Y Borra la línea actual
Ctrl-T Borra la palabra a la derecha
Ctrl-B Da formato a un p.rrafo
Ctrl-V/Ins Activa/desactiva el modo de inserci.n
Ctrl-W Finaliza la edici.n guardando los cambios
Esc Anula edici.n y devuelve la cadena original
---------------------------------------------------------------------
Para la introducci.n de texto existen dos modos: inserci.n y
sobreescritura. Al invocar MEMOEDIT(), el modo por defecto es
sobreescritura. Para cambiar el modo de edici.n puede pulsarse la
tecla Ins, que intercambia los modos de inserci.n y sobreescritura.
También puede cambiarse en una función utilizando READINSERT() o
devolviendo 22. En el modo de inserci.n, los carácteres se introducen
en la posición actual del cursor en la memoria intermedia,
desplaz.ndose el resto del texto a la derecha. El modo de inserci.n
se indica en el .rea de la línea de estado. En el modo de
sobreescritura, los carácteres se introducen en la posición actual
del cursor sobreescribiendo los carácteres existentes, sin
desplazarse el resto de la memoria intermedia.
Seg.n se introduce texto y el cursor llega al borde de la ventana
MEMOEDIT(), la línea actual salta a la línea siguiente de la memoria
intermedia y se inserta un retorno de carro autom.tico (CHR(141)). Si
se especifica un argumento <nLongitudL.nea>, el texto salta cuando la
posición del cursor coincide con <nLongitudL.nea>. Si
<nLongitudL.nea> es mayor que la anchura de MEMOEDIT(), la ventana se
desplaza al llegar el cursor al borde. Para iniciar explícitamente
una nueva línea o p.rrafo, el usuario debe pulsar Intro.
. Pantalla de edici.n: Cuando aparece en pantalla
MEMOEDIT(), sobreescribe el .rea de la pantalla especificada sin
guardar la pantalla subyacente. Tampoco muestra un borde o t.tulo.
Para realizar estas acciones, debe crear un procedimiento o función
que realice estas acciones y, luego, invoque MEMOEDIT(). Consulte el
siguiente ejemplo.
. función de usuario: <cfunciónUsuario>, especificada como
argumento, maneja las excepciones del teclado y reconfigura las
teclas especiales. MEMOEDIT() invoca en distintas ocasiones a la
función de usuario, normalmente como respuesta a teclas no
reconocidas. Las teclas que producen excepciones del teclado son
todas las teclas de control, teclas de función y teclas Alt. Como
MEMOEDIT() no procesa estas teclas, es posible reconfigurarlas.
Algunas de ellas tienen asignada una acci.n por defecto. Con la
función de usuario pueden realizarse distintas acciones, dependiendo
del modo actual de MEMOEDIT() y del valor de retorno que indica a
MEMOEDIT() qu. debe hacer a continúa.ión.
Cuando se especifica como argumento la función de usuario, MEMOEDIT()
define dos clases de teclas: no configurables y excepciones del
teclado. Cuando se pulsa una tecla no configurable, MEMOEDIT() la
ejecuta o, en caso contrario, genera una excepci.n del teclado e
invoca a la función de usuario. Cuando en la memoria intermedia del
teclado no quedan teclas para ser procesadas por MEMOEDIT(), se
invoca de nuevo a la función de usuario.
Cuando MEMOEDIT() llama a la función de usuario, le pasa
autom.ticamente tres parámetros: el modo de MEMOEDIT(), la línea
actual de la memoria intermedia y la columna actual de la memoria
intermedia. El modo indica el estado actual de MEMOEDIT(), que
depende de la .ltima tecla pulsada o de la .ltima acci.n realizada
antes de ejecutar la función de usuario. A continúa.ión se indican
los modos posibles:
Modos de MEMOEDIT()
---------------------------------------------------------------------
Modo Memoedit.ch Descripción
---------------------------------------------------------------------
0 ME_IDLE Inactividad, se han procesado todas las teclas
1 ME_UNKEY Tecla desconocida, el texto memo no se ha
modificado
2 ME_UNKEYX Tecla desconocida, el texto memo se ha
modificado
3 ME_INIT Modo de inicializaci.n
---------------------------------------------------------------------
Un modo de 3 indica que MEMOEDIT() est. en modo de inicializaci.n. Al
especificar <cfunciónUsuario>, MEMOEDIT() realiza una llamada a la
función de usuario inmediatamente después de haberse invocado. En ese
momento, el usuario debe devolver una petición para seleccionar los
distintos modos de formato de texto de MEMOEDIT(): salto autom.tico
de línea, desplazamiento de pantalla o inserci.n. MEMOEDIT() llama a
la función varias veces, permaneciendo en el modo de inicializaci.n
hasta que el usuario devuelva 0. Entonces la memoria intermedia se
muestra en pantalla y el usuario pasa al modo de edici.n seleccionado
con <lModoEdici.n>. Recuerde que, si el salto autom.ticop de línea
est. activado cuando MEMOEDIT() pasa del modo de inicializaci.n al de
edici.n, toda la memoria intermedia se formatea con <nLongitudL.nea>.
Para evitar esta acci.n de formato inicial, desactive el salto
autom.tico de línea durante la inicializaci.n. Recuerde también que
la activaci.n/desactivaci.n del desplazamiento y el salto autom.tico
de línea no están asignados inicialmente a ningúna tecla, pero pueden
asignarse a una mediante la función de usuario.
Los modos 1 y 2 indican que MEMOEDIT() ha recibido una tecla
irreconocible o una tecla configurable. Las teclas configurables se
procesan devolviendo 0 para ejecutar la acci.n por defecto de
MEMOEDIT(). Si se devuelve otro valor se realiza otra acci.n,
redefiniendo as. la tecla. Si es una tecla irreconocible, puede
asign.rsele una acci.n que devuelva un valor que solicite una acci.n
del teclado o que realice una acci.n predefinida.
El modo 0 indica que MEMOEDIT() est. inactivo en ese momento porque
no quedan teclas para procesar. Cuando MEMOEDIT() est. inactivo, se
invoca la función de usuario. En ese momento, normalmente se
actualizan las visualizaciónes del número de línea y de columna.
Los otros dos parámetros, línea y columna actuales, indican la
posición actual del cursor en la memoria intermedia al invocar la
función de usuario. Las líneas se empiezan a contar en la posición
uno y los de columna en la posición cero.
En los modos 1, 2 . 3, el usuario puede devolver un valor que indique
a MEMOEDIT() la siguiente acci.n que debe realizar. La tabla
siguiente muestra los posibles valores devueltos y sus consecuencias:
Valores de Retorno a la función de Usuario de MEMOEDIT()
---------------------------------------------------------------------
Valor Memoedit.ch Acción
---------------------------------------------------------------------
0 ME_DEFAULT Realiza la acci.n por defecto
1-31 ME_UNKEY Procesa la acci.n solicitada que corresponde
al valor de la tecla
32 ME_IGNORE Ignora las teclas desconocidas
33 ME_DATA Trata las teclas desconocidas como datos
34 ME_TOGGLEWRAP Activa/desactiva el modo de salto autom.tico
de línea
35 ME_TOGGLESCROLL Activa/desactiva el modo de desplazamiento
de pantalla
100 ME_WORDRIGHT Se desplaza una palabra a la derecha
101 ME_BOTTOMRIGHT Se desplaza al final del texto
---------------------------------------------------------------------
. Ficheros de cabecera: Para facilitar la memorizaci.n y
utilización de los valores de modo y de petición, existe en
\CLIPPER5\INCLUDE un fichero de cabecera llamado Memoedit.ch. En el
mismo directorio existe Inkey.ch, que contiene constantes declaradas
para todos los valores de INKEY().
Notas
. configuración de teclas: Si se especifica una
<cfunciónUsuario>, pueden configurarse las teclas que se incluyen en
la siguiente tabla.
Teclas Configurables de MEMOEDIT()
---------------------------------------------------------------------
Tecla Acción por Defecto
---------------------------------------------------------------------
Ctrl-Y Borra la línea actual
Ctrl-T Borra la palabra a la derecha
Ctrl-B Da formato al p.rrafo
Ctrl-V/Ins Activa/desactiva el modo de inserci.n
Ctrl-W Finaliza la edici.n guardando los cambios
Esc Anula la edici.n devolviendo la cadena original
---------------------------------------------------------------------
Si la tecla es configurable, se devuelve 0 para ejecutar la acci.n
por defecto de MEMOEDIT(). Si se devuelve otro valor, no obstante, se
ejecuta otra acci.n del teclado lo que redefine la tecla. Si no se
trata una tecla configurable reconocida por MEMOEDIT(), también puede
asign.rsele una acci.n devolviendo un valor que solicite una de las
acciones incluidas en la tabla anterior.
. Salto autom.tico de línea: El salto autom.tico de línea es
un modo de formato que puede activarse y desactivarse devolviendo 34
desde la función de usuario. Si est. activado (opción por defecto),
MEMOEDIT() inserta un retorno de carro/salto de línea autom.tico en
la interrupci.n de texto m.s cercana al borde de la ventana o al
terminar la línea (lo que ocurra primero). Si est. desactivado,
MEMOEDIT() desplaza la memoria intermedia m.s all. del borde de la
ventana, hasta que el cursor llegue al fin de línea. En ese punto, el
usuario debe pulsar Intro (insertando un retorno de carro/salto de
línea forzado) para pasar a la línea siguiente.
. Formato de p.rrafos: Al pulsar Ctrl-B, o devolver 2 desde
una función de usuario, se vuelve a formatear la memoria intermedia
hasta encontrar un retorno de carro forzado (fin de p.rrafo) o el
final de la memoria intermedia, independientemente de que el salto
autom.tico de línea est. activado o no.
. Retornos de carro autom.ticos: En CA-Clipper, la
inserci.n de carácteres de retorno de carro/salto de línea autom.tico
nunca se permite que cambie el contenido significativo del texto. Es
decir, cuando se inserta un retorno de carro/salto de línea
autom.tico entre dos palabras, se mantienen los carácteres de espacio
que hay entre las dos palabras. Al cambiar el formato del texto, se
eliminan todos los carácteres de retorno de carro/salto de línea
autom.tico. Esto deja el texto en su formato original y trata
adecuadamente los casos en los que se ha insertado un retorno de
carro/salto de línea autom.tico en mitad de una palabra.
En la versi.n Summer '87 de MEMOEDIT(), al insertar un retorno de
carro/salto de línea autom.tico, se suprime un carácter de espacio en
ese punto del texto. Si posteriormente se formatea el texto
utilizando una anchura de línea diferente, todos los retornos de
carro/saltos de línea autom.ticos se sustituyen por un espacio. Sin
embargo, si la cadena de texto se formatea mediante alguna de las
funciónes de tratamiento de texto de CA-Clipper, las palabras que
estaban separadas por un retorno de carro/salto de línea autom.tico
se ejecutan juntas, porque este carácter no se sustituye por un
espacio.
Para evitarlo, los textos formateados con la versi.n Summer '87 de
MEMOEDIT() deben procesarse para sustituir los carácteres de retorno
de carro /salto de línea autom.tico por espacios. Esto puede
realizarse mediante la función STRTRAN(), tal como se indica a
continúa.ión.
STRTRAN( <texto>, CHR(141)+CHR(10), " " )
Para convertir los valores memo de una base de datos existente, puede
utilizarse el siguiente programa de dos líneas:
USE <xcBasedeDatos>
REPLACE ALL <idMemo> WITH ;
STRTRAN( <idMemo>, CHR(141)+CHR(10), " " )
Debido al formato del fichero (.dbt), la sustituci.n de todos los
sucesos de un campo memo puede hacer que el fichero (.dbt) aumente
notablemente. El fichero (.dbt) puede reducirse copiando el fichero
(.dbf) en un nuevo fichero.
En ficheros (.dbt) muy grandes, el procedimiento anterior puede no
ser factible. En tal caso, puede utilizarse el programa DBT50.EXE,
situado en el directorio \CLIPPER5\BIN. DBT50 examina un fichero
(.dbt) completo, sustituyendo todos los pares de retorno de
carro/salto de línea autom.tico por dos espacios. Aunque esto produce
el efecto no deseado de separar determinadas palabras con dos
espacios en vez de uno, permite procesar el fichero directamente sin
necesidad de utilizar espacio de disco adicional. DBT50 modifica
.nicamente los carácteres de retorno de carro/salto de línea
autom.tico del fichero objeto. El resto del texto no se modifica.
. Edici.n de ficheros de texto: MEMOEDIT() edita ficheros de
texto si pueden leerse en una variable de carácteres de CA-Clipper.
Esto puede hacerse mediante la función MEMOREAD(). Despu.s de editar
el contenido del fichero de texto incluido en la variable de
carácteres, debe volver a escribirse mediante MEMOWRIT().
Ejemplos
. Este ejemplo permite examinar un campo memo, pero impide
realizar cambios en la memoria intermedia:
USE Cliente NEW
SET CURSOR OFF
MEMOEDIT(NotasCli, 5, 10, 20, 69, .F.)
SET CURSOR ON
. El siguiente ejemplo permite editar un campo memo, volviendo a
asignar los cambios al mismo:
USE Cliente NEW
REPLACE NotasCli WITH ;
MEMOEDIT(NotasCli, 5, 10, 20, 69)
. Este ejemplo crea una cadena de carácteres mediante
MEMOEDIT():
LOCAL cNotas
cNotas = MEMOEDIT()
. El ejemplo siguiente es una función que edita una cadena de
carácteres en una ventana emmarcada, con un t.tulo:
FUNCTION EditMemo( cCadena, cTitulo,;
nSup, nIzda, nInf, nDer )
LOCAL cPantalla := SAVESCREEN(nSup nIzda,;
nInf, nDer)
@ nSup - 1, nIzda - 2 CLEAR TO nInf + 1,;
nDer + 2
@ nSup - 1, nIzda - 2 TO nInf + 1, nDer + 2
@ nSup - 1, nIzda SAY "[" + cTitulo + "]"
cCadena = MEMOEDIT(cCadena, nSup, nIzda,;
nInf, nDer)
RESTSCREEN(nSup, nIzda, nInf, nDer, cPantalla)
RETURN (cCadena)
. Este ejemplo lee el contenido de un fichero de texto incluido
en una variable de carácteres, lo edita y lo vuelve a escribir en el
disco:
LOCAL cCadena := MEMOREAD("Text.txt")
cCadena := MEMOEDIT(cCadena)
IF !MEMOWRIT("Text.txt", cCadena)
? "Error escritura"
BREAK
ENDIF
RETURN
. Este ejemplo contiene una función que muestra en pantalla un
mensaje que describe el modo actual de MEMOEDIT(). Además, en el modo
ME_UNKEY, la función realizar. una acci.n ME_WORDRIGHT o
ME_BOTTOMRIGHT, dependiendo de la tecla de función asociada que se
haya pulsado:
#include "memoedit.ch"
#include "inkey.ch"
PROCEDURE Main()
USE Cliente NEW
REPLACE NotasCli WITH;
MEMOEDIT( NotasCli, 5, 5, 15, 75, .T., "MemoUDF" )
RETURN
FUNCTION MemoUDF( nModo, nLinea, nCol )
LOCAL nTecla := LASTKEY()
LOCAL nValDev := ME_DEFAULT // Acción devuelta por
// defecto
DO CASE
CASE nModo == ME_IDLE
@ 20, 5 SAY "El modo es ME_IDLE "
CASE nModo == ME_UNKEY
@ 20, 5 SAY "El modo es ME_UNKEY "
DO CASE
CASE nTecla == K_F2
nValDev := ME_WORDRIGHT
CASE nTecla == K_F3
nValDev := ME_BOTTOMRIGHT
ENDCASE
CASE nModo == ME_UNKEYX
@ 20, 5 SAY "El modo es ME_UNKEYX"
OTHERWISE
@ 20, 5 SAY "El modo es ME_INIT "
ENDCASE
RETURN nValDev
Ficheros: La biblioteca asociada es EXTEND.LIB,
los ficheros de cabecera son Memoedit.ch y Inkey.ch.
MEMOLINE()
Extrae una línea de texto de la cadena de carácteres o campo memo
------------------------------------------------------------------------------
Sintaxis
MEMOLINE(<cCadena>,
[<nLongitudL.nea>],
[<nNúmeroL.nea>],
[<nTama.oTabulador>],
[<lSaltoL.nea>]) --> cL.nea
Argumentos
<cCadena> es el campo memo o cadena de carácteres del que se va a
extraer una línea de texto.
<nLongitudL.nea> especifica el número de carácteres de línea y puede
estar comprendido entre 4 y 254. Si no se especifica, la longitud de
línea por defecto es 79.
<nNúmeroL.nea> es el número de línea que se va a extraer. Si no se
especifica, el valor por defecto es uno.
<nTama.oTabulador> define el tama.o del tabulador. Si no se
especifica, el valor por defecto es de cuatro espacios. Si
<nTama.oTabulador> es mayor o igual que <nLongitudL.nea>, el tama.o de
tabulador se convierte autom.ticamente en <nLongitudL.nea> - 1.
<lSaltoL.nea> activa/desactiva el salto autom.tico de línea. Si se
especifica verdadero (.T.) se activa el salto de línea y si de
especifica falso (.F.) se desactiva. El valor por defecto es verdadero
(.T.).
Devuelve
MEMOLINE() devuelve la línea de texto especificada por <nNúmeroL.nea> en
<cCadena>, como cadena de carácteres. Si la línea tiene menos carácteres
que la longitud indicada, el valor de retorno se rellena con espacios en
blanco. Si el número de línea es mayor que el número total de líneas de
<cCadena>, MEMOLINE() devuelve una cadena nula ("").
Si <lSaltoL.nea> es verdadero (.T.) y la longitud de línea indicada
interrumpe la línea en mitad de una palabra, dicha palabra no se incluye
en el valor de retorno, sino que se muestra al principio de la siguiente
línea extra.da mediante MEMOLINE().
Si <lSaltoL.nea> es falso (.F.), MEMOLINE() devuelve solamente el número
de carácteres especificado por la longitud de línea. La siguiente línea
extra.da por MEMOLINE() comienza en el carácter que va a continúa.ión
del siguiente retorno de carro forzado, y los carácteres intermedios no
se procesan.
Descripción
MEMOLINE() es una función que se utiliza con MLCOUNT() para extraer
líneas de texto de cadenas de carácteres y campos memo, bas.ndose en el
número de carácteres por línea. Es la función m.s sencilla de CA-Clipper
para mostrar en pantalla campos memo y cadenas largas.
La forma de utilización m.s f.cil consiste en determinar el número de
líneas del campo memo o cadena de carácteres útilizando MLCOUNT() con el
mismo número de carácteres por línea, tama.o de tabulador y selecci.n de
salto de línea que va a utilizar con MEMOLINE(). Este valor puede
utilizarse como l.mite superior de FOR...NEXT para extraer las líneas
del campo memo o cadena de carácteres mediante MEMOLINE() y procesarlas
con cualquier combinación de funciónes y mandatos de salida necesarios.
Ejemplos
. Este ejemplo muestra el m.todo general para mostrar en
pantalla campos memo y cadenas de carácteres largas utilizando una
combinación de las funciónes MLCOUNT() y MEMOLINE():
LOCAL nLongitudLinea := 40, nTamanoTabulador := 3,;
lSaltoLinea := .T.
LOCAL nLineas, nLineaActual
USE Cliente INDEX NombreCli NEW
//
nLineas := MLCOUNT(NotasCli, nLongitudLinea,;
nTamanoTabulador, lSaltoLinea)
//
SET PRINTER ON
FOR nLineaActual := 1 TO nLineas
? MEMOLINE(NotasCli, nLongitudLinea, nLineaActual;
nTamanoTabulador, lSaltoLinea)
NEXT
SET PRINTER OFF
Ficheros: La biblioteca asociada es EXTEND.LIB.
MEMOREAD()
Devuelve el contenido de un fichero de disco en forma de cadena de carácteres
------------------------------------------------------------------------------
Sintaxis
MEMOREAD(<cFichero>) --> cCadena
Argumentos
<cFichero> es el nombre del fichero que se va a leer en el disco.
Debe incluir una extensión, si la hay, y una vía de acceso opciónal.
Devuelve
MEMOREAD() devuelve el contenido de un fichero de texto en forma de
cadena de carácteres. El máximo tama.o de fichero que puede leerse es de
65.535 carácteres (64K), que es el tama.o máximo de una cadena. Si no se
encuentra <cFichero>, MEMOREAD() devuelve una cadena nula ("").
Descripción
MEMOREAD() es una función que lee en la memoria un fichero de disco,
donde se maneja como cadena de carácteres o se asigna a un campo memo.
MEMOREAD() se utiliza con MEMOEDIT() y MEMOWRIT() para editar un fichero
de disco importado y volver a escribirlo después en el disco. MEMOREAD()
busca <cFichero> comenzando en el directorio del DOS actual. Si el
fichero no se encuentra, MEMOREAD() busca en la vía del DOS. MEMOREAD()
no utiliza los valores DEFAULT o PATH de CA-Clipper para la b.squeda de
<cFichero>.
En un entorno de red, MEMOREAD() intenta abrir el fichero especificado
en modo compartido y de sólo lectura. Si ya ha sido abierto en modo
exclusivo por de otro proceso, MEMOREAD() devuelve una cadena nula ("").
Ejemplos
. Este ejemplo utiliza MEMOREAD() para asignar el contenido de
un fichero de texto al campo memo Notas y a una variable de tipo
carácter:
REPLACE Notas WITH MEMOREAD("Temp.txt")
cCadena = MEMOREAD("Temp.txt")
. Este ejemplo define una función que edita un fichero de disco:
FUNCTION Editor( cFichero )
LOCAL cCadena
IF (cCadena := MEMOREAD(cFichero)) == ""
? "Error de lectura de " + cFichero
RETURN .F.
ELSE
MEMOWRIT(cFichero, MEMOEDIT(cCadena))
RETURN .T.
ENDIF
Ficheros: La biblioteca asociada es EXTEND.LIB.
MEMORY()
Determina la cantidad de memoria libre disponible
------------------------------------------------------------------------------
Sintaxis
MEMORY(<nExp>) --> nKbytes
Argumentos
<nExp> es un valor numérico que determina el significado del valor
que devuelve MEMORY(), como se indica a continúa.ión:
Valores del Argumento de MEMORY()
------------------------------------------------------------------------
Valor Significado
------------------------------------------------------------------------
0 Espacio total estimado disponible para valores de tipo carácter
1 Bloque contiguo m.s grande disponible para valores de tipo
carácter
2 Area disponible para mandatos RUN
------------------------------------------------------------------------
Devuelve
MEMORY() devuelve un valor numérico entero que representa la cantidad de
memoria disponible, en incrementos de un kilobyte.
Descripción
MEMORY() es una función de entorno que informa de los distintos estados
del .rea de memoria disponible. (Esta zona es el .rea din.mica de la
memoria que almacena cadenas de carácteres y ejecuta mandatos RUN.)
Ejemplos
. Este ejemplo utiliza MEMORY() antes de un mandato RUN para
determinar si se dispone de suficiente memoria para ejecutar el
programa externo:
#define MEM_CHAR 0
#define MEM_BLOCK 1
#define MEM_RUN 2
//
IF MEMORY(MEM_RUN) >= 128
RUN MYPROG
ELSE
? "Memoria insuficiente para ejecutar el programa"
BREAK
ENDIF
Ficheros: La biblioteca asociada es CLIPPER.LIB.
MEMOTRAN()
Sustituye los retornos de carro/saltos de línea contenidos en una cadena de
carácteres
------------------------------------------------------------------------------
Sintaxis
MEMOTRAN(<cCadena>,
[<cSustRCForzado>],
[<cSustRCAutom.tico>]) --> cNuevaCadena
Argumentos
<cCadena> es la cadena de carácteres o campo memo que se va a leer.
<cSustRCForzado> es el carácter por el que se va a sustituir cada
retorno de carro/salto de línea forzado. Si no se especifica, el valor
por defecto es un punto y coma (;).
<cSustRCAutom.tico> es el carácter por el que se va a sustituir cada
retorno de carro/salto de línea autom.tico. Si no se especifica, el
valor por defecto es un espacio.
Devuelve
MEMOTRAN() devuelve una copia de <cCadena> en la que se han sustituido
los retornos de carro/saltos de línea especificados.
Descripción
MEMOTRAN() es una función que convierte un campo memo o una cadena de
carácteres larga, que contiene retornos de carro/saltos de línea
autom.ticos y forzados, en un formato que pueda mostrarse en pantalla.
Esta combinación de dos carácteres es un indicador de fin de línea
colocado en una cadena por MEMOEDIT(). Se insertan retornos de carro
autom.ticos (CHR(141)) cuando una línea que es m.s larga que la anchura
de la ventana de MEMOEDIT() salta a la línea siguiente. Se insertan
retornos de carro forzados (CHR(13)) cuando el usuario pulsa
explícitamente la tecla Intro.
MEMOTRAN() sirve para visualizar un campo memo de un REPORT FORM sin
saltos de línea autom.ticos al encontrar retornos de carro autom.ticos.
MEMOTRAN() lo soluciona convirtiendo los retornos de carro autom.ticos
en espacios. Recuerde, no obstante, que es necesario declarar MEMOTRAN()
como función externa mediante la sentencia REQUEST, si se utiliza en un
REPORT FORM y no se especifica en ningúna otra parte del programa
actual.
Ejemplos
. El siguiente ejemplo suprime todos los carácteres de fin de
línea de un campo memo:
REPLACE Notas WITH MEMOTRAN(Notas)
Ficheros: La biblioteca asociada es EXTEND.LIB.
MEMOWRIT()
Escribe una cadena de carácteres o un campo memo en un fichero de disco
------------------------------------------------------------------------------
Sintaxis
MEMOWRIT(<cFichero>, <cCadena>) --> lExito
Argumentos
<cFichero> es el nombre del fichero de disco de destáno, incluyendo
la extensión y el indicador de vía y unidad opciónales.
<cCadena> es la cadena de carácteres o campo memo que se va a
escribir en <cFichero>.
Devuelve
MEMOWRIT() devuelve verdadero (.T.) si la operación.de escritura se ha
realizado con .xito; en caso contrario, devuelve falso (.F.).
Descripción
MEMOWRIT() es una función que escribe una cadena de carácteres o campo
memo en un fichero de disco. Si no se especifica la vía, MEMOWRIT()
escribe <cFichero> en el directorio actual del DOS, en vez de en el
directorio especificado por el valor de SET DEFAULT actual. Si
<cFichero> ya existe, se sobreescribe.
MEMOWRIT() se utiliza generalmente con MEMOREAD() para cargar en memoria
ficheros de texto, donde pueden editarse, mostrarse en pantalla y volver
a escribirse en el disco. Asimismo, MEMOWRIT() puede utilizarse como un
m.todo r.pido de exportar un campo memo a un fichero de texto.
Ejemplos
. Este ejemplo utiliza MEMOWRIT() con MEMOREAD() para permitir
la edici.n de campos memo con un editor externo:
LOCAL cEditor := "MYEDIT.EXE"
USE Ventas NEW
IF MEMOWRIT("Cliptmp.txt", Notas)
RUN (cEditor + " Cliptmp.txt")
REPLACE Notas WITH MEMOREAD("Cliptmp.txt")
ELSE
? "Error al escribir Cliptmp.txt"
BREAK
ENDIF
Ficheros: La biblioteca asociada es EXTEND.LIB.
MEMVARBLOCK()
Devuelve un bloque de código de asignación/lectura para una variable de
memoria dada
------------------------------------------------------------------------------
Sintaxis
MEMVARBLOCK(<cNombreVarmem>) --> bBloqueVarmem
Argumentos
<cNombreVarmem> es el nombre de la variable a la que hace referencia
el bloque de lectura/escritura, especificada como cadena de carácteres.
Devuelve
MEMVARBLOCK() devuelve un bloque de código que, al evaluarse, permite
asignar u obtener el valor de la variable de memoria especificada. Si no
existe la variable, MEMVARBLOCK() devuelve NIL.
Descripción
El bloque de código creado por MEMVARBLOCK() realiza dos operación.s,
dependiendo de si se pasa un argumento al bloque de código cuando se
eval.a. Si se eval.a con un argumento, asigna ese valor a
<cNombreVarmem>. Si se eval.a sin argumento, recupera el valor de
<cNombreVarmem>.
Notas
. MEMVARBLOCK() sólo permite crear bloques de asignación/lectura
de variables de nombres conocidos durante la ejecución.
MEMVARBLOCK(), por tanto, no puede utilizarse para crear bloques de
asignación/lectura de variablesólocales o estáticas. La misma
restricci.n se aplica a la creaci.n de bloques mediante el operador
de macro (&).
Ejemplos
. Este ejemplo compara MEMVARBLOCK() con un bloque de código
creado con el operador de macro (&). Observe que la utilización de
MEMVARBLOCK() le permite evitar la velocidad y el tama.o iniciales
del operador de macro:
PRIVATE var := "Esto es una cadena"
//
// Bloque de asignación/lectura definido mediante
// el operador de macro
bLeerEscr := &( "{ |valEst|;
IF( valEst == NIL, var, var := valEst ) }" )
// Bloque de asignación/lectura definido mediante
//MEMVARBLOCK()
// el bLeerEscr creado aqu. es el equivalente
// funciónal del bLeerEscr anterior
bEstObt := MEMVARBLOCK("var")
Ficheros: La biblioteca asociada es CLIPPER.LIB.
MIN()
Devuelve el menor de dos valores numéricos o de fecha
------------------------------------------------------------------------------
Sintaxis
MIN(<nExp1>, <nExp2>) --> nMenor
MIN(<fExp1>, <fExp2>) --> fMenor
Argumentos
<nExp1> y <nExp2> son los valores numéricos que se van a
comparar.
<fExp1> y <fExp2> son los valores de fecha que se van a
comparar.
Devuelve
MIN() devuelve el menor de dos argumentos. El valor de retorno es del
mismo tipo de datos que los argumentos.
Descripción
MIN() es una función numérica y de fecha que asegura que el valor de una
expresión sea inferior a un mínimo especificado. La función inversa de
MIN() es MAX(), que devuelve el mayor de dos valores numéricos o de
fecha.
Ejemplos
. En los siguientes ejemplos, MIN() devuelve el menor de dos
valores numéricos:
? MIN(99, 100) // Resultado: 99
? MIN(100, 99) // Resultado: 99
. En los ejemplos siguientes, MIN() compara valores de fecha:
? DATE() // Resultado: 09/01/90
? MIN(DATE(), DATE() + 30) // Resultado: 09/01/90
Ficheros: La biblioteca asociada es CLIPPER.LIB.
MLCOUNT()
Cuenta el número de líneas de una cadena de carácteres o de un campo memo
------------------------------------------------------------------------------
Sintaxis
MLCOUNT(<cCadena>, [<nLongitudL.nea>],
[<nTama.oTabulador>], [<lSaltoL.nea>]) --> nL.neas
Argumentos
<cCadena> es la cadena de carácteres o el campo memo en el que se va
a realizar el recuento.
<nLongitudL.nea> especifica el número de carácteres por línea y
puede estar comprendido entre 4 y 254. Si no se especifica, la longitud
de línea por defecto es 79.
<nTama.oTabulador> define el tama.o de tabulador. Si no se
especifica, el valor por defecto es de cuatro espacios. Si
<nTama.oTabulador> es mayor o igual que <nLongitudL.nea>, el tama.o de
tabulador se convierte autom.ticamente en <nLongitudL.nea> - 1.
<lSaltoL.nea> activa o desactiva el salto autom.tico de línea. Si se
especifica verdadero (.T.) se activa el salto autom.tico de línea; si se
especifica falso (.F.) se desactiva. El valor por defecto es verdadero
(.T.).
Devuelve
MLCOUNT() devuelve el número de líneas de <cCadena>, dependiendo de la
<nLongitudL.nea>, el <nTama.oTabulador> y la activaci.n o desactivaci.n
del salto autom.tico de línea.
Descripción
MLCOUNT() es una función que se utiliza con MEMOLINE() para imprimir
cadenas de carácteres y campos memo, bas.ndose en el número de
carácteres por línea. En su forma m.s sencilla, MLCOUNT() devuelve el
número de líneas de la cadena de carácteres o del campo memo. Luego,
puede utilizar MEMOLINE() para extraer las líneas en el campo memo hasta
que no quede ningúna línea.
Si <lSaltoL.nea> es verdadero (.T.) y un fin de línea divide en dos una
palabra, el texto pasa a la línea sigiente incluyendo esa palabra. Si
<lSaltoL.nea> es falso (.F.), MLCOUNT() cuenta como línea actual el
número de carácteres especificado por <nLongitudL.nea>. La siguiente
línea comienza por el carácter que vaya detrás del siguiente retorno de
carro forzado o autom.tico que se encuentre y los restántes carácteres
se ignoran.
Ejemplos
. Este ejemplo muestra en pantalla el contenido de todos los
campos memo Notas del fichero de base de datos Ventas, una línea cada
vez:
USE Ventas NEW
nLongLinea = 65
//
DO WHILE !EOF()
nLineas = MLCOUNT(Ventas->Notas, nLongLinea)
FOR nLineaActual = 1 TO nLineas
? MEMOLINE(Ventas->Notas, nLongLinea, nLineaAct)
NEXT
SKIP
?
ENDDO
Ficheros: La biblioteca asociada es EXTEND.LIB.
MLCTOPOS()
Devuelve la posición absoluta del carácter en una cadena formateada en filas
y columnas
------------------------------------------------------------------------------
Sintaxis
MLCTOPOS(<cTexto>, <nAnchura>, <nL.nea>, <nCol>,
[<nTama.oTabulador>], [<lSaltoL.nea>]) -->nPosicion
Argumentos
<cTexto> es la cadena de texto que se va a tratar.
<nAnchura> es la anchura del formato de línea.
<nL.nea> es el número de línea, contando a partir de 1.
<nCol> es el número de columna, contando a partir de 0.
<nTama.oTabulador> es el número de columnas que hay entre las
posiciónes de tabulaci.n. Si no se especifica, el valor por defecto es
4.
<lSaltoL.nea> es el indicador de salto autom.tico de línea. Si no se
especifica, el valor por defecto es verdadero (.T.).
Devuelve
MLCTOPOS() devuelve la posición de byte dentro de <cTexto>, contando a
partir de 1.
Descripción
MLCTOPOS() es una función memo que determina la posición de byte que
corresponde a una línea y una columna determinadas dentro del texto
formateado. Recuerde que la numeraci.n de líneas comienza por uno,
mientras que la numeraci.n de columnas comienza por cero. Esta función
es compatible con MEMOEDIT(). El valor de retorno se cuenta a partir de
uno, lo que permite utilizarlo con SUBSTR() u otras funciónes de
cadenas.
MLCTOPOS() se utiliza con MPOSTOLC() para crear rutinas de b.squeda u
otros procesamientos de texto de MEMOEDIT(). Consulte el código fuente
del Editor de Programas, que se encuentra en el directorio
\CLIPPER5\SOURCE\PE.
Ejemplos
. Este ejemplo determina la posición de byte de la línea 5,
columna 3 de la cadena cTexto:
cTexto := "Recuerde en qu. lado del pan debe"+;
"ponerse la mantequilla."
//
? MLCTOPOS(cTexto, 5, 3, 0) // Resultado: 10
Ficheros: La biblioteca asociada es CLIPPER.LIB.
MLPOS()
Determina la posición de una línea en una cadena de carácteres o en un campo
memo
------------------------------------------------------------------------------
Sintaxis
MLPOS(<cCadena>, <nLongitudL.nea>, <nL.nea>, [<nTama.oTabulador>],
[<lSaltoL.nea>]) -->nPosici.n
Argumentos
<cCadena> es una cadena de carácteres o un campo memo.
<nLongitudL.nea> especifica el número de carácteres por línea.
<nL.nea> especifica el número de línea.
<nTama.oTabulador> define el tama.o del tabulador. El valor por
defecto es cuatro. Si <nTama.oTabulador> es mayor o igual que
<nLongitudL.nea>, el tama.o del tabulador se convierte en
<nLongitudL.nea> - 1.
<lSaltoL.nea> activa y desactiva el salto autom.tico de línea. Si se
especifica verdadero (.T.), se activa el salto de línea y si se
especifica falso (.F.), se desactiva. El valor por defecto es verdadero
(.T.).
Devuelve
MLPOS() devuelve la posición de carácter de <nL.nea> en <cCadena>, como
valor numérico entero. Si <nL.nea> es mayor que el número de líneas de
<cCadena>, MLPOS() devuelve la longitud de <cCadena>.
Ejemplos
. Este ejemplo utiliza MLPOS() para buscar la posición de una
línea determinada, suponiendo una longitud de línea dada:
cCadena = MEMOREAD("Temp.txt")
nLongLinea = 40
nLinea = 5
nPosicion = MLPOS(cCadena, nLongLinea, nLinea)
? SUBSTR(cCadena, nPosicion, 12)
Ficheros: La biblioteca asociada es EXTEND.LIB.
MOD()*
Devuelve el resto de dos números en formato dBASE III PLUS
------------------------------------------------------------------------------
Sintaxis
MOD(<nDividendo>, <nDivisor>) --> nResto
Argumentos
<nDividendo> es el dividendo de la operación.de divisi.n.
<nDivisor> es el divisor de la operación.de divisi.n.
Devuelve
MOD() devuelve un número que representa el resto de <nDividendo>
dividido por <nDivisor>.
Descripción
MOD() es una función numérica que emula la función MOD() de dBASE III
PLUS. Se ejecuta mediante el operador de resto de CA-Clipper (%).
Recuerde que existen diferencias entre la función MOD() de dBASE III+
y el operador de resto de CA-Clipper, que se describen en la siguiente
tabla:
Diferencias entre la función MOD() de dBASE III PLUS y el operador de
resto de CA-Clipper
------------------------------------------------------------------------
Dividendo Divisor Operador Resto MOD() función MOD() de dBASE
III PLUS
------------------------------------------------------------------------
3 0 Error Error 3
3 -2 1 -1 -1
-3 2 -1 1 1
-3 0 Error Error -3
-1 3 -1 2 2
-2 3 -2 1 1
2 -3 2 -1 -1
1 -3 1 -2 -2
------------------------------------------------------------------------
MOD() se incluye como función de compatibilidad y, por tanto, su
utilización no es recomendable. Puede sustituirse completamente por el
operador de resto (%).
Notas
. Divisores cero en dBASE III PLUS: En dBASE III PLUS, un
divisor cero devuelve el dividendo cualquiera que sea el valor del
mismo. En CA-Clipper, por el contrario, la divisi.n de cualquier
dividendo con un divisor cero provoca un error de ejecución.
. Divisores cero en versiones anteriores: En las versiones
de CA-Clipper anteriores a Summer '87, una divisi.n con un
divisor cero devolvía cero cualquiera que fuera el dividendo. En las
versiones Summer '87 y posteriores, devuelve un error de ejecución.
Ficheros: La biblioteca asociada es EXTEND.LIB,
el fichero fuente es SOURCE\SAMPLE\MOD.PRG.
MONTH()
Convierte un valor de fecha en un número de mes
------------------------------------------------------------------------------
Sintaxis
MONTH(<fFecha>) --> nMes
Argumentos
<fFecha> es el valor de fecha que se va a convertir.
Devuelve
MONTH() devuelve un valor numérico entero comprendido en el rango de 0 a
12. Si se especifica una fecha nula (CTOD("")) devuelve cero.
Descripción
MONTH() es una función de conversión de fechas que se utiliza cuando se
requiere un valor numérico de mes para calcular informes peri.dicos,
etc. MONTH() forma parte de un grupo de funciónes que devuelven los
componentes de un valor de fecha como valores numéricos. En este grupo
incluye DAY() y YEAR(), que devuelven respectivamente los valores de d.a
y a.o como valores numéricos. CMONTH() es una función relacionada, que
devuelve el nombre del mes a partir de un valor de fecha.
Ejemplos
. Los siguientes ejemplos devuelven el mes de la fecha del
sistema:
? DATE() // Resultado: 09/01/90
? MONTH(DATE()) // Resultado: 9
? MONTH(DATE()) + 1 // Resultado: 10
. Este ejemplo muestra a MONTH() realizando una acci.n con una
fecha nula:
#define NULL_DATE (CTOD(""))
? MONTH(NULL_DATE) // Resultado: 0
Ficheros: Fichero de biblioteca CLIPPER.LIB.
MPOSTOLC()
Devuelve la posición de línea y columna de una cadena formateada, bas.ndose
en una posición de byte especificada
------------------------------------------------------------------------------
Sintaxis
MPOSTOLC(<cTexto>, <nAnchura>, <nPos>,
[<nTama.oTabulador>], [<lSaltoL.nea>]) --> aL.neaColumna
Argumentos
<cTexto> es una cadena de texto.
<nAnchura> es la longitud de la línea formateada.
<nPos> es la posición de byte dentro del texto, contada a partir de
uno.
<nTama.oTabulador> es el número de columnas que hay entre las
posiciónes de tabulaci.n. Si no se especifica, el valor por defecto es
cuatro.
<lSaltoL.nea> es el indicador de salto autom.tico de línea. Si no se
especifica, el valor por defecto es verdadero (.T.).
Devuelve
MPOSTOLC() devuelve una matriz que contiene los valores de línea y de
columna de la posición de byte especificada, <nPos>.
Descripción
MPOSTOLC() es una función memo que determina la fila y columna
formateadas en <cTexto> que corresponden a una posición de byte
especificada. Recuerde que el número de fila devuelto se cuenta a partir
de uno, mientras que el número de columna se cuenta desde cero. Esta
función es compatible con MEMOEDIT(). <nPos> se cuenta a partir de uno,
lo que hace esta función compatible con AT(), RAT() y otras funciónes de
cadenas.
MPOSTOLC(), utilizada con MLCTOPOS(), permite crear rutinas de b.squeda
u otros procedimientos de texto para MEMOEDIT(). Consulte el código
fuente del Editor de Programas que se encuentra en el directorio
\CLIPPER5\SOURCE\PE.
Ejemplos
. Para la cadena de texto indicada, este ejemplo determina la
fila y la columna correspondientes al octavo carácter del texto, dada
una anchura de formato de cinco columnas. Una anchura de formato de
cinco columnas hace que las tres primeras palabras se coloquen cada
una en una línea distinta. El octavo carácter del texto es la "l" de
"lado." La palabra "lado" estar.a en la columna situada m.s a la
izquierda de la tercera línea del texto formateado; por tanto, el
valor de retorno es {3, 0}:
cText := "Mire el lado del pan donde"+;
"debe ponerse la mantequilla."
//
aLC := MPOSTOLC(cText, 5, 8) // Resultado: {3, 0}
Ficheros: La biblioteca asociada es CLIPPER.LIB.
NETERR()
Determina si ha fallado alg.n mandato o función de red
------------------------------------------------------------------------------
Sintaxis
NETERR([<lNuevoError>]) --> lError
Argumentos
<lNuevoError>: Si se especifica, selecciona el valor que devuelve
NETERR() en el estado especificado. <lNuevoError> puede ser verdadero
(.T.) o falso (.F.). El establecimiento de NETERR() en un valor
especificado permite al manejador de errores de ejecución controlar el
m.todo de manejo de determinados errores. Si desea más información,
consulte Errorsys.prg.
Devuelve
NETERR() devuelve verdadero (.T.) si ha fallado alg.n mandato USE o
APPEND BLANK. El valor inicial de NETERR() es falso (.F.). Si el proceso
actual no se ejecuta en un sistema operativo de red, NETERR() siempre
devuelve falso (.F.).
Descripción
NETERR() es una función de red. Se trata de un indicador global que
puede activarse por USE, USE...EXCLUSIVE y APPEND BLANK en un entorno de
red. Permite comprobar si ha fallado alguno de estos mandatos,
devolviendo verdadero (.T.) en las siguientes situaciones:
Causas de NETERR()
------------------------------------------------------------------------
Mandato Causa
------------------------------------------------------------------------
USE Abierto en modo exclusivo por otro proceso
USE...EXCLUSIVE Apertura en modo exclusivo o compartido por otro
proceso
APPEND BLANK Bloqueo por otro usuario con FLOCK() o RLOCK() de
LASTREC() + 1
------------------------------------------------------------------------
NETERR() se aplica normalmente a un programa para comprobarlo después de
aplicar un mandato USE o APPEND BLANK. Si devuelve falso (.F.), se puede
realizar la siguiente operación. Si el mandato es USE, se pueden abrir
ficheros ííndice. Si se trata de APPEND BLANK, pueden asignarse valores
al nuevo registro mediante un mandato REPLACE o @...GET. Si no devuelve
el valor falso, es necesario manejar el error, bien volviendo a intentar
el mandato USE o APPEND BLANK o finalizando la operación.actual con
BREAK o RETURN.
Ejemplos
. Este ejemplo muestra la forma de utilización de NETERR(). Si
el mandato USE concluye satisfactoriamente, se abren los ficheros
índice y el proceso continúa. Si el mandato USE falla, aparece un
mensaje y el control vuelve a la estructura BEGIN SEQUENCE m.s
cercana:
USE Cliente SHARED NEW
IF !NETERR()
SET INDEX TO NumCli, PedidosCli, CodPostCli
ELSE
? "Otro usuario est. utilizando el fichero"
BREAK
ENDIF
Ficheros: La biblioteca asociada es CLIPPER.LIB.
NETNAME()
Devuelve el código identificador de la estación de trabajo actual
------------------------------------------------------------------------------
Sintaxis
NETNAME() --> cNombreEstaci.nTrabajo
Devuelve
NETNAME() devuelve el código identificador de la estación de trabajo, en
forma de cadena con una longitud máxima de 15 carácteres. Si no se ha
establecido la estación de trabajo o la aplicación no est. operando en
una red de PCs IBM, devuelve una cadena nula ("").
Ejemplos
. El ejemplo siguiente muestra el resultado de NETNAME() al
arrancar una estación de trabajo como nodo de red con un
identificador de estación de "STATION 1":
? NETNAME() // Resultado: STATION 1
. El ejemplo siguiente muestra el resultado de NETNAME() al
arrancar una estación de trabajo como unidad independiente:
? NETNAME() // Resultado: ""
Ficheros: La biblioteca asociada es CLIPPER.LIB.
NETNAME()
Devuelve el código identificador de la estación de trabajo actual
------------------------------------------------------------------------------
Sintaxis
NETNAME() --> cNombreEstaci.nTrabajo
Devuelve
NETNAME() devuelve el código identificador de la estación de trabajo, en
forma de cadena con una longitud máxima de 15 carácteres. Si no se ha
establecido la estación de trabajo o la aplicación no est. operando en
una red de PCs IBM, devuelve una cadena nula ("").
Ejemplos
. El ejemplo siguiente muestra el resultado de NETNAME() al
arrancar una estación de trabajo como nodo de red con un
identificador de estación de "STATION 1":
? NETNAME() // Resultado: STATION 1
. El ejemplo siguiente muestra el resultado de NETNAME() al
arrancar una estación de trabajo como unidad independiente:
? NETNAME() // Resultado: ""
Ficheros: La biblioteca asociada es CLIPPER.LIB.
NEXTKEY()
Lee la siguiente tecla pendiente en la memoria intermedia del teclado
------------------------------------------------------------------------------
Sintaxis
NEXTKEY() --> nC.digoTecla
Devuelve
NEXTKEY() devuelve un valor numérico entero comprendido en el rango de
-39 a 386. Si la memoria intermedia del teclado est. vac.a, NEXTKEY()
devuelve cero. Si SET TYPEAHEAD es cero, NEXTKEY() siempre devuelve
cero.
Descripción
NEXTKEY() es una función que lee la siguiente tecla pendiente en la
memoria intermedia del teclado sin extraerla de la misma. El valor
devuelto es el código INKEY() de la tecla pulsada (INKEY() y LASTKEY()
devuelven el mismo valor). NEXTKEY() devuelve valores para todos los
carácteres ASCII, teclas de función y combinaciónes Alt-función,
Ctrl-función, Alt-letra y Ctrl-letra.
NEXTKEY() es similar a la función INKEY(), pero difiere en un aspecto
fundamental. INKEY() extrae la tecla pendiente de la memoria intermedia
del teclado y actualiza LASTKEY() con el valor de la tecla. NEXTKEY(),
por el contrario, lee la tecla de la memoria intermedia sin extraerla y
no actualiza LASTKEY().
Como NEXTKEY() no elimina la tecla de la memoria intermedia del teclado,
puede utilizarse para sondearlo y pasar el control a una rutina que
utilice un estado de espera o función INKEY() que recoja realmente la
tecla de la memoria.
Si desea una lista completa de los códigos de INKEY() y las constantes
del fichero Inkey.ch, consulte el apéíndice de Códigos Inkey de
CA-Clipper en la gu.a de Mensajes de Error y Apííndices.
Ejemplos
. Este ejemplo introduce una tecla Esc en la memoria intermedia
del teclado y muestra seguidamente las diferencias entre INKEY(),
LASTKEY() y NEXTKEY():
#include "Inkey.ch"
//
CLEAR TYPEAHEAD
KEYBOARD CHR(K_ESC)
//
? NEXTKEY(), LASTKEY() // Resultado: 27 0
? INKEY(), LASTKEY() // Resultado: 27 27
? NEXTKEY() // Resultado: 0
Ficheros: La biblioteca asociada es EXTEND.LIB,
el fichero de cabecera es Inkey.ch.
NOSNOW()
Activa/desactiva la supresión del efecto nieve en pantalla
------------------------------------------------------------------------------
Sintaxis
NOSNOW(<lActivar/Desactivar>) --> NIL
Argumentos
<lActivar/Desactivar> es un valor l.gico que intercambia el estado
actual de la supresión del efecto nieve. Un valor verdadero (.T.) activa
la supresión del efecto nieve, y un valor falso (.F.) la desactiva.
Descripción
NOSNOW() se utiliza para suprimir el efecto en los monitores CGA.
Normalmente, NOSNOW() aparece en la secci.n de configuración de su
aplicación para permitir al usuario suprimir el efecto nieve.
Ficheros: La biblioteca asociada es CLIPPER.LIB
OS()
Devuelve el nombre del sistema operativo
------------------------------------------------------------------------------
Sintaxis
OS() --> cNombreSO
Devuelve
OS() devuelve el nombre del sistema operativo en forma de cadena de
carácteres.
Descripción
OS() es una función de entorno que devuelve el nombre del sistema
operativo que se ejecuta en la estación de trabajo actual. El valor se
devuelve como el nombre del sistema operativo seguido del número de
versi.n.
Ejemplos
Este ejemplo utiliza OS() para indicar el sistema
operativo que se ejecuta en la estación de trabajo actual:
? OS() // Resultado: DOS 3.3
Ficheros: El fichero de biblioteca asociado es CLIPPER.LIB.
OUTERR()
Escribe una lista de valores en el dispositivo de errores estándar
------------------------------------------------------------------------------
Sintaxis
OUTERR(<lista exp>) --> NIL
Argumentos
<lista exp> es una lista de valores que aparecen en pantalla. Puede
estar formada por cualquier combinación de tipos de datos, incluyendo el
tipo memo.
Devuelve
OUTERR() siempre devuelve NIL.
Descripción
OUTERR() es id.ntica a OUTSTD(), excepto en que envía la salida al
dispositivo de error estándar, en vez de al dispositivo de salida
estándar. La salida envíada al dispositivo de error estándar evita los
dispositivos de consola y de salida de CA-Clipper, as. como cualquier
redirecci.n del DOS. Normalmente se utiliza para registrar mensajes de
error de forma que no interfieran con la salida en la pantalla o
impresora estándar.
Ejemplos
. Este ejemplo muestra en pantalla un mensaje de error junto con
la fecha y hora de su producci.n:
OUTERR("Fallo de bloqueo del fichero", DATE(), TIME())
Ficheros: El fichero de biblioteca asociado es CLIPPER.LIB.
OUTSTD()
Escribe una lista de valores en el dispositivo de salida estándar
------------------------------------------------------------------------------
Sintaxis
OUTSTD(<lista exp>) --> NIL
Argumentos
<lista exp> es una lista de valores que aparecen en pantalla. Puede
estar formada por cualquier combinación de tipos de datos, incluyendo el
tipo memo.
Devuelve
OUTSTD() siempre devuelve NIL.
Descripción
OUTSTD() es una función simple de salida similar a QOUT(), excepto en
que escribe en el dispositivo STDOUT (en vez de en la consola de CA-
Clipper). Los programas con requisitos de salida muy sencillos (es
decir, sin entrada o salida de pantalla completa) pueden utilizarse con
esta función para evitar recargar los subsistemas de salida de
terminales. El fichero de cabecera Simplio.ch redefine los mandatos ? y
?? para utilizar la función OUTSTD().
Como OUTSTD() envía su salida al dispositivo de salida estándar. La
salida puede redirigirse mediante los s.mbolos de redirecci.n del DOS
(>, |), lo que permite redirigir la salida de un programa de CA-Clipper
a un fichero o un encadenamiento de mandatos. Si desea más información
sobre esta función del sistema operativo, consulte su documentaci.n del
MS-DOS.
Ejemplos
. Este ejemplo utiliza OUTSTD() para mostrar en pantalla una
lista de expresiónes:
OUTSTD(Nombre, PADR(RTRIM(Ciudad) + "," + ;
Provincia, 20), CodPost)
. Este ejemplo redirige la salida de un programa de CA-Clipper a
un nuevo fichero mediante el operador de redirecci.n del DOS (>):
C>MYPROG > FILE.TXT
Ficheros: La biblioteca asociada es CLIPPER.LIB,
el fichero de cabecera es Simplio.ch.
PAD()
Llena valores de carácteres, fechas y numéricos con carácteres de relleno
------------------------------------------------------------------------------
Sintaxis
PADL(<exp>, <nLongitud>, [<cCarRelleno>]) --> cCadenaRellena
PADC(<exp>, <nLongitud>, [<cCarRelleno>]) --> cCadenaRellena
PADR(<exp>, <nLongitud>, [<cCarRelleno>]) --> cCadenaRellena
Argumentos
<exp> es el valor de carácteres, numérico o de fechas que se va a
rellenar.
<nLongitud> es la longitud de la cadena de carácteres que se va a
devolver.
<cCarRelleno> es el carácter con el que se va a rellenar <exp>. Si
no se especifica, el valor por defecto es carácteres de espacio.
Devuelve
PADC(), PADL() y PADR() devuelven como resultado una cadena formada por
<exp> y rellenada con <cCarRelleno> hasta una longitud total de
<nLongitud>.
Descripción
PADC(), PADL() y PADR() son funciónes que rellenan valores de
carácteres, fecha o numéricos con un carácter de relleno determinado
creando una nueva cadena de carácteres con una longitud especificada.
PADC() centra <exp> dentro de <nLongitud>, a.adiendo carácteres de
relleno en los extremos izquierdo y derecho; PADL() a.ade los carácteres
de relleno a la izquierda y PADR() los a.ade a la derecha. Si la
longitud de <exp> excede <nLongitud>, todas las funciónes PAD() truncan
cCadenaRellena en <nLongitud>.
PADC(), PADL() y PADR() muestran en pantalla cadenas de longitud
variable dentro de un .rea de longitud fija. Pueden utilizarse, por
ejemplo, para asegurar una alíneaci.n determinada al utilizar mandatos
?? consecutivos. Otra aplicación es para mostrar texto en un .rea de
pantalla de anchura fija y asegurarse de que el texto anterior se
sobreescriba completamente.
PADC(), PADL() y PADR() son las funciónes inversas de ALLTRIM(), RTRIM()
y LTRIM(), que eliminan los espacios iniciales y finales en blanco de
las cadenas de carácteres.
Ejemplos
. Este ejemplo utiliza PADR() para dar formato a la
visualización de un número de registro en una línea de estado,
rellenando el espacio asignado:
IF EOF()
@ 23, 45 PADR("EOF/" + LTRIM(STR(LASTREC())), 20)
ELSEIF BOF()
@ 23, 45 PADR("BOF/" + LTRIM(STR(LASTREC())), 20)
ELSE
@ 23, 45 SAY PADR("Registro " + LTRIM(STR(RECNO()) ;
+ "/" + LTRIM(STR(LASTREC())), 20)
ENDIF
Ficheros: La biblioteca asociada es EXTEND.LIB.
PCOL()
Devuelve la columna actual del cabezal de la impresora
------------------------------------------------------------------------------
Sintaxis
PCOL() --> nColumna
Devuelve
PCOL() devuelve un valor numérico entero que representa la posición de
la .ltima columna impresa m.s uno. La posición de columna inicial es
cero.
Descripción
PCOL() es una función que informa de la posición de columna del cabezal
de la impresora después de la .ltima operación. PCOL() sólo se actualiza
si SET DEVICE TO PRINTER o SET PRINTER ON están activados. PCOL() es
similar a COL(), excepto en se aplica a la impresora en vez de a la
pantalla. PCOL() se actualiza de las formas siguientes:
. Al arrancar la aplicación, PCOL() se pone a cero
. Al ejecutar un EJECT, PCOL() se pone a cero
. Cualquier operación.de impresión hace que PCOL() tome el valor
de la posición de la .ltima columna impresa m.s uno
. La función SETPRC() permite establecer PCOL() en la posición
de columna que se especifique
PCOL() se utiliza normalmente con PROW() e imprime un valor relativo al
último valor impreso en la misma línea. Esto facilita la alíneaci.n de
columnas durante la impresi.n de un informe de columnas. Para imprimir
un valor en la siguiente columna puede especificarse su posición como
PCOL() + <desplazamiento columna>. PCOL() sólo puede alínear
correctamente los valores en columnas cuando tienen una anchura fija.
Para asegurarse de que los valores tengan una anchura fija, d. formato a
la salida mediante la función TRANSFORM(), la cláusula PICTURE del
mandato @...SAY o cualquiera de las funciónes PAD().
Notas
. C.digos de control de impresora: Al envíar códigos de
control a la impresora, PCOL() deja de estar sincronizada con la
posición del cabezal de la impresora. Aunque los códigos de control
no se imprimen, la discrepancia ocurre porque CA-Clipper cuenta todos
los carácteres envíados a la impresora, independientemente de la
forma en que .sta los trate. Para evitar la discrepancia, guarde los
valores actuales de PROW() y PCOL(), env.e los códigos de control y
utilice SETPRC() para restablecer los valores originales de PROW() y
PCOL().
. SET MARGIN: PCOL() no puede utilizarse de manera fiable en
una sentencia SET MARGIN para imprimir con un mandato @...SAY. Al
imprimir con @...SAY, el valor actual de MARGIN se a.ade siempre a la
posición de columna especificada antes de envíar la salida a la
impresora. Esto hace que el valor MARGIN se sume al de PCOL() cada
vez que se invoca el mandato @...SAY en una misma línea de impresión.
Ejemplos
. En este ejemplo, PCOL() crea un informe sencillo que imprime
una lista de nombres, direcciones y números telef.nicos de clientes:
LOCAL nLinea := 99, nPagina := 1
USE Cliente INDEX NombreCli NEW
SET DEVICE TO PRINTER
DO WHILE !EOF()
IF nLinea > 55
PaginaSup(nPagina)
nLinea := 1
nPagina++
ENDIF
@ nLinea, 10 SAY NombreCli
@ nLinea, PCOL() + 2;
SAY RTRIM(Ciudad) + ", " + RTRIM(Provincia) + CodigoPost;
PICTURE REPLICATE("X", 35)
@ nLinea, PCOL() + 2;
SAY Telefono;
PICTURE "@R (999) 999-9999"
nLinea++
SKIP
ENDDO
SET DEVICE TO SCREEN
CLOSE
Ficheros: La biblioteca asociada es CLIPPER.LIB.
PCOUNT()
Determina la posición del último parámetro real pasado
------------------------------------------------------------------------------
Sintaxis
PCOUNT() --> nPosúltimoArgumento
Devuelve
PCOUNT() devuelve, como valor entero, la posición del último argumento
pasado. Si no se pasan argumentos, PCOUNT() devuelve cero.
Descripción
PCOUNT() informa de la posición del último argumento de la lista de
argumentos pasados al invocar un procedimiento o función. Esta
información es útil para determinar si se han dejado argumentos al final
de la lista de argumentos. El valor devuelto incluye, no obstante, los
argumentos omitidos en medio de la lista.
Para determinar si un parámetro no ha recibido un valor, compruebe si su
valor es NIL. Los parámetros omitidos no se inicializan y, por tanto,
devuelven NIL al acceder a ellos. Otro m.todo es comprobar los
parámetros con VALTYPE(). Esta función permite determinar si se ha
pasado un argumento y corregir su tipo simultáneamente. Si no se ha
pasado el parámetro, puede asign.rsele un valor por defecto.
Si desea más información sobre la forma de pasar parámetros, consulte el
capítulo Conceptos Básicos de la guía de Programación y Utilidades.
Ejemplos
. En este ejemplo, una función abre un fichero de base de datos
y utiliza PCOUNT() para determinar si el procedimiento invocante ha
pasado el nombre del fichero que se va a abrir. Si no se ha pasado el
nombre, la función AbrirFichero() lo pregunta:
FUNCTION AbrirFichero( cFichero )
IF PCOUNT() = 0
ACCEPT "Fichero que se va a utilizar: " TO cFichero
ENDIF
USE (cFichero)
RETURN (NETERR())
Ficheros: La biblioteca asociada es CLIPPER.LIB.
PROCLINE()
Devuelve el número de la línea del módulo fuente de la activaci.n actual o de
cualquiera de las anteriores
------------------------------------------------------------------------------
Sintaxis
PROCLINE([<nActivaci.n>]) --> nL.neaFuente
Argumentos
<nActivaci.n> es un valor numérico que especifica la activaci.n que
se va a examinar. Cero indica la activaci.n actual, uno la activaci.n
anterior, etc. Si no se especifica, el valor por defecto es cero.
Devuelve
PROCLINE() devuelve, como valor numérico entero, el número de la .ltima
línea ejecutada en el procedimiento, función o bloque de código que se
est. ejecutando. Si la opción de compilador /L suprime la información
del número de línea, PROCLINE() siempre devuelve cero.
Descripción
PROCLINE() examina la pila de activaciones de CA-Clipper para determinar
la .ltima línea ejecutada en el procedimiento, función o bloque de
código que se est. ejecutando actualmente. La pila de activaci.n es una
estructura interna que mantiene un registro de cada invocaci.n de
procedimiento, función o bloque de código. La numeraci.n de las líneas
comienza al principio del módulo fuente original. Cada línea incluye un
comentario, una línea en blanco, una directiva de preprocesador y una
continúa.ión de línea. Una línea de varias sentencias se cuenta como una
sola línea.
En la activaci.n actual, PROCLINE() devuelve el número de la línea
actual. En una activaci.n anterior, PROCLINE() devuelve el número de la
línea que invoc. al procedimiento o función que, a su vez, invoca a
PROCLINE().
Si la activaci.n que se examina es una evaluaci.n de bloque de código,
PROCLINE() devuelve el número de línea del procedimiento en el que se
defini. originalmente el bloque de código.
PROCLINE() se utiliza con PROCNAME() para generarála información de
depuraci.n.
Ejemplos
. En este ejemplo, PROCLINE() devuelve el número de línea de la
activaci.n actual, seguido del número de línea de la activaci.n
anterior:
// Primera línea del fichero fuente
Mifunción()
RETURN
FUNCTION Mifunción
? PROCLINE() // Resultado: 6 (activaci.n actual)
? PROCLINE(1) // Resultado: 2 (activaci.n anterior)
RETURN NIL
Ficheros: La biblioteca asociada es CLIPPER.LIB.
PROCNAME()
Devuelve el nombre de procedimiento o función actual o de cualquiera de los
anteriores
------------------------------------------------------------------------------
Sintaxis
PROCNAME([<nActivaci.n>]) --> cNombreProcedimiento
Argumentos
<nActivaci.n> especifica la activaci.n que se va a examinar. Un
valor cero indica la activaci.n actual, un valor uno la activaci.n
anterior, etc. Si no se especifica, el valor por defecto es cero.
Devuelve
PROCNAME() devuelve como cadena de carácteres el nombre del
procedimiento, función o bloque de código actualmente en ejecución.
Descripción
PROCNAME() examina la pila de activaci.n de CA-Clipper para determinar
el nombre del procedimiento, función o bloque de código en ejecución. La
pila de activaci.n es una estructura interna que mantiene un registro de
cada invocaci.n de procedimiento, función o bloque de código.
En la activaci.n actual, PROCNAME() devuelve el nombre del procedimiento
o función actual. En una activaci.n anterior, PROCNAME() devuelve el
nombre del procedimiento o función que, a su vez, ha invocado al
procedimiento actual.
Si la activaci.n que se examina es una evaluaci.n de bloque de código,
PROCNAME() devuelve el nombre del procedimiento o función que defini. el
bloque precedido por una (b). Si la activaci.n que se examina es una
variable de memoria, PROCNAME() devuelve el nombre precedido de M->.
PROCNAME() se utiliza con PROCLINE() para generaráinformación de
depuraci.n.
Ejemplos
. Este ejemplo es una función definida por el usuario que puede
invocarse durante una fase de depuraci.n del programa para mostrar en
pantalla la pila de activaci.n con los números de línea:
FUNCTION ListaPila( cMensaje )
LOCAL nActivacion := 1
? cMensaje
DO WHILE !(PROCNAME(nActivacion) == "")
? "Llamada desde:", PROCNAME(nActivacion),;
"(" + LTRIM(STR(PROCLINE(nActivacion))) + ")"
nActivacion++
ENDDO
QUIT
RETURN NIL
Ficheros: La biblioteca asociada es CLIPPER.LIB.
PROW()
Devuelve la fila actual del cabezal de la impresora
------------------------------------------------------------------------------
Sintaxis
PROW() --> nFila
Descripción
PROW() devuelve un valor numérico entero que representa la posición de
la .ltima fila impresa. La posición de fila inicial es cero.
Descripción
PROW() es una función que informa de la posición de fila del cabezal de
la impresora después de la .ltima operación. PROW() se actualiza
solamente si se ha establecido SET DEVICE TO PRINTER o SET PRINTER ON.
PROW() es similar a ROW(), excepto en que se aplica a la impresora, en
vez de a la pantalla. PROW() se actualiza de las formas siguientes:
. Al arrancar la aplicación, PROW() se pone a cero
. Al ejecutar un EJECT, PROW() se pone a cero
. Cualquier operación.de impresión hace que PROW() tome el valor
de la posición de la .ltima fila impresa
. La función SETPRC() permite establecer PROW() en la posición
de fila especificada
PROW() se utiliza normalmente con PCOL() e imprime un valor relativo al
último valor impreso en la misma línea. Si la cabeza de impresión se
coloca en una nueva fila con un código de control, salto de línea
(CHR(10)) o salto de p.gina (CHR(12)), PROW() no se actualiza y, por
tanto, no devuelve el valor previsto. Para evitar esta discrepancia,
desp.es de envíar cualquiera de estos valores a la impresora debe
utilizar la función SETPRC() para reinicializar PROW() con el valor
correcto.
Ejemplos
. Este ejemplo utiliza PROW() y SETPRC() para crear un programa
sencillo de etiquetas que se imprime con @...SAY, en vez de ?:
USE Cliente INDEX NombreCli NEW
SET DEVICE TO PRINTER
SETPRC(2, 0)
DO WHILE !EOF()
@ PROW(), 3 SAY NombreCli
@ PROW() + 1, 3 SAY RTRIM(Ciudad) + ",";
+ RTRIM(Provincia) + CodigoPost
@ PROW() + 1, 3 SAY Telefono ;
PICTURE "@R (999) 999-9999"
SETPRC(2, 0)
SKIP
ENDDO
SET DEVICE TO SCREEN
CLOSE
Ficheros: La biblioteca asociada es CLIPPER.LIB.
QOUT()
Muestra una lista de expresiónes en la salida estándar
------------------------------------------------------------------------------
Sintaxis
QOUT([<lista exp>]) --> NIL
QQOUT([<lista exp>]) --> NIL
Argumentos
<lista exp> es la lista de expresiónes (de cualquier tipo, excepto
matrices o bloques de código) separadas con comas que se va a mostrar en
la consola. Si se especifica QOUT() sin argumentos, se envía a la
consola un retorno de carro/salto de línea. Si se especifica QQOUT() sin
argumentos, no se muestra nada.
Devuelve
QOUT() y QQOUT() devuelven siempre NIL.
Descripción
QOUT() y QQOUT() son funciónes de consola. Estas funciónes son las
primitivas funciónales que crean los mandatos ? y ??, respectivamente.
Igual que los mandatos ? y ??, muestran en la consola los resultados de
una o más expresiónes. QOUT() envía algunos retornos de carro/saltos de
línea antes de mostrar los resultados de <lista exp>. QQOUT() muestra
los resultados de <lista exp> en la posición actual de ROW() y COL().
Cuando QOUT() y QQOUT() muestran su salida en la consola, se actualizan
los valores de las funciónes ROW() y COL(). Si SET PRINTER est.
activado, los valores que se actualizan son los de PROW() y PCOL(). Si
se especifica una <lista exp>, tanto QOUT() como QQOUT() insertan un
espacio entre los resultados de cada expresión.
QOUT() y QQOUT() pueden utilizarse para mostrar en la consola ciertos
valores dentro de una expresión. Esto es especialmente .til en bloques
de código, funciónes de iteraci.n, como AEVAL() y DBEVAL() y en listas
de sentencias en el formato de salida de una definición de mandato.
Ejemplos
. Este ejemplo utiliza QOUT() con AEVAL() para listar en la
consola el contenido de una matriz literal:
LOCAL aElementos := { 1, 2, 3, 4, 5 }
AEVAL(aElementos, { |elemento| QOUT(elemento) })
Ficheros: La biblioteca asociada es CLIPPER.LIB.