Ejemplo [blowfish.prg] – Encriptar mensaje

2015-09-03_131543

 

PROCEDURE Main()

   LOCAL cText := "This is my secret message."
   LOCAL cKey := hb_blowfishKey( "Top Secret ;-)" )

   LOCAL cEncrypted

   ? "Original:", hb_StrToExp( cText )

   /* encrypt data */
   ? "Encrypted:", hb_StrToHex( cEncrypted := hb_blowfishEncrypt( cKey, cText ) )

   /* decrypt data */
   ? "Decrypted:", hb_StrToExp( hb_blowfishDecrypt( cKey, cEncrypted ) )

   RETURN

Ejemplo [array16.prg] – Array multidimensional

2015-09-02_120742

 

// Harbour multidimensional arrays support

PROCEDURE Main()

   LOCAL a := { 100, 200, "Third" }
   LOCAL b := Array( 8832 )

   ? ValType( a )
   ? ValType( { "A" } )

   AAdd( a, "new element" )
   ? Len( a )

   ? a[ 1 ]
   ? a[ 2 ]
   ? a[ 3 ]
   ? a[ 4 ]

   ? ATail( a )

   a[ 3 ] := { "this", { "seems", "to", { "work", "so", "well" } } }
   ? a[ 3 ][ 2 ][ 3 ][ 1 ] // "work"

   a[ 3, 2 ][ 3, 1 ] := "Harbour power!"  // different ways to specify the indexes
   ? a[ 3, 2, 3, 1 ]

   ? ValType( b )
   ? Len( b )

   b[ 8832 ] := "Harbour"

   ? b[ 8832 ]

   ? ATail( b )

   ASize( b, 200 )
   ? Len( b )

   b[ 100 ] := 10
   Test( b[ 100 ]++ )
   ? b[ 100 ]

   b[ 100 ] := 10
   Test( ++b[ 100 ] )
   ? b[ 100 ]

   b := { 1, { 2, { 4, 5 } } }
   Test( b[ 2 ][ 2 ][ 1 ]++ )
   ? b[ 2 ][ 2 ][ 1 ]

   b[ 2 ][ 2 ][ 1 ] := 2
   Test( ++b[ 2 ][ 2 ][ 1 ] )
   ? b[ 2 ][ 2 ][ 1 ]

   ReleaseTest()

   RETURN

STATIC PROCEDURE Test( n )

   ? n

   RETURN

STATIC PROCEDURE ReleaseTest()

   LOCAL a := { 1, 2, 3 }

   HB_SYMBOL_UNUSED( a )

   RETURN

Ejemplo [ains.prg] – Funciones para Arrays

2015-09-02_115458

 

//
// Array test AIns() / ADel() / ASize() / AFill()
//

#ifndef __HARBOUR__
#include "clipper.ch"
#endif

PROCEDURE Main()

   LOCAL aFirst
   LOCAL aSecond
   LOCAL aMore

   aFirst := AClone( { 1, 2, 4 } )
   AIns( aFirst, 3 )
   aFirst[ 3 ] := "3"
   ?? "Testing AIns() ... "
   ADump( aFirst )

   aSecond := { 1, 2, 4 }
   ASize( aSecond, 4 )
   ?? "Testing ASize() ... "
   ADump( aSecond )

   aSecond := { 1, 2, 4 }
   ASize( aSecond, 4 )
   AIns( aSecond, 3 )
   aSecond[ 3 ] := "3"
   ?? "Testing ASize() + AIns() ... "
   ADump( aSecond )

   aSecond := { 1, 2, 3, 3, 4, 5 }
   ADel( aSecond, 3 )
   ?? "Testing ADel() ... "
   ADump( aSecond )

   aSecond := { 1, 2, 3, 3, 4, 5 }
   ADel( aSecond, 3 )
   ASize( aSecond, Len( aSecond ) - 1 )
   ?? "Testing ASize() + ADel() ... "
   ADump( aSecond )

   AFill( aSecond, "!" )
   ?? "Testing AFill() ... "
   ADump( aSecond )

   aMore := { 1, 2, 3, 4, 5, 6 }
   AFill( aMore, "X", 3 )
   ?? "Testing AFill() with start ... "
   ADump( aMore )

   aMore := { 1, 2, 3, 4, 5, 6 }
   AFill( aMore, "X", 3, 2 )
   ?? "Testing AFill() with start and count ... "
   ADump( aMore )

   aMore := { { 1, 2 }, { 3, 4 } }
   ADel( aMore, 1 )
   ADump( aMore )

   RETURN

