MEMOEDIT( )

 Edita o visualiza campos memo o cadenas de caracteres

Sintaxis

     MEMOEDIT([],

        [], [],

        [], [],

        [<lModoEdición>],

        [<cFunciónUsuario>],

        [<nLongitudLínea>],

        [<nTamañoTabulador>],

        [],

        [],

        [],

        []) –> cMemoInterTexto

Argumentos

es el campo memo o la cadena de caracteres que se va a copiar en la memoria intermedia de MEMOEDIT(). Si no se especifica, la memoria intermedia de texto está vacía.

, , y 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 caracteres, sin paréntesis ni argumentos. Si se especifica falso (.F.) en este argumento, se muestra en pantalla y se termina inmediatamente MEMOEDIT(). Este argumento modifica el comportamiento automático de MEMOEDIT(). Consulte la descripción que se da a continuació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á ( – ).

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

  y definen la posición de visualización del cursor en la memoria intermedia de texto. se numera a partir de uno y 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().

  y 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 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 caracteres 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 restantes funciones 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 , ésta se copia en la memoria intermedia de texto. El usuario edita realmente la memoria intermedia. Si no se especifica , 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 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 caracteres. 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 caracteres 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 caracteres se introducen en la posición actual del cursor sobreescribiendo los caracteres 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 continuació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 continuació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 ninguna 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 visualizaciones 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 \DPXBASE5\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 DPXBASE, la inserción de caracteres 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 caracteres de espacio que hay entre las dos palabras. Al cambiar el formato del texto, se eliminan todos los caracteres 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 funciones de tratamiento de texto de DPXBASE, 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 caracteres 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 continuación.

        STRTRAN( , 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

        REPLACE ALL WITH ;

           STRTRAN( , 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 \DPXBASE5\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 caracteres 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 caracteres de DPXBASE. Esto puede hacerse mediante la función MEMOREAD(). Después de editar el contenido del fichero de texto incluido en la variable de caracteres, 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 caracteres mediante MEMOEDIT():

        LOCAL cNotas

        cNotas = MEMOEDIT()

     ¦  El ejemplo siguiente es una función que edita una cadena de caracteres 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 caracteres, 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.