STATIC PROCEDURE ADump( aShow )

   LOCAL n

   ?? "Len=", hb_ntos( Len( aShow ) )
   ?? ": "
   FOR n := 1 TO Len( aShow )

      ?? "["
      ?? hb_ntos( n )
      ?? "]= "
      ?? ValType( aShow[ n ] )
      ?? ":"
      IF HB_ISARRAY( aShow[ n ] ) /* Iterate array */
         ?
         ?? "["
         ADump( aShow[ n ] )
         ?? "]"
      ELSE
         ?? iif( HB_ISNUMERIC( aShow[ n ] ), hb_ntos( aShow[ n ] ), aShow[ n ] )
      ENDIF

      IF n != Len( aShow )
         ?? ", "
      ENDIF

   NEXT
   ?

   RETURN

Johammer motocicleta eléctrica J1

Primera producción de motocicletas con un rango de 200 kilometros, desarrollado y producido en Austria.

Diseño: Leonie Lawniczak & Jean-Marie Lawniczak / www.yellow.at

Diseño sin compromisos

RANGO INCOMPARABLE

Una gama excepcional no surge por sí mismo. Todo lo que en última instancia sirve a los usuarios, se debe a un concepto innovador que persigue constantemente.Un Johammer no sólo se ve diferente, también se pretende a partir de cero.

CONCEPTO ÚNICO

La distancia más corta entre dos ejes es una línea recta. Sólo un motor eléctrico en un implante concepto de motocicleta convencional sería demasiado miope. Por lo tanto se ha vuelto completamente nuevas formas Johammer en muchas áreas.

construcción del marco
johammer_detail_0386

DISEÑO SIN COMPROMISOS

E-drive y el controlador están libres de mantenimiento integrado en la rueda trasera. Un avance muy especial ha tenido éxito en el desarrollo de baterías. Ningún fabricante de motocicletas en el mundo actualmente puede presumir de las áreas de e-movilidad con tales características técnicas.

CONSTRUCCIÓN NO CONVENCIONAL

El bastidor central extremadamente resistente a la torsión de aluminio tiene capacidad para amortiguadores de primavera y batería. Peso, la estabilidad y la función como una perfecta sinergia.

johammer_detail_0396
johammer_detail_0284

PROBADO NUEVA FORMULACIÓN

De dos brazos Frente sección de caja basculante con paralelos dispuestos frenado rockero par, impide buceo freno con Dämpferanlenkung progresiva. Una sola cara basculante de aluminio fundido con progresiva Dämpferanlenkung atrás.

MANEJO PERFECTO

El centro ideal de gravedad (350 mm) ofrece una comodidad de conducción óptima y una sensación de seguridad. Dirección y reposapiés permiten la adaptación individual.

manejo feature_perfektes
9655-Rear-ley

MULTIFUNCIONAL ESPEJO RETROVISOR

En dos espejos redondos los instrumentos indicadores son claramente visibles integrado. Por medio de alta resolución de 2,4 “pantalla a color se muestran claramente todo vehículo en cuestión, el estado, la alerta y la información de perturbación.

CRUCERO LIBRE DE EMISIONES

Con una bicicleta a paso ligero por el campo a la diapositiva no debe significar para asustar a los ciclistas y caminantes con ruido y sin duda no contaminar el aire.

johammer_detail_0349_feature imagen

COLORES

farbe_silber

Color blanco

Azul

Amarillo

Green

Pintura especial bajo pedido posible.

GALERÍA

ESPECIFICACIONES

DimensionesLongitud total: 2.200 mm
Altura total: 1.200 mm
Distancia entre ejes: 1.455 mm
de ángulo: 43 °
ancho manillar: 814 mm
Altura del asiento: 650 mm
Enfoque: 350 mm

DETALLES TÉCNICOS

  • Potencia continua: 11kW / pico de potencia: 16 kW
  • Transmisión: 1: 10.15
  • Permanente del motor síncrono de imán, con equipo individual, ambos se ejecutan en aceite, lubricados de por vida, libres de mantenimiento
  • freno de motor eléctrico con recuperación de energía (recuperación)
  • Enfriamiento de Aire
Johammer-J1_rechts_blau_1024x683

Fuente: Johammer.com

Todo sobre tarjetas SD y micro SD

¿Qué es una tarjeta SD?

Una tarjeta SD (Secure Digital) es una tarjeta de memoria para almacenar contenidos en dispositivos portátiles, como teléfonos móviles, cámaras digitales, tablets o navegadores GPS. Las tarjetas SD son uno de los sistemas más populares de almacenamiento de gran cantidad de información en pequeño tamaño.

Hay 3 cosas que debes tener en cuenta para comprar una tarjeta SD: su tamaño, su capacidad de almacenaje y la velocidad a la que puede copiar y transmitir los datos.

Tamaños

Hay 3 tipos de tarjeta SD según el tamaño: estándar, mini y micro.

  • Tarjeta SD (estándar): el modelo que apareció primero en el mercado, de 32 mm de alto x 24 mm de ancho x 21 mm de grosor. Es el formato más común en cámaras digitales y grabadoras de audio.
  • Tarjeta mini SD: aparecieron posteriormente y su tamaño es de 21,5 mm de alto x 20 mm de ancho x 14 mm de grosor.
  • Tarjeta micro SD: el formato más habitual en los dispositivos pequeños como teléfonos móviles o tablets. Su tamaño es de 15 mm de alto x 11 mm de ancho x 10 mm de grosor.

Los aparatos donde el usuario estará quitando y poniendo la tarjeta a menudo, como las cámaras digitales o consolas de video juegos, suelen usar tarjetas SD de tamaño estándar. Los dispositivos donde lograr reducir el tamaño es clave, como los teléfonos móviles o tablets, suelen usar tarjetas micro SD.

Tamaños tarjetas SD

Puedes utilizar una tarjeta micro SD o mini SD en un puerto para tarjetas SD estándar utilizando un adaptador. En algunos casos las mini y micro SD se venden ya conjuntamente con él. También puedes usar una tarjeta SD (más grande) en un puerto para tarjetas micro o mini SD (más pequeño) con un adaptador extensible, aunque son más difíciles de encontrar.

Adaptador tarjeta SD

Tipos y capacidad de almacenamiento

En lo que respecta a la capacidad de almacenamiento de datos, las tarjetas se clasifican también en 3 tipos que encontrarás especificados en la propia tarjeta:

  • SD SC (Standard Capacity) o simplemente SD: con capacidad para almacenar hasta 2GB de datos.
  • SD HC (High Capacity): permiten guardar hasta 32GB.
  • SD XC (eXtended Capacity): pueden almacenar hasta 2TB (2.000GB)

Hoy en día una tarjeta de 16GB suele ser suficiente para la mayoría de usos, aunque mucha gente opta por comprar tarjetas de 32GB o 64GB para ampliar la memoria de sus dispositivos.

Si quieres comprar una tarjeta de 64GB o 128GB es muy importante que compruebes en las especificaciones de tu dispositivo (móvil, tablet o cámara) que puede soportar una tarjeta de esa capacidad ya que muchos dispositivos no son capaces.

Importante: los dipositivos con puertos para tarjetas SD son sólo compatibles con tarjetas del mismo tipo o inferiores (a no ser que actualices el firmware), mientras que las tarjetas sólo son compatibles con dispositivos de su mismo tipo o superior. Por ejemplo:

  • Un dispositivo con un puerto XC permitirá tarjetas de tipo XC, HC y SC.
  • Un dispositivo con un puerto HC permitirá tarjetas de tipo HC y SC.
  • Un dipositivo con un puerto SC sólo será compatible con tarjetas SC.

Eso a la práctica significa que los dispositivos más antiguos no suelen aceptar las tarjetas SD nuevas de mayor capacidad.

Velocidad y clase

Clase

La velocidad a la que una tarjeta SD guarda los datos viene definida por su clase. Para dispositivos como cámaras digitales sencillas realmente no importa la clase de la tarjeta, tan sólo que sea compatible. Guardar ficheros de 1 o 2MB no es difícil. Sin embargo, si quieres guardar ficheros mayores, vídeos de alta definición o secuencias rápidas de fotos, la tarjeta SD debe ser lo suficientemente rápida almacenando datos.

  • Clase 2: graba 2MB por segundo, lo que sería una foto normal.
  • Clase 4: capaz de almacenar 4MB por segundo, el tamaño de un archivo MP3 con una canción.
  • Clase 6: graba 6MB por segundo (hasta aquí fácil, ¿verdad?).
  • Clase 10: graba a 10MB por segundo o más rápido (algunas pueden llegar a 90MB/segundo aunque muy pocos dispositivos necesitan esa velocidad).

La clase de una tarjeta indica la velocidad mínima a la que graba, no la velocidad real. Por ello, una buena tarjeta de clase 2 puede funcionar más rápido que una mala tarjeta de clase 6. La única forma de determinar la velocidad real de una tarjeta es mediante un test.

Encontrarás la clase como un número dentro de una gran letra C impresa en la tarjeta.

En las especificaciones de tu dispositivo verás a qué velocidad es capaz de transferir los datos a la tarjeta SD, por lo que deberías comprobar que tu tarjeta es capaz de suportar esa velocidad. Si la velocidad a la que almacena datos tu tarjeta no es suficiente para los datos que se le están transmitiendo, tu dispositivo puede presentar problemas.

Por ejemplo, una cámara de alta definición puede requerir una tarjeta de clase no inferior a 6, sufriendo cuelgues o corrupción de archivos si usas una tarjeta más lenta. Y cámaras digitales con tarjetas demasiado lentas pueden requerir de mayor tiempo de espera hasta que vuelven a estar listas para hacer la siguiente foto.

Velocidad de bus

Desafortunadamente no sólo la clase (la velocidad a la que graba) define la velocidad de la tarjeta SD. Existe otro factor que es la velocidad a la que la información se envía entre el dispositivo y la tarjeta SD. Ésa es la Velocidad de Bus.

Todas las tarjetas de clase 6 o menos utilizan un Bus Estándar, pero a partir de la clase 10 podemos encontrar el Bus de Alta Velocidad y los Buses de Ultra Alta Velocidad (Ultra High Speed) UHS-I y UHS-II. Si es el caso, verás los numerales I o II impresos en la tarjeta SD.

Las tarjetas de clase 10 con Buses de Ultra Alta Velocidad pueden ser de clase U1 o clase U3. Este último garantiza velocidades de escritura mínimas de 30MB por segundo, destinado principalmente a la grabación de vídeos con resolución 4K.

Las tarjetas SD de Ultra Alta Velocidad tan sólo están disponibles en formato HC y XC. Los dispositivos compatibles con tarjetas SD de Ultra Alta Velocidad presentan los numerales I o II en su logo:

SD UHS I

Ten en cuenta que si tu dispositivo no es compatible con Ultra Velocidad y utilizas una tarjeta U1 o U3 en él,no obtendrás velocidad adicional más allá que si estuvieras usando una tarjeta de clase 10.

Funciones extra

Protección de escritura

Casi toda tarjeta SD estándar (no las tarjetas mini o micro SD) tiene una muesca con una pestaña en la parte izquierda. Si la pestaña se encuentra en la parte superior, la tarjeta está desbloqueada y permite guardar datos. Si está deslizada hacia la parte inferior, no se puede almacenar información y tan sólo se pueden visualizar los datos que contiene.

Conexión Wi-Fi

Algunas tarjetas SD de tamaño estándar también permiten conexión Wi-Fi. Eso significa, por ejemplo, que si estás tomando fotos o vídeos con tu cámara digital y lleva una tarjeta con Wi-Fi, podrás transferirlas inmediatamente (o cuando quieras) a a tu smartphone, tablet u ordenador portátil sin necesidad de sacar la tarjeta de la cámara. Algunas incluso permiten que marques geográficamente dónde has sacado la foto para subirlas a las redes sociales como Facebook o Instagram.

Cómo comprar una tarjeta SD

Para acertar en la compra de una tarjeta SD tendrás que buscar una tarjeta que sea compatible con tu dispositivo.

Para ello, primero fíjate en el tamaño que te corresponde (estándar, mini o micro) y luego busca una tarjeta que tenga el mismo logo que tu dispositivo. Fíjate bien en el tipo que llevan impreso las tarjetas SD porque puede ser SC, HC o XC. Nota: las SC a menudo no indican nada.

Por ejemplo, imagínate que tienes un smartphone que funciona con tarjetas micro SD y que en sus especificaciones aparece este logo:

SD HC logo

Eso significa que funciona con tarjetas micro SD HC, así que deberías buscar una de ese tamaño con este logo.

En caso de encuentres varias tarjetas que cumplan estas especificaciones, escoje la capacidad (16GB o 32GB, por ejemplo) y decídete por la que sea más rápida dentro de tu prepuesto. La velocidad te la indicará la clase de la tarjeta (2, 4, 6 y 10).

La mayoría de dispositivos todavía no son completamente compatibles con las tarjetas de Ultra Alta Velocidad (UHS), así que si no es tu caso mejor que no las contemples. Sabrás si una tarjeta es UHS porque llevará el numeral I o II impreso junto a su clase U-1 o U-3. Dos ejemplos:

Tarjeta SD UHS I logos

Las tarjetas UHS funcionarán en un dispositivo no compatible con Ultra Alta Velocidad, pero son más caras y no te darán velocidad adicional. En un futuro probablemente la mayoría de aparatos electrónicos funcionen con buses de Ultra Alta Velocidad, pero por el momento están presentes sólo en las gamas más altas.

Es muy importante también que tengas en cuenta el fabricante. Evita marcas desconocidas o dudosas porque quizás no cumplan con la velocidad que indican y presenten problemas de compatibilidad. Las marcas con mejor reputación son SanDisk y Samsung, aunque Toshiba, Panasonic, Lexar Pro y Platinum II también son excelentes opciones. A menudo, una tarjeta de menor clase de un fabricante reputado te dará mayor velocidad de lectura y escritura que una tarjeta SD de clase superior pero de una marca de peor calidad.

Fuente: TarjetasSD.com

Ejemplo [achoice3.prg] – Selección

2015-09-01_112826

 

#ifndef __HARBOUR__
#include "clipper.ch"
#endif

#include "achoice.ch"
#include "inkey.ch"

/* TOFIX: Code below demonstrates an AChoice() difference between Harbour
          and Clipper it is called with the number of items in the array is
          less than number of rows determined by ( nBottom - nTop + 1 ),
          and a user function is specified for cUserFunction. In the attached
          example, a box is drawn around the area used by AChoice() to make
          it easier to see the difference in action. When cUserFunction is
          not specified, the bottom line of the box is not overwritten.
          In Clipper, the bottom line of the box is not overwritten, but
          in Harbour it is. */

MEMVAR m_aItems

PROCEDURE Main()

   LOCAL nResult

   PRIVATE m_aItems := { ;
      "Apple", ;
      "Blueberry", ;
      "Cashew", ;
      "Grape", ;
      "Hazelnut", ;
      "Jackfruit", ;
      "Kumquat", ;
      "Mulberry" }

   CLS
   @ 7, 25 TO 8 + Len( m_aItems ), 57
   IF ( nResult := AChoice( 8, 26, 8 + Len( m_aItems ), 55, m_aItems,, "HotChoice" ) ) > 0
      Alert( m_aItems[ nResult ] + " selected" )
   ENDIF

   RETURN

FUNCTION HotChoice( nStatus )  /* must be a public function */

   LOCAL nKey, cKey

   DO CASE
   CASE nStatus == AC_EXCEPT
      nKey := LastKey()
      cKey := Upper( hb_keyChar( nKey ) )
      DO CASE
      CASE AScan( m_aItems, {| c | Left( c, 1 ) == cKey } ) > 0
         hb_keyPut( K_ENTER )
         RETURN AC_GOTO
      CASE nKey == K_ENTER
         RETURN AC_SELECT
      CASE nKey == K_ESC
         RETURN AC_ABORT
      OTHERWISE
         ?? Chr( 7 )
      ENDCASE
   CASE nStatus == AC_NOITEM
      RETURN AC_ABORT
   ENDCASE

   RETURN AC_CONT

 

Ejemplo [achoice.prg] – Selección

 

2015-09-01_110829

 

// Released to Public Domain.

#include "achoice.ch"
#include "inkey.ch"

#ifndef __HARBOUR__
#include "clipper.ch"
#endif

PROCEDURE Main()

   LOCAL aPrompts := { ;
      "AGRI-PLANTS"                   , ;
      "ALAN R. SMITH GREENHOUSES"     , ;
      "ALLAN MURRAY NURSERY, INC."    , ;
      "APOPKA FOREST"                 , ;
      "LIGHT HOUSE NURSERIES"         , ;
      "BAUCOM'S"                      , ;
      "BAY HILL NURSERY, INC."        , ;
      "BAYWOOD NURSERIES"             , ;
      "BIG OAK NURSERY"               , ;
      "C & N NURSERY"                 , ;
      "CHARLES QUALITY PLANTS"        , ;
      "CONNELL FARMS"                 , ;
      "DEWAR NURSERIES, INC."         , ;
      "DIAMOND T NURSERY"             , ;
      "DISTINCTIVE PALMS NURSERIES"   , ;
      "DONKAY NURSERY"                , ;
      "DOUG INGRAM & SONS NURSERY"    , ;
      "DRIFTWOOD GARDENS, INC."       , ;
      "ELVA PLANT NURSERY, INC."      , ;
      "ERINON"                        , ;
      "EVANS NURSERY"                 , ;
      "FANCY PLANTS"                  , ;
      "FL.PLANT GROWERSCOOP"          , ;
      "FLORIDA CACTUS INC."           , ;
      "FLOWERING TREE GROWERS, INC."  , ;
      "FLOWERWOOD NURSERY"            , ;
      "FOLIAGE FACTORY TOO"           , ;
      "GATOR GROWERS NURSERY, INC."   , ;
      "GAZEBO LANDSCAPE DESIGN, INC." , ;
      "GEM ORNAMENTALS"               , ;
      "GRANNY'S GARDEN"               , ;
      "GRAY'S ORNAMENTALS"            , ;
      "GREEN MASTERS INC."            , ;
      "GREEN MEADOW NURSERY"          , ;
      "PIXLEY'S PLANT PLACE"          , ;
      "HARRISON'S NURSERY, INC."      , ;
      "G & G FOLIAGE"                 , ;
      "IVEY'S NURSERY, INC."          , ;
      "JB NURSERIES, INC."            , ;
      "JON'S NURSERY"                 , ;
      "JONES & JONES NURSERY, INC."   , ;
      "KAGER'S NURSERY"               , ;
      "KIRKLAND'S NURSERY"            , ;
      "LAND OF BROMELIADS"            , ;
      "LANDSCAPE NURSERY, INC."       , ;
      "LIEWALD'S NURSERY INC."        , ;
      "LLOYD & RINGS NURSERY"         , ;
      "LONG VAN DOUNG"                , ;
      "MAPEL'S LANDSCAPE NURSERY"     , ;
      "MILESTONE AGRICULTURE, INC."   , ;
      "MOJICA NURSERY & FRUITS"       , ;
      "NELSON'S ROSES"                , ;
      "PARK GARDENS"                  , ;
      "PAUL LUKAS INC."               , ;
      "PECKETT'S INC."                , ;
      "PENANG NURSERY, INC."          , ;
      "PINES III NURERIES"            , ;
      "PINEVIEW NURSERY"              , ;
      "POUL JENSEN NURSERY"           , ;
      "R.P. WELKER"                   , ;
      "RICHARD ROGERS NURSERY, INC."  , ;
      "SPRING HILL NURSERY"           , ;
      "T.O. MAHAFFEY, JR."            , ;
      "TUCKER NURSERY"                , ;
      "TURTLE POND NURSERY"           , ;
      "TUTTLE'S NURSERY INC."         , ;
      "VALLEY CACTUS"                 , ;
      "WHISPER WINDS, INC."           , ;
      "WHITE ROSE NURSERIES INC."     , ;
      "WOODWAY"                       , ;
      "FLORI-DESIGN"                  , ;
      "GREEN ACRES FOLIAGE, INC"      , ;
      "FLORAL EXPO"                   , ;
      "TORRES NURSERY"                , ;
      "DARRYL KOON"                   , ;
      "TRISTAR NURSERY"               , ;
      "KAY WEST NURSERY"              , ;
      "JAYMAR NURSERY"                , ;
      "J D F LANDSCAPE NURSERY"       , ;
      "DEROOSE PLANTS, INC."          , ;
      "THE TREEHOUSE"                 , ;
      "COSTELLO'S ARECAS, INC."       , ;
      "FLORICO FOLIAGE"               , ;
      "THE NATIVES"                   , ;
      "GREENS NURSERY"                , ;
      "STEWART NURSERIES"             , ;
      "G & T FOLIAGE, INC."           , ;
      "GOOD TIMES NURSERY"            , ;
      "CONCEPTS IN GREENERY, INC."    , ;
      "DUNN BROTHERS CITRUS, INC."    , ;
      "JOHN PLANK GREENHOUSES"        , ;
      "GREENER PASTURES NURSERY"      , ;
      "MULVEHILL NURSERY"             , ;
      "A NU LEAF"                     , ;
      "IVY DESIGNS, INC."             , ;
      "B & C TROPICALS"               , ;
      "SPANISH RIVER NURSERY, INC."   , ;
      "JACK CHRISTMAS & ASSOCIATES"   , ;
      "SPECIALIST GROWERS"            , ;
      "HOMRICH NURSERY, INC."         , ;
      "COUNTRYSIDE FOLIAGE, INC."     , ;
      "RFJ COMPANY"                   , ;
      "LAKE BRANTLEY PLANT CORP."     , ;
      "MARISTYME"                     , ;
      "MERISTEM NURSERY, INC."        , ;
      "TROPIC DECOR - EARL WILSON"    , ;
      "URQUHART'S NURSERY"            , ;
      "ACE PLANT NURSERY"             , ;
      "HATTAWAYS GREENHOUSE, INC."    , ;
      "Florida Plant Growers"         , ;
      "Junior Nursery"                , ;
      "Fox's Nurseries, Inc."         , ;
      "Vaughan Nursery"               , ;
      "MERRYGRO FARMS"                , ;
      "ALL SEASONS NURSERY"           , ;
      "BENCHMARK FOLIAGE"             , ;
      "SAMMY'S NURSERY"               , ;
      "SUNSHINE GROWERS"              , ;
      "Blooming-Fields Nursery"       }

   LOCAL aPermits := {}
   LOCAL x
   LOCAL nChoice
   LOCAL ncntr

   CLS

   SetColor( "GB+/B,GR+/R,,,W/N" )

   ASize( aPermits, Len( aPrompts ) )

   FOR x := 1 TO Len( aPrompts )
      aPermits[ x ] := !( "V" $ aPrompts[ x ] )
   NEXT

#define TEST1
#ifdef TEST1
   FOR ncntr := 1 TO 17
      aPermits[ nCntr ]                       := .F.
      aPermits[ Len( aPrompts ) - nCntr + 1 ] := .F.
   NEXT
   aPermits[ 32 ] := .F.
   aPermits[ 33 ] := .F.
   aPermits[ 34 ] := .F.
#endif

   nChoice := AChoice( 5, 10, 20, 70, aPrompts, aPermits, "cUserFunction" )

   SetPos( 0, 0 )
// CLS
   ? nChoice

   IF nChoice > 0
      ? aPrompts[ nChoice ]
   ENDIF
   SetPos( MaxRow() - 2, 0 )

   RETURN

//

FUNCTION cUserFunction( nMode, nCurElement, nRowPos )  /* must be a public function */

   LOCAL nRetVal := AC_CONT                // Default, Continue
   LOCAL nKey    := LastKey()

   LOCAL nRow := Row()
   LOCAL nCol := Col()

   HB_SYMBOL_UNUSED( nRowPos )

   @ 0, 20 SAY Str( nRow, 3 ) + " " + Str( nCol, 3 )

   DO CASE
      // After all pending keys are processed, display message
   CASE nMode == AC_IDLE
      @  0,  0 SAY PadR( hb_ntos( nCurElement ), 10 )
      nRetVal := AC_CONT                   // Continue AChoice()
   CASE nMode == AC_HITTOP                 // Attempt to go past Top
      @  0,  0 SAY "Hit Top   "
      // Tone( 100, 3 )
   CASE nMode == AC_HITBOTTOM              // Attempt to go past Bottom
      @  0,  0 SAY "Hit Bottom"
      // Tone( 100, 3 )
   CASE nMode == AC_EXCEPT                 // Key Exception
      @  0,  0 SAY "Exception "
      DO CASE
      CASE nKey == K_ENTER                 // If RETURN key, select
         nRetVal := AC_SELECT
      CASE nKey == K_ESC                   // If ESCAPE key, abort
         nRetVal := AC_ABORT
      OTHERWISE
         nRetVal := AC_GOTO                // Otherwise, go to item
      ENDCASE
   ENDCASE

   RETURN nRetVal