RAPID-Q
Carlos Godinho
Site de Rapid-Q
  em Português
Uma linguagem de Programação
    Basic criada por William Yu
DOCUMENTAÇÃO DE PALAVRAS CHAVES E INSTRUÇÕES
Clique em um dos botões para acessar  as  informações  correspondentes, conforme a documentação original fornecida por William Yu traduzida para o português.


Introdução aos Operadores

Os operadores executarm operações matemáticas ou lógicas com os valores. Eles normalmente são abrangidos por uma expressão. Por exemplo, 2 * 8 é uma expressão válida, e * é um operador agindo com os valores 2 e 8. O Rapid-Q pode avaliar tanto expressões INFIX como POSTFIX (RPN), mas se você quiser avaliar expressões POSTFIX, você precisará observar os casos especiais.


Operadores aritméticos:

O Rapid-Q mantém uma tabela de precedência para cada operador. O operador d emaior precedência será sempre executado antes de qualquer operador de menor precedência. Para os operadores que compartilham a mesma precedência, prevalece a lei da associatividade da esquerda para a direita. Expressões entre perêntesis (...) automaticamente têm maior precedência do que expressões fora das chaves.


  Operação  

  Operador     Precedencia     Descrição  
String index        []        1
Retorna um caractere de uma string (cadeia de caracteres)
Exemplo: s$[2] (retorna o segundo caractere da string s$)
Exponenciação        ^        1
Calcula a potência de um numero.
Exemplo: 2^6 (eleva o 2 à 6ª potência)
Negativação        -        1
Negativa o numero.
Exemplo: -99  (o numero 99 é negativado ou tornado negativo)
Multiplicação        *        2
Multiplica 2 numeros.
Exemplo: 2*6 (o numero 2 é multiplicado por 6)
Divisão de ponto flutuante        /        2
Divide 2 numeros em ponto flutuante.
Exemplo: 6.5/2.6 (o valor 6.5 é dividido por 2.6) (usa-se o ponto e não a virgula)
Divisão de inteiros        \        2
Divide 2 numeros inteiros. Antes da operação ser realizada os valores são
tornados inteiros. O resultado é truncado para um valor inteiro.
Exemplo: 6/2 (o numero 6 é dividido por 2)
Deslocamento de Bit à esquerda      SHL        2
Desloca bits à esquerda conforme a quantidade especificada.
Exemplo: 10 SHL 2 (o numero 10 tem 2 bits deslocado para a esquerda)
Deslocamento de Bit à direita      SHR        2
Desloca bits à direita conforme a quantidade especificada.
Exemplo: 10 SHR 2 (o numero 10 tem 2 bits deslocado para a direita)
Módulo/Restante      MOD        3
Retorna o resto da divisão.
Exemplo: 15 MOD 10 (o resto de 15/10 é 5)
Módulo inverso      INV        3
Retorna inverso de um numero no módulo.
Exemplo: 3 INV 26 (o inverso de 3 no [MOD 26] é 9)
Adição        +        4
Soma 2 operandos (inclusive strings).
Exemplo: 3+6 (3 mais 6 é igual a 9)
Exemplo: "hi"+"world" ("word" é adicionada a "hi" ficando "hiword)
Adição BASIC        &        4
O mesmo que '+', mantido por compatibilidade com outras linguagens como o VB
Subtração        -        4
Subtrai 2 operandos (inclusive strings).
Exemplo: 6-3 (6 menos 3 = 3) Exemplo: "jello"-"l" ("jello" menos todas as ocorrências de "l" = "jeo")
Operadores Relacionais:

Os operadores relacionais são usados para comparar 2 valores. O resultado dessa comparação será sempre "true" (não zero ou verdadeiro) ou "false" (falso ou zero). Pode-se assumir que "true" seja igual a  -1.



  Relação  

  Operadores     Precedencia     Descrição  
Igualdade        =        5
Teste de igualdade entre 2 operandos (inclusive strings).
Exemplo: 2=2 (se 2 for igual 2 o resultado é "true" senão é "false")
Desigualdade        <>        5
Teste de desigualdade entre 2 operandos (inclusive strings).
Exemplo: "hello"<>"world" (se "hello" não for igual a "world" o resultado é "true" senão é "false"
Menor que        <        5
Testa se o 1º operando é menor do que o outro (inclusive strings).
Exemplo: 2 < 10 (se 2 for menor que 10 o resultado é "true" senão "false")
Maior que        >        5
Testa se o 1º operando é maior do que o outro (inclusive strings).
Exemplo: "z" > "a" (se "z" for maior que "a" o resultado é "true" senão "false")
Menor que ou igual        <=        5
Testa se o 1º operando é menor que o outro ou igual (inclusive strings).
Exemplo: 2 <= 10 (se 2 é menor que 10 ou igual o resultado é "true" senão "false")
Maior que ou igual        >=        5
Testa se o 1º operando é maior que o outro ou igual (inclusive strings).
Exemplo: 20 >= 10 (se 20 é maior que 10 ou igual o resultado é "true" senão "false")
Operadores Lógicos:

Os operadores lógicos realizam testes sobre múltiplas relações, manipulação de bits, ou operações booleanas e retornam um "true" (verdadeiro ou diferente de zero) ou "false" (falso ou zero) para ser usado na tomada de decisão.



  Operação  

  Operador     Precedencia     Descrição  
Complemento lógico        NOT        6
Retorna o complemento (bits invertidos)
Exemplo: NOT -1 (-1 tem todos os bits setados, então NOT -1 inverte todos os bits.
Conjunção        AND        7
Compara os bits correspondentes nos 2 operandos e seta os bits correspondentes do resultado onde ambos os bits dos operandos forem 1.
Exemplo: 5 AND 3 (101 AND 011 = 1 apenas seus primeiros bits estão setados)
Disjunção        OR        8
Compara os bits correspondentes dos 2 operandos e seta o bit correspondente se (inclusive "or") 1 ou ambos os bits estiverem setados.
Exemplo: 5 OR 3 (101 OR 011 = 111 ´[7] visto que há bits setados em todas as posições)
Exclusive "or"        XOR        9
Compara os bits correspondentes nos 2 operandos e seta os bits nas posições onde apenas um bit do operando está setado.
Exemplo: 5 XOR 3 (101 XOR 011 = 110 [6] apenas os primeiros bits eram únicos)
INFIX/POSTFIX - Notação infixa/pósfixa:

As expressões, na maioria das linguagens, são expressas em notação infixa [INFIX]. O Rapid-Q preferiu a notação infixa, mas pode também trabalhar com a notação posfixa [POSTFIX] em alguns casos especiais. Exemplo de expressão infixa [INFIX]:
A = 4 * 7 + (4 - 1)^6

A notação infixa é mais fácil de usar e entender que a posfixa. De fato, a notação posfixa no Rapid-Q é simplesmente pró forma. É preferivel não usar a notação posfixa sempre que possivel.

      Exemplo de expressão posfixa [POSTFIX]:
A = (4) (7) (*) (4) (1) (-) (6) (^) (+)

As duas expressões devem resultar em 757. Como você vai notar, quando se tratar de notação posfixa, certifique-se de que todos os operandos e operadores estão entre chaves. Ao lidar com negação, você vai ter que fazer o seguinte:

      Exemplo de expressão posfixa com negação:
A = (5) (0-5) (-)
      Observe que (0-5) e (-5) retornam diferente resultados.




Definições Internas

O Rapid-Q tem estas variáveis já definidas:

    $DEFINE WIN32 WIN32
    $DEFINE UNIX  UNIX
    $DEFINE TYPE  STRUCT


WIN32 deve ser definida se estiver usando a versão do Rapid-Q para o Windows.
UNIX  deve ser definida se estiver usando a versão do Rapid-Q para Linux/Unix.
TYPE  deve ser definido para substituir o estilo antigo de TYPE

Desfazendo definições:

O termo "desfazendo" significa revertendo uma definição.
    Exemplo: 
$UNDEF TYPE
    Exemplo: 
$UNDEF TYPE

Esta é a única definição (até agora) que pode afetar seu programa quando revertida. Veja a sessão UDF "Tipos Definidos pelo Usuário" para obter mais informações.

Usando definições:

O capitulo 3 da Documentação lista vários exemplos de uso de $IFDEF e $IFNDEF:

   
$IFDEF WIN32
        PRINT 
"Estou usando a versão Windows!"
    $ELSE
         PRINT
"Estou usando a versão Linux/Unixn!"
    $ENDIF




Introdução aos Tipos de Dados [Data  Types]

Um tipo de dados é apenas uma definição. É usada para vincular uma variável à sua definição e não pode ser alterada uma vez vinculada (exceto para variáveis do tipo VARIANT). Por exemplo, se uma variável é vinculada a um tipo de dados STRING,não pode mudar para uma definição de inteiro [INTEGER]. A uma variável pode ser atribuída qualquer um desses tipos de dados suportados, BYTE,  WORD, DWORD, SHORT, LONG / INTEGER, SINGLE, DOUBLE, STRING VARIANT, e strings de comprimento fixo. Há também coisas como tipos de dados definidos pelo usuário, que serão discutidas em outra seção. Algumas implementações BASIC incluem INTEGER como um valor de 16 bits, enquanto o Rapid-Q escolheu um valor de 32 bits. Então, se você está preocupado com a conversão do código antigo, certifique-se de substituir todas as ocorrências com SHORT por INTEGER.


Como usar os tipos de dados:

Pelo Rapid-Q ser uma linguagem BASIC, há 2 maneiras de definir suas variáveis. Pode-se escolher fazer isso explicitamente usando DIM.
   
DIM meuNumero AS LONG
    DIM minhaString AS STRING


Similarmente, pode-se juntar um sufixo que define o tipo de variável:
   
meuNumero& = 234
    minhaString$ =
"abc"

O capitulo 3 da Documentação tem uma lista com esses sufixos, mas que são listados aqui também para sua conveniência:

   
Tipe      ID    Tamanho   Alcance
    ---------   -----  -------------    -------------
    Byte        ?          1             0..255
    Word      ??        2             0..65535
    Dword    ???      4             Só na versão Linux por enquanto...
    Short      %          2             -32768..32767
    Integer    &          4             -2147483648..2147483647
    Long       &          4             -2147483648..2147483647
    Single     !           4             1.5 x 1045..3.4 x 1038
    Double    #          8             5.0 x 10324..1.7 x 10308
    String      $

Um tipo de variável variant não tem sufixo, deve-se sempre usar DIM, ou mudar a operação DIM previamente definida [default].
   
$OPTION DIM VARIANT

    minhaVariavel =
"hello!"

A 'minhaVariavel' poderá ser definida como uma VARIANT desde que se tenha mudado o tipo de dado predefinido com DIM. Sempre que uma variável Rapid-Q vem sem um sufixo, ele irá escolher o tipo de dados de acordo com o BASIC tradicional.

O tipo de dado VARIANT:

A Variant é um gênero especial de tipo de dado, visto que ele pode sofrer mutação. Não tenha medo, ela não irá sofrer mutações para um vírus ou algo parecido. Ela simplesmente muda de tipo em tempo real, conforme necessário. Mesmo numa operação simples, como uma adição, quando você adiciona duas variant. Veja este exemplo:

  
DIM V1 AS VARIANT, V2 AS VARIANT

   V1 = 101
   V2 = "99.5"


  
PRINT V1+V2  '-- A saída será 200.5 (numero)

Como pode notar, V2 é originalmente definida como string, mas V2 mudou seu tipo para um número de ponto flutuante quando a adição ocorreu. Note que V2 é ainda uma string, ela apenas se alterou para possibilitar a operação. Da mesma forma:

  
DIM V1 AS VARIANT, V2 AS VARIANT

   V1 = "101"
   V2 = 99.5

   PRINT V1+V2 
'-- A saida é 10199.5 (string)

Neste caso, V2 era originalmente um número de ponto flutuante, mas mudou seu tipo durante a operação para uma string. Observe como a ordem de operação define a mutação. No exemplo anterior, V1 era um número, então V1 + V2 resulta em uma expressão numérica, enquanto o exemplo acima produz uma string.




Introdução à Ramificação - Labels, Goto, Gosub

A ramificação [Branching] parece ser muito popular em BASIC, principalmente porque nos velhos tempos, o BASIC era muito desestruturado e não levava com ele os conceitos que vemos hoje. Claro, alguns dizem que ainda não é estruturado, mas assim são um monte de outras linguagens, dependendo do seu estilo de programação. A ramificação é apenas o mecanismo que possibilita pular (jump) instruções, para a frente ou para trás. Isso é muito parecido a escrever SUBS e FUNCTIONS, apenas um pouco mais estruturado, como você verá.


O que são labels? [Rótulos]

Antes de falar sobre GOTOs e GOSUBs, precisamos entender o que os labels são. Você pode pensar neles como etiquêtas, eles não fazem nada, mas você pode usá-los como marcadores ou guias. A seguir, exemplos de labels válidos:

   
Label1:
    100
    10.5


Um label aparece sempre como a primeira declaração e pode ser qualquer número ou um nome. O label formado por um nome tem de terminar com dois pontos [:]. Depois de qualquer label, você pode escrever seu código normalmente.

    
Label1:
     PRINT
"escreva qualquer código..."
    100 PRINT
"mais código"
    10.5
     PRINT
"e ainda mais código"

A formatação acima é apenas um exemplo, isso não significa que um label com o nome não possa ter o código na mesma linha.


Ramificação com GOTO:

Talvez o mais temível sobre palavras chaves em BASIC é a declaração GOTO. Óbviamente, se você já programou em BASIC antes, GOTO foi usado em quase toda parte. Isto é porque GOTO era muito fácil de entender, e nós demos assim o primeiro salto em programação, visto que não costumávamos usar subrotinas e funções. O Rapid-Q ainda suporta GOTO, mas nós definitivamente não incentivamos o seu uso. Na verdade, se você se pegar usando-o agora não se espante, mas em alguns anos/meses você se tornará mais experiente.
Aqui está um exemplo de como usar GOTO:

   
IF I = 100 THEN GOTO 10 ELSE GOTO 20

    10 PRINT
"I = 100"
       END

    20 PRINT
"I não é 100"
       END


Se é tão terrível, há perigo no seu uso? Não. Na verdade, provavelmente é o mais puro comando que você vai encontrar. Tudo que faz é ignorar certas instruções, assim, no exemplo acima, se I = 200, então pula as linhas com o label 10:

   
10 PRINT "I = 100"
       END


GOTO não requer pilha ou consumo de memória, diferente de GOSUB e SUBS ou FUNCTIONS. Se você quer pensar sobre a arrumação do programa que é basicamente tudo que você faz; um ramo aqui outro ali não faz mal, mas desde quando consideramos o BASIC uma linguagem de alto nível, nós geralmente não gostamos de pensar desse jeito, por isso, evitamos o uso de GOTO, se possível.


Ramificação com GOSUB .. RETURN:


Usar GOSUB é realmente mais útil do que usar GOTO, mas não é recomendado. É em essência, como chamar uma SUB sem parâmetros. O que ele oferece é um "hack" rápido sem a criação de SUBs. Ele é às vezes usado em loops, como você pode ver aqui:

   
DO
      DO
        A$ = INKEY$
      LOOP UNTIL LEN(A$)

      IF A$ =
"A" THEN
          GOSUB 100
      ELSEIF A$ =
"B" THEN
          GOSUB 110
      ELSEIF A$ =
"C" THEN
          GOSUB 110
      END IF
    LOOP

    END

    100 PRINT
"A pressionado"
        RETURN
    110 PRINT
"B pressionado"
        RETURN
    120 PRINT
"C pressionado "
        RETURN

A instrução de retorno RETURN é usado para retornar para o ponto da chamada anterior de GOSUB. Você pode pensar em GOSUB como uma instrução GOTO com um marcador, e a declaração RETURN como outra declaração GOTO que retorna ao marcador.




Introdução às UDTs

Tipos definidos pelo usuário (ou UDTs) são estruturas que você pode usar na maioria das linguagens BASIC, Rapid-Q não é exceção.


Usando TYPE:

Aqui está um exemplo de tipo definido pelo usuário:

   
TYPE TPalavra
        nomeCidade(100) AS STRING
        População(100) AS LONG
    END TYPE
    DIM World AS TPalavra


Como pode ver, você pode ter arrays [matrizes de dados] dentro de UDTs. Pode também criar arrays de UDTs:
   
TYPE TPalavra
        nomeCidade(100) AS STRING
        População(100) AS LONG
    END TYPE
    DIM Campo(100) AS TPalavra


Existe atualmente um problema com o endereço de memória de seu array (dentro da UDT). Note porém que este é dificilmente notado, a menos que você vá passar uma dessas estruturas para uma DLL que exija arrays dentro de UDTs. Este problema de endereço não irá afetar o seu programa, mas é difícil de explicar (sem ficar demasiado profundo).
NOTA: só ocorre quando você cria arrays de UDTs que têm arrays dentro de UDTs. No exemplo acima não há nenhum problema de endereço desde que você não esteja criando um array de UDTs. Você poderia passá-lo com segurança para uma DLL.


Copiando UDTs:

Para copiar UDTs, apenas defina as duas:

   
TYPE TConteudo
        A AS LONG
        B AS INTEGER
    END TYPE

    DIM S1 AS TConteudo
    DIM S2 AS TConteudo

    S1 = S2


O conteúdo em S2 é copiado para S1. Já ao lidar com arrays dentro de UDTs, os arrays não são copiados, apenas referenciados. Para copiar arrays de UDTs, você vai ter que copiar manualmente cada um:

   
DIM S1(100) AS TConteudo
    DIM S2(100) AS TConteudo

    FOR I = 1 TO 100
        S1(I) = S2(I)
    NEXT



Desfazendo TYPE:

Na verdade, existem duas maneiras de criar seus tipos, com TYPE e STRUCT. STRUCT é, na verdade espelhado em TYPE, para desenganchar os dois você tem que usar $UNDEF TYPE.

   
$UNDEF TYPE

    TYPE TWorld
        nomeCidade(100) AS STRING
        População(100) AS LONG
    END TYPE

    DIM World AS TWorld


Usando TYPE e STRUCT não é a mesma coisa. Se você desenganchar os dois, TYPE agora volta a ter o estilo antigo  (versão  pré-maio 17), onde arrays de UDTs não eram permitidas. Por que iriamos querer uma versão simplificada? Bem, talvez o desempenho. O TYPE de estilo antigo carece de muitas coisas, mas compensa no desempenho, se isso for realmente necessário.




Introdução às Instruções Condicionais

As instruções condicionais oferecem a capacidade de executar código para o qual as condições são satisfeitas. Esta é provavelmente uma das primeiras coisas que você aprende na programação, além do usual.

IF .. THEN .. ELSE

Há dois modos de usar IF .. THEN .. ELSE. : Você pode colocar a sua declaração em uma única linha assim:

IF X > 100 THEN PRINT "X é maior do que 100"


Ou dividi-la assim:
:
   
IF X > 100 THEN
     
PRINT "X é maior que 100"
  
  END IF

Como você pode ver, X > 100 é uma condição, e quando esta é satisfeita o código é executado, se não, então parte do código é ignorado. A condição é satisfeita quando a expressão é avaliada como qualquer número, como diferente de zero. O que significa também que ela é válida:

  
X = 100
   IF X THEN
     PRINT
"Condição satisfeita"
   ELSE
     PRINT
"Condição não satisfeita"
   END IF


Use ELSEIF sempre que você tem várias condições para serem satisfeitas:

  
IF X > 10 AND X < 20 THEN
     
''coloque conteúdo
   ELSEIF I > 55 THEN
     
''coloque conteúdo
   ELSE
     
''coloque conteúdo
   END IF


Às vezes ajuda usar Select Case ao invés de todas estas ELSEIFs, o que abordaremos em seguida.


SELECT CASE .. END SELECT:

As Select Cases são geralmente aplicadas quando você tem um monte de condições que você deseja testar. Não são realmente úteis se você só tem 2 ou 3 condições, mas ninguém proibirá você de usá-las. Não há casos especiais na utilização de SELECT CASE no Rapid-Q, neste caso tudo que você aprendeu em QBasic pode ser implementado aqui também.

   
SELECT CASE Expressão
      CASE 1
        
''coloque conteúdo
      CASE 5
       
''coloque conteúdo
      CASE ELSE
       
''Condição não satisfeita, coloque conteúdo
    END SELECT


Provavelmente envolve menos digitação, mas há muitas outras finalidades úteis, por exemplo, testes de faixa se tornam muito mais fáceis:

   
SELECT CASE Expressão
      CASE 1 TO 4, 10 TO 20
        
''coloque conteúdo
      CASE 100 TO 150
        
''coloque conteúdo
      CASE IS > 200
        
''coloque conteúdo
    END SELECT


Como pode ver, você pode ter condições de testes múltiplos, separando cada um com uma vírgula.Você pode descobrir como a palavra chave IS é usada. (Caso Expressão > 200)



Introdução aos Loops

Os Loops fornecem um mecanismo para executar uma série de instruções um determinado número de vezes. Muitos programas envolverão loops. Os compiladores convertem loops de instruções GOTO, para que você possa implementar seus próprios loops usando os GOTOs sem quaisquer problemas. No entanto, para fins de otimização, o loop FOR... NEXT em Rapid-Q não usa esse mecanismo para economizar instruções desnecessárias. Você poderá notar que o seu loop FOR é ligeiramente mais rápido do que o seu WHILE ou DO Loop no Rapid-Q.


O loop FOR .. NEXT

Como foi mencionado anteriormente, em Rapid-Q esta estrutura de loop é otimizada, e você poderá notar uma ligeira diferença de velocidade. Existem alguns casos especiais, quando se utiliza um loop FOR em Rapid-Q, observe:

               
FOR I (1) = 1 to 100
                NEXT


Este loop não é válido em Rapid-Q. Por que não? Porque
I (1) é um array, você terá um erro de compilador. Apenas tipos simples são suportados, o que significa qualquer coisa menos matrizes. O valor de incremento padrão é 1, se você quiser um valor de incremento diferente, por favor use STEP:

                
FOR I = 1 TO 100 STEP 2
                 PRINT
I
                 NEXT


Este loop irá pular por todos os números pares, então a saída será: 1 3 5 7 9 etc ... Se por qualquer motivo você queira sair do loop, você pode usar
EXIT FOR.


WHILE .. WEND

Se você quiser testar uma condição antes de entrar no loop, você poderia usar um loop
WHILE .. WEND. Não há casos especiais, quando utilizar este ciclo, é exatamente como no QBasic:

               
WHILE I < 100
                
I ++          '-- Incrementa I
                WEND

        
É muito semelhante ao
DO .. LOOP , exceto que a expressão é testada antes de entrar no loop. Para sair do loop WHILE ..  WEND por qualquer motivo, você pode usar Exit While.


DO .. LOOP

Um simples
DO .. LOOP sem qualquer expressão de teste se repetirá indefinidamente:

               
DO
               PRINT
"Alô mundo ! "
                LOOP


Para sair do
DO .. LOOP , você usa EXIT DO . Loops infinitos não são muito utilizados na programação Windows. Você geralmente quer uma expressão de teste como no nosso loop .. WEND , a não ser que o coloquemos de forma diferente:

             
DO
             
I ++
              LOOP UNTIL
I >;= 100

Ao contrário do QBasic ou de outras linguagens BASIC, o Rapid-Q não oferece
DO WHILE ou WHILE LOOP . Eles são basicamente inúteis (ou seja, eles podem ser implementados de outra maneira), exceto para fornecer aos usuários mais opções. Por exemplo, esta opção é válida em QBasic e não em Rapid-Q:

              
DO
              LOOP WHILE
I < 100

O qual é equivalente a:

             
DO
              LOOP UNTIL I >= 100





Introdução aos Métodos


Há muitas definições de um "método", mas por falta de uma palavra melhor, é essa que estou usando para descrever o
  método CONSTRUCTOR, CREATE e WITH . Sozinhos, eles não servem de nada, mas você vai aprender o que cada um faz, e como usá-los.


CREATE .. END CREATE

Usar CREATE é o mesmo que usar DIM.

            
CREATE Form AS QForm
             END CREATE


            
''é o mesmo que...

            
DIM Form AS QForm

No entanto, o método CREATE oferece mais. Ele pode lhe salvar de uma longa digitação, e também fazer o visual do seu código ficar mais limpo por incorporar CREATEs (consulte o Capítulo 5). Qualquer código que você digitar entre CREATE .. END CREATE é automaticamente vinculado ao objeto. Uma vez que não há nenhum ponto a acrescentar ao que já foi mencionado, consulte o Capítulo 5 para obter alguns exemplos.


WITH .. END WITH

O construtor  WITH  fornece ao desenvolvedor uma maneira mais fácil de referenciar propriedades, métodos e eventos de certos objetos. Basicamente o que ele faz é evitar um monte de digitação:

           
Form.Caption = "Alô"
            Form.height = 50
            Form.left = 10
            Form.ShowModal

           
'' Usando WITH...

           WITH Form
         
.Caption = "Alô"
         
.height = 50
         
.left = 10
         
.ShowModal
          END WITH


Você também pode incorporar declarações  WITH .. END WITH dentro de outras:

         
WITH AlgumaCoisa
               WITH OutraCoisa
                   
. Caption = "Alô"
               END WITH
          END WITH


Como você pode ver, a declaração WITH herda a declaração anterior. O ponto à esquera diz ao compilador para vincular essa variável à declaração WITH. Qualquer coisa que não começa com um ponto não será vinculado, não se preocupe números decimais não serão vinculados.


CONSTRUCTOR .. END CONSTRUCTOR

Este método é usado somente dentro de uma declaração
TYPE quando você está definindo seus próprios objetos. Ele vai dar valores padrão para as propriedades, sempre que o componente é criado.


         
TYPE NovoObjeto EXTENDS QObject
                Left AS INTEGER
                CONSTRUCTOR
                     Left = 50
                END CONSTRUCTOR
          END TYPE


Não há nada mais a dizer sobre ele, é muito parecido com o método CREATE, exceto que o nosso objeto neste caso é NovoObjeto.




Introdução às Procedures(Procedimentos)


Uma procedure em
BASIC é uma SUB ou uma FUNCTION (ou, SUBI e FUNCTIONI.) É funcionalmente o mesmo que GOSUB e RETURN , mas introduz o conceito de parâmetros e valores de retorno. Diferente do QBasic, uma função também pode ser chamada como uma SUB. Você pode ignorar o seu valor de retorno.


DECLARE SUB

Use
DECLARE SUB sempre que precisar fornecer uma declaração antecipada antes de realmente escrever o SUB.

          
DECLARE SUB Test

           CALL Test

           SUB Test
                
'' Preencha...
           END SUB


Usar
CALL para chamar a sub-rotina é estritamente opcional. (Veja abaixo) No exemplo acima, estamos fornecendo uma declaração antecipada da SUB Test. Para evitar o uso de DECLARE SUB, poderiamos ter escrito a SUB Teste antes de chamá-la. Veja:

          
SUB Test
                
'' Preencha...
           END SUB

          Test 
"Sem o CALL.

Desta forma, você não precisa usar
DECLARE SUB , embora usá-la seja mais elegante e ordeiro. Usando-a os nomes dos parâmetros na DECLARE SUB e na declaração no início da SUB devem ser exatamente iguais! Observe este exemplo errado:

          
DECLARE SUB Test ( A AS INTEGER, B AS INTEGER)

           SUB Test (
X AS INTEGER, Y AS INTEGER)
                PRINT
X ;" "; Y
           END SUB


Os nomes das variáveis foram alterados! Isto porque, quando você definiu a
DECLARE SUB , os nomes dos parâmetros foram fixados como A e B. O melhor para evitar esse problema é que você pode confortavelmente fazer o seguinte:

           
DECLARE SUB Test (A AS INTEGER, B AS INTEGER)

            SUB Test
                  PRINT A;" ";B
            END SUB


Isto é perfeitamente válido, pois você já declarou a sua rotina com os parâmetros A e B. Você realmente não precisa definir os parâmetros novamente se você já tem uma declaração antecipada. Mas como isso pode gerar alguma confusão, não é recomendado.


Passando variáveis por referência

Há duas maneiras de passar variáveis por referência. Ao contrário de outras linguagens BASIC, Rapid-Q assume que todos os parâmetros são passados por valor, a menos que explicitamente especificado. Para fazer isso, você pode anexar a palavra-chave ByRef na frente de sua lista de parâmetros. Aqui está um exemplo:

         
SUB StrCat (BYREF Fonte AS STRING, Texto AS STRING)
                 Fonte = Fonte + Texto
           END SUB

           A$ =
"Alô"
           StrCat A$,
"mundo!"
           PRINT A$            
  '-- retorna "Alô mundo!"

Outra maneira é colocar o símbolo '@' na frente da variável:

          
SUB StrCat (Fonte AS STRING, Texto AS STRING)
                 Fonte = Fonte + Texto
           END SUB

           A$ =
"Alô"
           StrCat @A$,
"mundo!"
           PRINT A$            
  '-- retorna "Alô mundo!"


FUNCTIONs versus SUBs

A única diferença entre uma
FUNCTION e uma SUB é que uma FUNCTION  retorna um valor e a SUB não.

         
FUNCTION Test AS INTEGER
              Test = 123
              Result = 123
          END FUNCTION


         
Rval% = Test "Chama e pega o valor retornado.

Nossa função "Test" retorna um inteiro, como podemos ver claramente retorna 123. Para retornar um valor, você pode usar o nome da função ou usar a palavra chave
Result . Só porque você anexa um valor de retorno para a função, ela não termina automaticamente, até que chegue a; FUNCTION END. Então você pode realmente atribuir vários valores de retorno como desejar, sem conseqüências. O último valor de retorno atribuído acabará por ser o único resultado da FUNCTION . Para sair de uma FUNCTION ou SUB , é só usar Exit Function ou Exit Sub respectivamente. Um caso especial em usar SUBs ou FUNCTIONs em Rapid-Q é que você só pode passar no máximo 10 parâmetros. QObjects, Arrays, UDTs e variantes são passados por referência, todo o resto é passado por valor. Para que o Rapid-Q reconheça que você quer passar uma variável por referência, você deve anexar um símbolo @ na frente da variável, ou usar ByRef na sua lista de parâmetros. Consulte o Capítulo 3 seção 5 para mais informações.


SUBI e FUNCTIONI

Há um capítulo inteiro reservado para estes dois métodos de procedures. Não são realmente tão complicados, mas são muito úteis para uso. Eles fornecem ao programador parâmetros infinitos sem verificação de tipo. Apenas tipos simples, como números e strings podem ser passados, não Arrays, UDTs ou QObjects. Consulte o Capítulo 9 para todos os detalhes.




Resolução de Problemas

Como depurar seus programas
Na maioria dos casos, o que ocorre é um erro de digitação, ou você está tentando usar uma função que não é suportada no Rapid-Q. Isso é o que ocorre na maioria das vezes quando você não está usando
$TypeCheck ON. A menos que você já tenha usado o Rapid-Q por algum tempo, eu o encorajo a sempre ativar essa directiva. O Rapid-Q tem um mecanismo de verificação muito pobre o que exige do programador escrever um código correto. Por exemplo:

PRINT SPC (10)

SPC não é suportado no Rapid-Q (em QBasic, SPC apenas ignora espaços). Se
$TypeCheck não estiver ativado, a linha do exemplo é perfeitamente válida. SPC será considerado uma variável, inicializado a 0, e (10) não terá nenhum efeito (ou seja, o número 10 é empurrado na pilha, mas nenhuma operação será feita), então a saída acima será 0.

Passando variáveis por referência
Apenas QObjects, matrizes e variantes são passados por referência, todas as outras variáveis são passadas por valor. Para passar uma variável por referência você pode especificar explicitamente isso adicionando ByRef à sua lista de parâmetro, ou preceder com o símbolo @ para todas as variáveis que você deseja passado por referência ao chamar a função. Não use o símbolo @ para Arrays, variantes, ou& QObjects uma vez que já são passados por referência por padrão. Leia mais sobre isso no Capítulo 3 ou Apêndice C.
Procedures (procedimentos). Typechecking (verificação de tipo) é feito apenas para Arrays, variantes, e QObjects, visto que você não pode passar um array de integers (inteiros) para uma SUB que espera uma matriz de doubles (duplos). Você deverá receber uma mensagem de erro se você tentar isso, no entanto, para todas as outras variáveis que são passadas por valor, nenhuma verificação é feita. O que significa que você pode facilmente passar um inteiro para uma SUB esperando uma string. Então, tome cuidado você deve saber o tipo de parâmetros para a sua SUB / FUNCTION, uma vez que Rapid-Q não vai indicar esse erro. Também, se você tem DECLARE SUBS, certifique-se de que a sua SUB tenha correspondência de parâmetros, incluindo correspondencia do parâmetro nome.

Usando recursos não documentados
O Rapid-Q tem algumas características não documentadas, a maioria das quais estão em fase beta. Você pode imbutir SUBS ou FUNCTIONS, mas só pode haver um nível de profundidade, e há algumas conseqüências com esse uso. Se você não sabe o que é uma SUB embutida observe este exemplo:

SUB MinhaSub
      DIM I AS INTEGER

      SUB MinhaSubImbutida (X AS INTEGER)
        DIM N AS DOUBLE

        PRINT "Na Sub Imbutida"
      END SUB

      CALL MinhaSubImbutida(100)
    END SUB


Há alguns problemas especiais envolvidos, porque todas as variáveis são locais para as SUBs que seguem. Significando que a variável
I é local para a SUB MinhaSubImbutida. Além disso, como o Rapid-Q na verdade não limpa as coisas, você pode chamar MyChildSub em seu programa principal também. Este é um problema em que estou trabalhando para corrigir quando eu encontrar; tempo. Uma outra característica que pode interessar as pessoas é postfix + + e --

DIM I AS INTEGER

    I++       
'-- o mesmo que I = I + 1
    I--         
'-- o mesmo que I = I - 1
    I -= 10  
'-- o mesmo que DEC(I, 10)
    I += 15  
'-- o mesmo que INC(I, 15)

Matrizes são um caso especial, alguma coisa como, Arrays podem ser incrementadas / decrementadas. O Rapid-Q não faz nenhuma otimização, de modo que o código dado acima e a equivalência executam exatamente igual.

Outros erros
Se você não tem uma pista sobre o que está causando falhas em seus programas, sua única esperança é colocar várias instruções PRINT em seu programa e de forma incremental ir verificando cada bloco de código para ver se ele funciona corretamente. Se você estiver usando Unix ou Linux, tente usar gdb, às vezes ele vai dar algumas informações úteis, mas na maioria das vezes não é realmente útil neste tipo de configuração.



As variáveis internas são apenas de leitura (exceto SCREEN.CURSOR e SCREEN.CURSORS). Unix, quer dizer Linux e Unix.


  Variáveis   Suportadas   Tipo   Descrição
  CommandCount   Windows   Unix   INTEGER Numero de parâmetros da linha de comando recebidos.
  Command$()   Windows   Unix   ARRAY Array de comandos recebidos (os comandos são separados por espaços), o primeiro elemento inicia em 1. O elemento numero zero é o path/name (nome/caminho) de seu aplicativo.
  CurDir   Windows   Unix   STRING Retorna o diretório de trabalho atual de sua aplicação.
  IsConsole   Windows   Unix   INTEGER Retorna um número diferente de zero se a aplicação é um console, 0 caso contrário.
  MouseX   Windows   INTEGER Retorna a coordenada X do ponteiro do mouse em relação à sua forma ativa. Esta função está sendo abandonada.
  MouseY   Windows   INTEGER Retorna a coordenada Y do ponteiro do mouse em relação à sua forma ativa. Esta função está sendo abandonada.
  ParamStrCount   Windows   Unix   INTEGER Retorna o número de parâmetros String recebidos. Esta variável é usada apenas dentro de uma declaração SUBI ou FUNCTIONI.
  ParamStr$()   Windows   Unix   ARRAY Usado apenas dentro de uma declaração SUBI ou FUNCTIONI. Retorna o valor do parâmetro string, primeiro elemento a partir de 0.
  ParamVal()   Windows   Unix   ARRAY Usado apenas dentro de uma declaração SUBI ou FUNCTIONI. Retorna o valor do parâmetro numérico, primeiro elemento a partir de 0.
  ParamValCount   Windows   Unix   INTEGER Retorna o número de parâmetros numéricos recebidos. Esta variável é usada apenas dentro de uma declaração SUBI ou FUNCTIONI.
  Screen.ConsoleX   Windows   Unix   INTEGER Retorna o máximo de colunas da tela de console, uso pleno em Unix.
  Screen.ConsoleY   Windows   Unix   INTEGER Retorna o máximo de linnas da tela de console, uso pleno em Unix.
  Screen.Cursor   Windows   INTEGER Mudar ponteiro global do mouse.
  Screen.Cursors   Windows   ARRAY de   INTEGER Array de leitura/escrita de manuseio de cursores.
  Screen.Height   Windows   INTEGER Retorna a altura da tela do Windows (não confundir com Form Height)
  Screen.MouseX   Windows   INTEGER Retorna a coordenada X do ponteiro do Mouse relativo à tela.
  Screen.MouseY   Windows   INTEGER Retorna a coordenada Y do ponteiro do Mouse relativo à tela.
  Screen.Width   Windows   INTEGER Retorna a largura da tela do Windows.
  Stack.Int()   Windows   Unix ARRAY Retorna o parâmetro inteiro mais atual da pilha. Primeiro elemento a partir de 0. Esta função é obsoleta.
  Stack.Str$()   Windows   Unix   ARRAY Retorna o parâmetro inteiro mais atual da pilha. Primeiro elemento a partir de 0. Esta função é obsoleta.



A maioria destas tem a mesma funcionalidade que em QBasic, assim, você poderia facilmente encontrá-las lá. Mais uma vez, Unix, quer dizer Linux e Unix. As seguintes palavras chave são todas englobadas no objeto CONSOLE, assim Console.PRINT é o mesmo que PRINT.
  Palavra Chave   Console   Suportadas Descrição
  CLS   Instrução   Windows/Unix     Limpa a tela do console de todo o texto, e preenche o console com a cor de fundo. CLS também retorna o cursor para a posição inicial no canto superior esquerdo da tela.

  Síntaxe: CLS

           CLS

Detalhes: No Windows, o CLS é uma declaração CONSOLE, sob Linux / Unix, CLS é implementado como um sistema de chamada para limpar, então você pode seguramente chamar CLS sem compilar como CONSOLE em Linux / Unix.
  COLOR   Instrução   Windows/Unix     Define as cores de exibição atuais para a tela do console.

           Primeiro plano é a cor do texto (intervalo = 0-31)
           Plano de fundo é a cor da tela (amplitude = 0-7)

0 = preto      4 = red             8 = cinza             12 =   vermelho claro
1 = azul        5 = magenta    9 = azul claro      13 =  magenta claro
2 = verde     6 = cinza        10 = verde claro   14 =  amarelo
3 = cyan       7 = branco     11 = ciano claro   15 = branco brilhante

  Síntaxe:
COLOR [primeiro plano][,plano de fundo]

                  COLOR 15
                  COLOR 10, 3
                 COLOR  ,1
                 COLOR 
  CONSOLE.INP-
  UTHANDLE
  Instrução   Windows   Retorna o identificador de saída do console para uso em chamadas de API.

Síntaxe:CONSOLE.INPUTHANDLE
                 hnd = CONSOLE.INPUTHANDLE
  CONSOLE.OUT-
  PUTHANDLE
  Instrução   Windows   Retorna o identificador de saída do console para uso em chamadas de API.

Síntaxe:CONSOLE.OUTPUTHANDLE
                 hnd = CONSOLE.OUTPUTHANDLE
  CSRLIN   Função   Windows/Unix     Retorna a linha atual da posição do cursor.

Síntaxe:CSRLIN
                 Row% = CSRLIN
  GET$   Função   Windows/Unix     Esta função é utilizada principalmente em programas de CGI, mas pode ser usado como uma função de leitura de propósito geral. Ele irá ler o STDIN.

Síntaxe: GET$(expressão numérica)
                 A$ = GET$(10)


Detalhes: GET$ sob Linux / Unix não é uma função console. Para usar GET$, compile sua aplicação como CONSOLE ou CGI no Windows.
  INKEY$   Função   Windows/Unix     Retorna uma string de um ou dois bytes contendo um caractere lido da entrada padrão. (console). Uma string vazia é retornada se nenhum caractere estiver esperando lá.

Síntaxe: INKEY$
                A$ = INKEY$


Detalhes: Teclas extendidas começam com CHR $(27)  e têm 2 bytes de comprimento. As teclas extendidas são as teclas de seta, page up/down, home, end, insert, delete, e F1-F12. Você também pode prender o shift, ctrl, alt, caps/lock, num/lock, scroll/lock no Windows.

  INPUT   Função   Windows/Unix     Lê uma linha inteira da entrada. Esta declaração faz com que o programa faça uma pausa e espere pelos dados até que o Enter seja pressionado.

Síntaxe: INPUT ["string"{;|,}] variável
                 INPUT A$
                 INPUT "Seu nome: "; A$

Detalhes: INPUT para Rapid-Q não é exatamente compatível com o INPUT do QBasic. É mais como LINE INPUT. A variável de retorno pode ser uma string ou variável numérica. No Windows, INPUT é implementado como uma função de CONSOLE. Em Linux/Unix INPUT não é considerada uma função CONSOLE por isso não há necessidade de compilar como CONSOLE.

  LOCATE   Instrução   Windows/Unix     Move o cursor para uma posição especificada.

Síntaxe: LOCATE [linha][,coluna][,cursor]
                 LOCATE 10, 1
                 LOCATE ,10
                 LOCATE 5
                 LOCATE 1,,80


Detalhes: No Windows você pode assumir que a linha 25 é a última linha e coluna 80 é a última coluna. Em Linux/Unix, isso depende do seu terminal, mas você pode usar; as variáveis internas e Screen.ConsoleX Screen.ConsoleY para  determinar  a  coluna  máxima e linha respectivamente. A primeira linha e primeira coluna começa sempre (1,1). O argumento cursor é opcional, e pode tomar uma gama de valores de 0 a 100 indicando o percentual da célula de caracteres que é preenchido pelo cursor. ie. especificando o valor 0 oculta completamente o cursor. O valor padrão de cursor é 1.
  PCOPY   Função   Windows   Copia uma pagina da tela para outra.

Síntaxe:PCOPY páginaOrigem, páginaDestino
                PCOPY 0, 1
                PCOPY 1, 5


Detalhes: A página visível é sempre a página 0. Existem 7 páginas fora da vista (1-7). Você pode copiar a partir de qualquer página para qualquer outra página.
  PEEK   Função   Windows   Retorna o par caractere/atributo atual armazenado em um local especificado na tela do console.

Síntaxe: PEEK([#numeroPágina,] endereço)
                A% = PEEK(2000)
'-- Copía o endereço 2000 na página corrente
                A% = PEEK(1, 2000) '-- Copía o endereço 2000 na página 1
Detalhes: Para entender como calcular o endereço, use esta função útil:

        
Char$ = CHR$(PEEK((Row%-1)*160+(Col%-1)*2))
        Attr = PEEK((Row%-1)*160+(Col%-1)*2+1)


Como você pode notar, todos os endereços pares de memória contêm o caractere, e todos os endereços ímpares contêm o atributo. O atributo contém informações sobre o primeiro plano e cor de fundo.

        planodeFrente% = Attr AND &HF
        planodeFundo% = Attr SHR 4


Porquê todos esse problema? Isso foi implementado para compatibilidade com QBasic. A única diferença é que você não deve usar DEF SEG sob Rapid-Q, e PEEK só funciona no nível console.

  POKE   Instrução   Windows   Escreve um byte na página do console.

Síntaxe: POKE [#pagenum,] endereço, byte
                
POKE 2000, ASC("A")
'-- Escreve um caractere "A" no endereço 2000
                
POKE 2001, 95
'-- Escreve o atributo 95 no endereço 2000
                
POKE 1, 2001, 95
'-- O mesmo que acima mas escreve na página 1

Para entender como calcular o endereço, use esta função útil:

       
CarEnderço = (Row%-1)*160+(Col%-1)*2
       AtrEndereço = (Row%-1)*160+(Col%-1)*2+1


Como você pode notar, todos os endereços de memória pares contêm o caractere, e todos os endereços ímpares contêm o atributo. O atributo contém informações sobre o primeiro plano e cor de fundo. Para calcular o atributo, tente o seguinte:

        Attr = (PlanodeFundo% SHL 4) OR PrimeiroPlano%

Porquê todo esse problema? Isso foi implementado para compatibilidade com o QBasic. A única diferença é que você não deve usar
DEF SEG sob Rapid-Q, e POKE só funciona no nível console.

  POS   Função   Windows/Unix     Retorna a posição horizontal (coluna) atual do cursor.

Síntaxe: POS(0)
               
Coluna% = POS(0)
Detalhes: Note que eu não fiz essa função por fazer (ou seja, sua sintaxe estranha), ela foi implementada para compatibilidade com o QBasic.

  PRINT   Instrução   Windows/Unix     PRINT faz sair os dados para a tela (ou saida padrão).

Síntaxe:   PRINT [#páginaNum,][expressões] [ { ;|, } ]
                PRINT
"Number: "; 45
                PRINT A$
                PRINT #1,
"This prints to screen page 1"

Detalhes: Expressões pode ser qualquer string, número ou função. Você pode, opcionalmente, utilizar ou, para imprimir mais expressões. Em QBasic, PRIN T pode formatar os seus dados se você usar a vírgula, no entanto, sob Rapid-Q a vírgula e ponto e vírgula tem o mesmo efeito. No Windows, PRINT é implementado como uma função CONSOLE. Em Linux/Unix você não precisa compilar como CONSOLE.

  SCREEN   Função   Windows   Retorna o caractere ASCII ou o atributo em (linha, coluna) na tela do console atual.

Síntaxe:SCREEN(linha, coluna [, sinalCor])
                A% = SCREEN(1, 1)
'-- Obtém o caractere localizado na linha 1 e coluna 1.
                A% = SCREEN(5, 3, 1) '-- Obtém o atributo do caractere localizado na posição (5,3)

Detalhes: A função SCREEN é muito semelhante à função PEEK, exceto que é muito mais mais fácil de usar. Se você fornecer a função com um parâmetro colorflag (indicador de cor), a função retorna o atributo (isto é a cor), caso contrário, retorna o; caractere ASCII. A função SCREEN só funciona na tela do console atual e não em todas as páginas escondidas.
  SETCONSO-
  LETITLE
  Instrução   Windows   tSetConsoleTitle é implementado como uma chamada WinAPI para SetConsoleTitle mas é chamado como uma declaração, em vez de uma função (ou seja, nenhum valor de retorno). Se você gostaria de um valor de retorno, você vai ter que chamar a função API diretamente.

Síntaxe: SETCONSOLETITLE string-expressão
                 SETCONSOLETITLE
"Alô Mundo!"
  SLEEP   Instrução   Windows/Unix     Suspende a execução do aplicativo de um determinado período de tempo.

Síntaxe: SLEEP segundos
                 SLEEP .5
'-- Atraso de meio segundo

Detalhes: SLEEP requer um parâmetro, ao contrário do QBasic. SLEEP espera até que o número de segundos especificado tenha passado. Você não pode sair dele apertando uma tecla (ao contrário do QBasic). No Windows, o retardo é implementado como uma função console. Em Linux / Unix, você não precisa compilar como CONSOLE.



A maioria destas palavras tem a mesma funcionalidade que no QBasic, assim você poderia facilmente encontrá-las lá. Mais uma vez, quando me refiro ao Unix, quero dizer Linux e Unix.

  Palavra Chave   Tipo   Suportadas Descrição
  ABS   Função
  matemática
  Windows/Unix    Função matemática que retorna o valor absoluto de uma expressão numérica.


Síntaxe: ABS(expressão numérica)
                 A% = ABS(-123)


Detalhes: O valor absoluto da função retorna o valor sem o sinal, de seu argumento. Então, ABS (-1) e ABS (1) são ambas 1.
  ACOS   Função
  matemática
  Windows/Unix   Função matemática que retorna o arco cosseno de uma expressão numérica.

Síntaxe:ACOS(expressão numérica)
                D# = ACOS(0.55)
Detalhes: Expressão numérica que está na faixa de -1 a 1.
  ASC   Função
  matemática
  Windows/Unix   Função de processamento de string que retorna um valor numérico que é o código ASCII para o primeiro caractere em uma expressão string.

Síntaxe:>ASC(expressão string)
                 A% = ASC("A")
  ASIN   Função
  matemática
  Windows/Unix   Função matemática que retorna o arco seno de uma expressão numérica.

Síntaxe:ASIN(expressão numérica)
                D# = ASIN(0.55)


>Detalhes: Expressão numérica que está na faixa de  -1 a 1.
  ATN/ATAN   Função
  matemática
  Windows/Unix   Função matemática que retorna o arco tangente de uma expressão numérica.

Síntaxe: ATN(expressão numérica)
                 D# = ATN(0.9)


Detalhes: Expressão numérica que retorna o ângulo expresso em radianos.
  BIN$   Função de
  conversão
  Windows/Unix   Função de conversão para binário que irá converter qualquer número inteiro positivo em sua representação binária.

Síntaxe: BIN$(expressão numérica)
                S$ = BIN$(123)


Detalhes: Números negativos não são suportados, e por isso os resultados não estão definidos.
  BIND   Função de
  ponteiro
  Windows/Unix   BIND irá vincular uma variável como um ponteiro de função.

Síntaxe 'Vincula uma variável a uma função
               DECLARE SUB minhaFuncao(X AS INTEGER)
               
'Vincula A% a minhaFuncao

Detalhes: Para chamar esta função de ponteiro use CALLFUNC.
  CALLBACK
  CODEPTR
  Função de
  endereçamento
  Windows   CODEPTR (ou CALLBACK) retornará o endereço absoluto de uma SUB ou FUNCTION.

Síntaxe:CODEPTR(MySUB)
                SUB MySUB
                END SUB
                A& = CODEPTR(MySUB)


Detalhes: Use esta função para fazer CALLBACK de rotinas. Nem todos os casos estão implementados, os resultados podem variar dependendo do CALLBACK e do tipo de parametros que ele recebe.
  CALLFUNC   Função de
  ponteiro
  Windows/Unix   CALLFUNC executará a função de ponteiro que foi vinculada usando BIND.

Síntaxe: CALLFUNC(fptr, param1, param2, ...)
                 CALLFUNC(FPtr, 10, 20)
                 PRINT CALLFUNC(FPtr2, 10, 20)


Detalhes: Use esta função para as rotinas CALLBACK. Nem todos os casos são implementadas, os resultados podem variar dependendo do CALLBACK e do tipo de parâmetros que recebe.
  CEIL   Função
  matemática
  Windows/Unix   Função matemática que arredonda para cima uma expressão numérica em direção ao infinito positivo

Síntaxe: CEIL(expressão numérica)
                A% = CEIL(66.2)
'-- Retorna 67
  CHDIR   Declaração
  do sistema
  Windows/Unix   CHDIR muda o diretório de trabalho atual para o que for indicado.

Síntaxe:CHDIR expressão string
                CHDIR "c:\windows"
  CHR$   Função string   Windows/Unix   Função de processamento de string que retorna uma string de um caracter cujo código ASCII é o argumento.

Síntaxe:CHR$(expressão numérica)
                A$ = CHR$(66)


Detalhes: A expressão numérica deve estar na faixa de 0-255.
  CINT   Função de
  conversão
  Windows/Unix   Função de conversão que converte uma expressão numérica para um inteiro arredondando a parte fracionária da expressão.

Síntaxe:CINT(expressão numérica)
                A% = CINT(66.7)


'igual 67

Detalhes: Implementado para compatibilidade com o QBasic, você pode usar a função mais lógica, ROUND, em seu lugar.
  CLNG   Função de
  conversão
  Windows/Unix   A função de conversão que converte uma expressão numérica para um inteiro arredondando a parte fracionária da expressão.

Síntaxe:CINT(expressão numérica)
                A% = CINT(66.7)
'igual 67

Detalhes: Implementado para compatibilidade com o QBasic, você pode usar a função mais lógica, ROUND, em seu lugar.
  CONST   Instrução   Windows/Unix   Uma declaração não-executável que declara constantes simbólicas para usar no lugar de valores numéricos ou strings.

Síntaxe: CONST constanteNome [ as Datatype ] = expressão
                CONST False = 0
                CONST True AS LONG = NOT False
                CONST A$ = "Hi world!"
                CONST Char = CHR$(66)
                CONST Combine = A$ + Char


Detalhes: Expressão que pode ser qualquer valor, numérico ou string. O Rapid-Q irá decifrar que valor constante estará englobado (ou seja, uma string ou uma variável numérica) se o nome da constante não for seguido por um caractere de declaração de tipo (%. &,!, #, $, Etc .. ) que já define o tipo de valor.

  CONVBASE$   Função de
  conversão
  Windows/Unix   Função de conversão que toma a expressão string representada em uma base especificada para ser convertida para outra base especificada determinada; pelos argumentos passados.

Síntaxe: CONVBASE$(expressão string, daBase, paraBase)
                S$ = CONVBASE$("FFD", 16, 2)
'-- Converte da base 16 para a 2
                S$ = CONVBASE$("287", 10, 16) '-- Converte da base 10 para a 16

Detalhes: Numeros negativos não são suportados.
  COS   Função
  matemática
  Windows/Unix   Função matemática que retorna o cosseno de um ângulo dado, em radianos.

Síntaxe: COS(expressão numérica)
                PI = 3.14153
                C# = COS(PI)


Detalhes: Expressão numérica que dá o ângulo expresso em radianos.
  DATA   Instrução   Windows/Unix   Declaração não executável que armazena as constantes numéricas e strings usadas pelas declarações READ de um programa.

Síntaxe:DATA {constante|EXECUTE(...)}[,...]
                DATA meu cachorro comeu meu dever de casa , "oh, rapaz!", 34.4
                DATA EXECUTE(LEFT$("Alô", 2, 3))


Detalhes:  Constante é qualquer valor numérico válido ou string que não muda. Se uma constante string contém vírgulas, dois pontos, ou espaços à esquerda ou à direita que você deseja preservar em seu programa, você deve colocar a string entre aspas duplas. Você também pode executar código usando a palavra-chave EXECUTE. O valor de retorno deste código executado será o valor retornado para a sua instrução de leitura.
  DATE$   Função do
  Sistema
  Windows/Unix   Função que retorna uma string contendo a data atual formatada como MM-DD-AAAA. Onde MM = mês (1-12), DD = dia (1-31) e YY = ano (1980-2099)

Síntaxe: DATE$
                 PRINT DATE$


Detalhes:  Ao contrário do QBasic onde você pode alterar a data atual usando a declaração DATA$, você não pode fazer isso no Rapid-Q.
  DEC   Instrução   Windows/Unix   Diminui a variável numérica em um, ou pela quantidade especificada.

Síntaxe: DEC(variável [, quantidade])
                 DEC(I)
                 DEC(I, 10)
  DEF...   Instrução   Windows/Unix   DEFBYTE, DEFDBL, DEFDWORD, DEFINT, DEFLNG, DEFSHORT, DEFSNG, DEFSTR, DEFWORD são declarações de instruções que nomeiam uma ou mais variáveis e alocam espaço de armazenamento para elas.

Síntaxe:DEFINT variável[(subscritos)] [, ...]
                DEFSTR A, B, C="Alô", D, E
                DEFINT I=99, J(100,10), K


Detalhes: Não se pode especificar uma série de variáveis, por exemplo: DefInt A-Z que funciona bem em QBasic, mas não em Rapid-Q. Pode-se inicializar cada variável conforme demonstrado acima. DEF ... declarações são equivalentes a chamar DIM, mas você pode economizar um monte de digitação. Para inicializar uma matriz, coloque a valores dentro de chaves {...}.

Por exemplo:
DEFINT A(1 TO 10) = {1,2,3,4,5,6,7,8,9,10}   'Inicializa  elementos  de 1
                        a 10 com os valores 1, 2, 3, 4, 5, 6, 7, 8, 9 e 10, respectivamente.
  DELETE$   Função string   Windows/Unix   Função que exclui parte de uma string.

Síntaxe: DELETE$(expressão string início, tamanho)
                A$ = DELETE$("Alô mundo", 2, 3)
'-- Resultado: Amundo
  DIM   Instrução   Windows/Unix   Instrução de declaração que nomeia uma ou mais variáveis e aloca espaço de armazenamento para elas.

Síntaxe: DIM variável[(subscritos)] AS type
                DIM A AS INTEGER, B(2,5,3,9,2) AS INTEGER
                DIM S AS STRING
                DIM Form AS QFORM


Detalhes:  Use os opcionais (subscritos) para declarar o tamanho de arrays, até 5 dimensões.
  DIR$   Função do
  sistema
  Windows   Função do sistema utilizado para obter o primeiro/próximo arquivo correspondente a um file-spec (nome e localização completa do arquivo) especificado.

Síntaxe: DIR$[(File-spec, atributo)]
                FileName$ = DIR$("*.*", 0)
'-- Obtem primeiro arquivo
                FileName$ = DIR$ '-- Obtem próximo arquivo

Detalhes: File-spec especifica um nome de arquivo ou caminho (que pode incluir caracteres curinga). Chamando DIR$ sem parâmetros retornará arquivos correspondentes adicionais. Se nenhuma correspondência existir (ou todos os correspondentes foram esgotados), DIR$ retorna uma string vazia. DIR$ retorna todos os arquivos regulares, bem como quaisquer arquivos especiais especificado no parâmetro de atributo.

Aqui estão alguns atributos de arquivos válidos, você pode combiná-los usando OU (Isto é: faReadOnly ou faDirectory)


&H1 = faReadOnly       &H8 = faVolumeID
&H2 = faHidden           &H10 = faDirectory
&H4 = faSysFile         &H20 = faArchive
                                  &H3F = faAnyFile


Para obter informações adicionais sobre os arquivos atualmente associados, use as propriedades FileRec:

FileRec.FileName     - Retorna um arquivo de nome longo
FileRec.ShortName   - Retorna um arquivo de nome curto
FileRec.Date           
- Retorna a data do arquivo como string
FileRec.Time            - Retorna a hora do arquivo como string
FileRec.Size            - Retorna o tamanho do arquivo
FileRec.FileTime      - Retorna a data do arquivo como inteiro

Pode-se usar FileRec.FileTime para comparar datas de arquivo. Assim, um novo arquivo terá um FILETIME maior do que um arquivo mais antigo.
  DOEVENT$   Função do
  sistema
  Windows   Função que retorna 0 se o diretório não existe, não-zero caso contrário.

Síntaxe: DIREXISTS(expressão string)
                 A = DIREXISTS("c:\windows")
  DIREXISTS   Específico
  Rapid-q
  Windows   Devolve o controle ao sistema operacional para processar os eventos na fila, e retorna o controle ao programa.

Síntaxe: DOEVENTS
                DO
                     DOEVENTS
                LOOP


DoEvents deve ser normalmente usado em processos de longa duração (ou seja, loops longos ou qualquer outra coisa que consome a CPU), de modo que o usuário pode abortar o processo, se necessário. DoEvents também pode ser usado para lidar com múltiplos forms.
  END   Instrução   Windows/Unix   Encerra o seu programa.

Síntaxe: END

              
Detalhes:   Chame END para encerrar o aplicativo, mas se houver algo do Windows ainda aberto, você deve fechá-lo primeiro.
  ENVIRON   Instrução do
  sistema
  Windows/Unix   Instrução usada para definir ou modificar uma variável de ambiente.

Síntaxe: ENVIRON expressão string
                ENVIRON "PATH=c:\windows"
                ENVIRON "TEST what"


Detalhes: A expressão string deve ter a forma: nomeParametro = texto ou nomeParametro texto

Tudo à esquerda do sinal de igual ou espaço é assumido como um parâmetro, e tudo à direita como texto. Se o nomeParametro não existia anteriormente na tabela de variáveis de ambiente, é anexada ao final da tabela. Se um; nomeParametro já existir, ele é excluído e o nomeParametro novo é acrescentado ao final da tabela.
  ENVIRON$   Função do
  sistema
  Windows/Unix   Função que retorna uma string de ambiente.

Síntaxe:ENVIRON$(string de ambiente)
                A$ = ENVIRON$("PATH")


Detalhes: Não é possível ecuperar uma variável de ambiente pelo seu índice.
  EXP   Função
  matemática
  Windows/Unix   Função matemática que retorna a função exponencial (e elevado à potência n).

Síntaxe: EXP(expressão numérica)
                A# = EXP(1)
  EXTRACT-
  RESOURCE
  Instrução de
  recursos
  Windows/Unix   Uma instrução que extrai um recurso a partir do programa atual, para um arquivo.

Síntaxe:EXTRACTRESOURCE recursoValor, nomeArquivo
                EXTRACTRESOURCE Recurso(0), "teste.bmp"


Detalhes: O valor do recurso é a posição absoluta do recurso dentro do programa atual. Para encontrar a posição absoluta do recurso, ver também; RESOUCE(), e RESOURCECOUNT.
  FIELD$   Função string   Windows/Unix   Função que retorna um campo (ou token) separados por delimitadores.

Síntaxe:FIELD$(stringOrigem, stringDelimitador, numero do campo)
                A$ = FIELD$("John&Doe&555-1234", "&", 2) 
  '-- Retorna Doe
                A$ = FIELD$("John&&Doe&&555-1234", "&&", 3)  
'-- Retorna 555-1234
  FILEEXISTS   Função do
  sistema
  Windows/Unix   Função que retorna 0 se o arquivo não existe, não-zero caso contrário. O arquivo é procurado no diretório de trabalho atual, se nenhum outro caminho for especificado.

Síntaxe: FILEEXISTS(expressão string)
                A = FILEEXISTS("rapidq.exe")
  FIX   Função
  matemática
  Windows/Unix   Função que remove a parte fracionária de um número.

Síntaxe: FIX(expressão numérica)
                A% = FIX(342.97)
  FLOOR   Função
  matemática
  Windows/Unix   Função matemática que arredonda uma expressão numérica para baixo em direção ao infinito negativo.

Síntaxe: FLOOR(expressão numérica)
               A% = FLOOR(66.7)
'-- Retorna 66
  FORMAT$   Função string   Windows/Unix   Função que retorna uma string formatada montada a partir de uma string de formato estilo Pascal e uma série de argumentos. O formato de estilo Pascal se assemelha ao estilo de formatação de strings estilo C, mas que não é compatível com VB.

Síntaxe:FORMAT$(Formato string, arg1, arg2, ...)
               A$ = FORMAT$("Location: %s %4d %-10.4g", "Any", 1234, 55.39)

                '-- Retorna Location: Any 1234 55.39

Detalhes: Formatação de strings passadas para as rotinas de formatação de strings contêm dois tipos de objetos - caracteres simples e especificadores de forformato. Os caracteres simples são copiados para a string resultante. Os especificadores de formato buscam argumentos da lista de argumentos e aplicam a formatação para eles.
Os especificadores de formato têm a seguinte forma:

"%" [index ":"] ["-"] [width] ["." prec] type

Um especificador de formato começa com um caractere%. Após um % vêm o seguinte, nesta ordem:
Um argumento opcional especificador de índice, [index  ":"]
Um indicador de justificação à esquerda opcional, ["-"]
Um especificador opcional de largura, [width]
Um especificador de precisão opcional, ["."  prec]
O caractere de tipo de conversão, type

A tabela abaixo resume os valores possíveis para type:


   d Decimal. O argumento deve ser um valor inteiro. O valor é convertido em uma seqüência de dígitos decimais. Se a string de formato contém um especificador de precisão, indica que a string resultante deve conter pelo menos o número especificado de dígitos, se o valor tiver menos dígitos, a string resultante é à esquerda preenchida com zeros.

   e Científico. O argumento deve ser um valor de ponto flutuante. O valor é convertido para uma string na forma "-d.ddd ... E + ddd". A string resultante cocomeça com um sinal de menos se o número for negativo. Um dígito sempre precede o ponto decimal. O número total de dígitos na string resultante (incluindo o antes do ponto decimal) é dado pelo especificador de precisão na seqüência de formato - uma precisão padrão de 15 é assumido se nenhum especificador de precisão estiver presente. O "E" caráter expoente na string resultante é sempre seguido por um sinal de mais ou menos e pelo menos três dígitos.

   f Fixo. O argumento deve ser um valor de ponto flutuante. O valor é convertido para uma string na forma "-ddd.ddd ...". A string resultante começa com um sinal de menos se o número for negativo. O número de dígitos depois da vírgula é dada pelo especificador de precisão na seqüência de formato - um padrão de 2 dígitos decimais é assumido se nenhum especificador de precisão estiver presente.

   g Genérico. O argumento deve ser um valor de ponto flutuante. O valor é convertido para a string decimal menor possível, utilizando formato fixo ou científico. O número de dígitos significativos na string resultante é dada pelo especificador de precisão na seqüência de formato - uma precisão padrão de 15 é assumida se nenhum especificador de precisão estiver presente. Zeros à direita são removidos da cadeia resultante, e um ponto decimal aparece somente se necessário. A string resultante usa o formato de ponto fixo, se o número de dígitos à esquerda do ponto decimal no valor for menor ou igual à precisão especificada, e se o valor for maior ou igual a 0,00001. Caso contrário, a string resultante usa o formato científico.

   n Número. O argumento deve ser um valor de ponto flutuante. O valor é conconvertido para uma string na forma "-d, ddd, ddd.ddd ...". O "n" corresponde ao formato de "f" formato, exceto se a string resultante contiver separadores de milhar.

   m Money (Dinheiro). O argumento deve ser um valor de ponto flutuante. O vavalor é convertido para uma string que representa um valor monetário.

   s String. O argumento deve ser uma string. A string ou caractere é inserido no lugar do especificador de formato. O especificador de precisão, se presente na string de formato, especifica o comprimento máximo da string resultante Se o argumento é uma string que é maior do que esse valor máximo, a string é truncada.

   x Hexadecimal. O argumento deve ser um valor inteiro. O valor é convertido em uma seqüência de dígitos hexadecimais. Se a string de formato contiver um especificador de precisão, indica que a string resultante deve conter pelo menos o número especificado de dígitos, se o valor tiver menos dígitos, a string resultante será preenchida com zeros.



Caracteres de conversão podem ser especificados em letras maiúsculas ou em minúsculas - ambos produzem os mesmos resultados. Um especificador de índice define o índice atual da lista de argumentos para o valor especificado. O índice do primeiro argumento na lista de argumentos é 0. Usando o índice de especificadores, é possível formatar o mesmo argumento várias vezes. Por exemplo Format$ ("% d% d% 0:% d d", 10, 20) produz a string "10 20 10 20".
  FRAC   Função
  matemática
  Windows/Unix   Uma função que retorna a parte fracionária de um número.

Síntaxe: FRAC(expressão numérica)
                A# = FRAC(342.97)
  HEX$   Função de
  conversão
  Windows/Unix   Função que retorna o hexadecimal (base 16) representação da expressão (base 10) numérico.

Síntaxe: HEX$(expressão numérica)
                A$ = HEX$(123)


Detalhes: Os números negativos são suportados. Na versão Windows, a string é pré-preenchida com zeros para ajustar o comprimento da string em 8.
  IIF   Função   Windows/Unix   A função IIF retorna uma das duas partes, dependendo da avaliação de uma expressão. Note-se que ambas as partes são avaliados, se a expressão retorna verdadeiro ou falso.

Síntaxe: IIF(expressão, expr verdadeira, expr falsa)
                A$ = IIF(6 > 5, "TRUE", "FALSE")
'-- retorna TRUE
  INC   Função   Windows/Unix   Incrementa uma variável numérica em um, ou pela quantidade especificada.

Síntaxe:INC(variável [, quantidade)
                INC(I)
                INC(I, 10)
  INITARRAY   Instrução de
  matriz
  Windows/Unix   Inicializa uma matriz com os valores correspondentes.

Síntaxe: INITARRAY(Matriz, valor [, ...])
                DIM A(1 TO 100) AS INTEGER
                INITARRAY(A, 55, 234, 45, 99)


Detalhes: Equivalente a: DEFINT A(1 TO 100) = {55, 234, 45, 99}
  INP   Função
  entrada/saida
  Windows/Unix   Um dispositivo de E / S retorna o valor do byte lido de uma porta.

Síntaxe: INP(porta)
                A% = INP(&H3C9)


Detalhes: Uma porta é identificada por uma palavra de valor entre 0 e 65535. O valor de retorno é na faixa de 0 a 255 (byte lido)
  INPW   Função
  entrada/saida
  Windows/Unix   Um dispositivo de E / S função que retorna o valor da palavra lida a partir de uma porta.

Síntaxe: INPW(porta)
                A = INPW(&H3C9)


Detalhes: Uma porta é identificada por uma palavra de valor entre 0 e 65535. O valor de retorno é na faixa de 0 a 65535 (2 bytes lidos)
  INSERT$   Função string   Windows/Unix   Função que retorna uma string com uma substring inserida após um índice especificado.

Síntaxe: INSERT$(string inserida, string original, numero índice)
                A$ = INSERT$("Ei", "Olá você", 4 )
'-- retorna Olá Ei você.
  INSTR   Função string   Windows/Unix   Função que compara duas strings e retorna a posição dentro da string pesquisada onde se encontra a string procurada após o início indicado. Se encontrado, INSTR retorna a posição de índice onde encontrou a string ou 0 caso contrário.

Síntaxe: INSTR([start,] string pesquisada, string procurada)
                 A% = INSTR("Hello", "ll")
'-- returns 3
                 A% = INSTR(4, "hehe they", "he") '-- returns 7
  INT   Função
  matemática
  Windows/Unix   Função que retorna o maior inteiro menor ou igual a uma expressão numérica. A parte fracionária é truncada.

Síntaxe INT(expressão numérica)
                A& = INT(342.97)
'-- =342
  KILL   Instrução do
  sistema
  Windows/Unix   Instrução que remove um arquivo do disco.

Síntaxe:KILL filespec
                KILL "meuDocumento.txt"
                KILL "*.c"
  KILLMESSAGE   Específico
  Rapid-q
  Windows   Instrução de que remove uma mensagem da fila.

Síntaxe: KILLMESSAGE hWnd, Mensagem
                KILLMESSAGE form.handle, WM_CHAR

Detalhes: Idealmente, KillMessage deve ser usado dentro de um evento, como OnKeyDown, para remover quaisquer mensagens que você não quer processadas posteriormente.
  LBOUND   Função de
  matriz
  Windows/Unix   Função que retorna o limite inferior da matriz.

Síntaxe: LBOUND(nomeMatriz [,dimensão])
                DIM A(-50 TO 100) AS INTEGER
                L% = LBOUND(A)
'-- Retorna -50

Detalhes:  Se a matriz tem múltiplas dimensões, você pode usar o argumento dimensão opcional para verificar o limite inferior de cada uma.
  LCASE$   Função de
  matriz
  Windows/Unix   Função que retorna uma expressão string com todas as letras minúsculas.

Síntaxe: LCASE$(expressão string)
                A$ = LCASE$("ALÔ")
'-- retorna alô.
  LEFT$   Função string   Windows/Unix   Uma função que retorna uma string com n caracteres mais à esquerda de uma dada string.

Síntaxe: LEFT$(expressão string, n)
                A$ = LEFT$("Alô",2)
'-- retorna Al

  LEN   Função string   Windows/Unix   Função que retorna o número de caracteres em uma string.

Síntaxe: LEN(expressão string)
A% = LEN("Alô")
'-- retorna 3

Detalhes: LEN não irá retornar o número de bytes necessários para uma variável. Esta opção está disponível no QBasic.
  LFLUSH   Instrução de
  ponteiro
  Windows   Instrução usada para iniciar um trabalho de impressão.

Síntaxe: LFLUSH
                LPRINT "Imprima esta linha"
                LFLUSH
'-- chame para iniciar a impressão

Detalhes: Deve-se chamar LFLUSH depois que estiver definido que você deseja iniciar a impressão. Se você não chamar LFLUSH, então quando o aplicativo for encerrado é que o documento irá ser impresso.
  LIBRARYINST   Função de
  DLL
  Windows   Retorna o identificador para o módulo da DLL. Se a DLL não foi carregada ainda, ou não for encontrada, esta função retorna 0.

Síntaxe: LIBRARYINST(DLLNome)
                DECLARE FUNCTION UpdateWindow LIB "USER32" ALIAS _
                "UpdateWindow" (hWnd AS LONG) AS LONG
                UpdateWindow(0)
     '-- O uso da função carregará a DLL
                hInst& = LIBRARYINST("USER32")

Detalhes: Declarando uma função como uma função de DLL não carrega automaticamente a DLL. A DLL é carregada uma vez que a função é usada. Note que nonomes de biblioteca devem corresponder, assim a sua declaração para Lib "user - 32" ... para encontrar esta biblioteca, você deve coincidir com o mesmo nome. ie. LIBRARYINST ("user32.dll") retorna 0, deve ser "User32" neste caso particular. Veja também UNLOADLIBRARY.
  LOG   Função
  matemática
  Windows/Unix   Função matemática que retorna o logaritmo natural de uma expressão numérica.

Síntaxe: LOG(expressão numérica)
                A# = LOG(10)
  LPRINT   Instrução de
  impressão
  Windows   Instrução como PRINT, exceto que a saída é direcionada para a impressora padrão. Certifique-se chamar LFLUSH para iniciar o trabalho de impressão.

SÍntaxe: LPRINT [expressão][{;|,}][...]
                LPRINT "Imprima esta linha"
                LFLUSH


Detalhes: Você deve chamar LFLUSH depois que você estiver seguro que você deseja iniciar a impressão. Se você não chamar LFLUSH, então quando o aplicativo for encerrado será executada a tarefa de impressão.
  LTRIM$   Função string   Windows   Função que retorna uma string com os espaços à esquerda removidos.

Síntaxe: LTRIM$(expressão string)
                A$ = LTRIM$(Alô")
'-- retorna Alô

  MEMCMP   Função de
  memória
  Windows/Unix   Função de memória que compara dois endereços de memória e retorna 0 se o conteúdo da memória não combina, ou não-zero caso contrário

Síntaxe: MEMCMP(end1, end2, quantidade)
                DEFINT I=10, J=10
                A% = MEMCMP(VARPTR(I), VARPTR(J), SIZEOF(INTEGER))
  MEMCPY   Função de
  memória
  Windows/Unix   Função de memória que copia n bytes de memória da origem para o destino.

Síntaxe:MEMCPY(destino, origem, n)
                DEFINT I=90, J=10                 
'-- Após MEMCPY, I ficará igual 10
                MEMCPY(VARPTR(I), VARPTR(J), SIZEOF(INTEGER))
  MEMSET   Função de
  memória
  Windows/Unix   Função de memória que inicializa um bloco de memória.

Síntaxe: MEMSET(end, caractere, tamanho)
                DIM IntArray(1 TO 10) AS INTEGER
                MEMSET(VARPTR(I(1)), 0, 10*SIZEOF(INTEGER))
  MESSAGEBOX   Específica
  Rapid-q
  Windows   Exibe uma caixa de mensagem simples com instruções. Implementa MessageBox uma função API do Windows.

Síntaxe: MESSAGEBOX(mensagem, titulo, flags%)
                IF MessageBox("Feche este form?", "Fechamento", 1) = 1 THEN
                
'-- Fecha o form
                END IF


Detalhes: Consulte o arquivo de Ajuda de APIs do Windows para flags válidos.
  MESSAGEDLG   Específica
  Rapid-q
  Windows   Exibe uma caixa de mensagem com um ícone e uma legenda definida pelo usuário. Implementa MessageBoxEx uma função API do Windows.

Síntaxe: MESSAGEDLG(expressão string, messgTipo, mssgBotões, ajudaContexto)
                IF MessageDlg("Feche este form?", mtWarning, mbYes OR mbNo, 0) = mrNo THEN
                
'-- Não feche o form
                END IF


Detalhes: msgType é usado para exibir o tipo de ícone que será exibido em sua caixa de mensagem.

0 = mtWarning      3 = mtConfirmation
1 = mtError          4 = mtCustom
2 = mtInformation


msgButtons é usada para exibir botões de diálogo personalizados. Para exibir mais de um botão mensagem, basta usar OR.

1 = mbYes       32 = mbAbort
2 = mbNo         64 = mbRetry
4 = mbOK       128 = mbIgnore
8 = mbCancel  256 = mbAll
16 = mbHelp


Ajuda de contexto ignorar.
  MID$   Função string   Windows   Função que retorna uma substring com n caracteres a partir de i da expressão string.

Síntaxe: MID$(expressão string, i, n)
                A$ = MID$("Embora",3,2)
'-- retorna bo

Detalhes: Você não pode usar MID$, desta forma:
MID$ (A$, 1, 1) = "G"

Em QBasic, esta declaração é válida substitui o primeiro caractere de A$ com "G". Para conseguir o mesmo efeito em Rapid-Q, use a função REPLACE$ string.
  MKDIR   Instrução do
  sistema
  Windows/Unix   Instrução que cria um novo diretório.

Síntaxe: MKDIR caminhoArquivo
                MKDIR "abc"

Detalhes: MKDIR não irá reescrever um diretório se ele já existe, se nenhum caminho for especificado, o diretório é criado no diretório de trabalho atual.
  OUT   Instrução
  Ent/saida
  Windows/Unix   Dispositivo de comunicação I/O (Entrada/Saida) que envia um valor de byte para uma porta de I/O.

Síntaxe: OUT porta, valor
                OUT &H3C9, 128

Detalhes: Porta é qualquer palavra com valor entre 0 e 65535.
                  Valor é um valor compreendido entre 0 e 255.
  OUTW   Instrução
  Ent/saida
  Windows/Unix   Dispositivo de comunicação I/O (Entrada/saida) que envia um valor de 2 bytes (word) para uma porta de I/O.

Síntaxe:OUTW porta, valor
                OUTW &H378, 128


Detalhes: Porta é qualquer palavra valor entre 0 e 65535. Valor é um valor compreendido entre 0 e 65535.
  PLAYWAV   Específico
  Rapid-q
  Windows   Reproduz um arquivo. WAV ou um. Resource (Recurso) WAV.

Síntaxe:   PLAYWAV wavArquivo|wavRecurso, somOpções
                $RESOURCE FlorMorena_WAV AS "FlorMorenawav"
                PLAYWAV "FlorMorena.wav", SND_ASYNC OR SND_LOOP
                PLAYWAV FlorMorena_WAV, SND_ASYNC OR SND_LOOP


Detalhes: somOpções determinam como o arquivo wav é reproduzido.

0 = SND_SYNC      '-- waits for wav to finish
1 = SND_ASYNC    '-- background play
3 = SND_LOOP      '-- Loop wav once finished playing


Você pode combinar SYNC ou ASYNC com LOOP alternando-os. Se o seu arquivo WAV não terminou de tocar quando você fecha o aplicativo, você receberá uma violação de acesso. Você pode parar o WAV passando uma string vazia como um nome de arquivo.
 POSTMESSAGE    Específico
  Rapid-q
  Windows   Chamada WinAPI para PostMessage, não bloqueia o programa.

Síntaxe: POSTMESSAGE hWnd, uMsg, wParam, lParam
                POSTMESSAGE Form.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0


Detalhes: PostMessage é uma chamada WinAPI, então ao invés de preencher toda esta página com informações você pode olhar essa função em seu arquivo WinAPI no manual / ajuda.
  QUICKSORT   Instrução
  ordenação
  Windows   QuickSort, apropriadamente chamado, pode ser usado para classificar os arrays de qualquer tipo, exceto Objetos/UDTs claro. Óbviamente, usa o algoritmo QuickSort para realizar a classificação.

Síntaxe:QUICKSORT(inicioArray, finalArray, ASCEND|DESCEND)
                DIM A(1000) AS INTEGER
                 '-- põe conteúdo em A
                QUICKSORT(A(10), A(500), ASCEND) '-- ordena os elementos 10..500

Detalhes: O elemento pivô no exemplo acima é A(10), então se você quiser aleatoriedade, você terá que substituir A(10) com algum elemento aleatório de A (10) .. A (500), no exemplo acima . Você também pode classificar arrays multidimensionais e "span sort" matrizes.

Span sorting:

          
DIM A(1 TO 100) AS LONG
          DIM B(1 TO 100) AS LONG
          DIM C(1 TO 100) AS LONG

          
'--- põe alguns valores no array A, B, C
          RANDOMIZE TIMER
          FOR I = 1 TO 100
              A(I) = RND(50000)
              B(I) = RND(50000)
              C(I) = RND(50000)
          NEXT

           QUICKSORT A(1), C(100), ASCEND
          PRINT A(1)," ",B(1)," ",C(1)


Contanto que você DIMensione as matrizes "lado a lado", eles irão compartilhar um espaço contíguo de memória, isso significa que você pode classificar desde o início do endereço de memória A(1) ao final do endereço de memória C(100). Esta  técnica não é recomendada, mas se você puder encontrar um uso para ela, vá em frente.
  RANDOMIZE   Instrução
  matemática
  Windows/Unix   Inicializa o gerador (semente) de números aleatórios.

Síntaxe: RANDOMIZE [expressão numérica]
                RANDOMIZE TIMER


Detalhes: Se o argumento for omitido, randomize será o padrão aleatório como RANDOMIZE TIMER.
  READ   Instrução   Windows/Unix   Instrução que lê valores de uma instrução DATA e atribui os valores a variáveis.

Síntaxe: READ variáveisLista
              READ A%, S$, P(1,2)


Detalhes: variáveisLista é composta de uma ou mais variáveis, separados por virgulas, que devem receber os dados. As variáveis podem ser string ou numéricas.
  REDIM   Instrução   Windows/Unix   Instrução de declaração que redimensiona o espaço alocado para uma matriz que já foi declarado pelo DIM, preservando o máximo de dados possível.

Síntaxe: REDIM variável[(subscritos)] AS type
                DIM B(20) AS INTEGER
                REDIM B(100) AS INTEGER


Detalhes: Se a matriz ainda não foi declarado pela DIM, ReDim será equivalente a chamar DIM (exceto quando se tratar de componentes, caso em que você vai receber um erro do compilador). Você não pode mudar o tipo de dados para a matriz, ie. você não pode redefinir B matriz para ser algo diferente de um INTEGER (como no exemplo acima). Combinando matrizes é um subproduto da ReDim.

DIM A(1 to 100) AS INTEGER
DIM B(1 to 100) AS INTEGER
REDIM A(1 to 200) AS INTEGER 
'-- Combina A e B juntas

O que o código acima faz é preservar os dados em A, bem como combinar o array B. Do índice 101-200 são os dados para B e de 1-100 são os dados de A. Esclarecimento: A matriz B não foi modificada, ela ainda mantém o seu próprio espaço de endereço e não substituirá uma de dados e vice-versa. Note que este subproduto não se aplica a redimensionamento de Strings fixas, variantes e componentes.
  REM   Comentário   Windows/Unix   Instrução BASIC que permite comentários explicativos a serem inseridos em um programa. É sugerido que você use ['] para iniciar seus comentários em seu lugar.

Síntaxe: REM remark
              ;REM Isto é um comentário, nada a ser executado
              'Isto é outro comentário
  RENAME   Instrução do
  sistema
  Windows/Unix   Declaração que renomeia um arquivo. Se o arquivo já existe a operação não é executada.

Síntaxe: RENAME arquivo1, arquivo2
                RENAME "abc.txt", "xyz.txt"
  REPLACE$   Função string
  do sistema
  Windows/Unix   Função que substitui uma parte de uma string com outra.

Síntaxe: REPLACE$(string original, string substituta, índice)
                A$ = REPLACE$("Alô", "J", 1)
'-- retorna Jalô
  REPLACE-
  SUBSTR$
  Função string
  do sistema
  Windows/Unix   Função que substitui uma substring com outra string. Todas as ocorrências serão substituídas. O comprimento da string de substituição não precisa coincidir com o comprimento da string substituída.

Síntaxe: REPLACESUBSTR$(string original, string a substituir, string substituta)
                A$ = REPLACESUBSTR$("abcdefgabcdefg", "abc", "99")

                '-- retorna 99defg99defg
  RESOURSE   Função de
  recurso
  Windows/Unix   Função que retorna a posição absoluta do recurso dentro do programa atual.

Síntaxe: RESOURCE(expressão numérica)
              EXTRACTRESOURCE Recurso(0), "teste.bmp"


Detalhes: RECURSO() é um array consistindo de 0 a RESOURCECOUNT-1 elementos. O elemento 0 corresponde ao primeiro recurso que você especificou e assim por diante. Se a expressão numérica não está no intervalo de 0 a RESOURSECOUNT-1, esta função retorna 0.
  RESOUR-
  SECOUNT
  Função de
  recurso
  Windows/Unix   Função que retorna o número de recursos no programa atual.

SíntaxeRESOURCECOUNT
               A% = RESOURCECOUNT
  RESTORE   Instrução   Windows/Unix   Instrução que permite que declarações DATA possam ser relidas a partir de uma linha especificada.

Síntaxe: RESTORE [{label da linha| numero da linha}]
                RESTORE

Detalhes: Se o argumento for omitido, a próxima instrução de leitura executada lerá o primeiro item da instrução de dados em primeiro lugar no programa. Label da linha ou Numero da linha identifica a instrução de dados você deseja que a próxima instrução READ use. O primeiro item da linha será lido.
  REVERSE$   Função string   Windows/Unix   Função que inverte (ou espelha) uma string.

Síntaxe: REVERSE$(expressão string)
               A$ = REVERSE$(Alô")
'-- retorna ôlA
  RGB   Função de
  conversão
  Windows/Unix   Função de conversão que leva os parâmetros vermelho, verde e azul e os combina para formar uma representação numérica BGR.

Síntaxe: RGB(vermelho, verde, azul)
              C = RGB(255, 0, 255)


Detalhes: Os valores variam de 0-255. Valores fora desta faixa produzem resultados indefinidos.
  RIGHT$   Função string   Windows/Unix   Função que retorna os n caracteres mais à direita de uma string.

Síntaxe: RIGHT$(expressão string)
                A$ = RIGHT$("Alô", 2)
'-- retorna lô
  RINSTR   Função string   Windows/Unix   O inverso de INSTR é uma função que compara duas strings e retorna a posição da string encontrada em relação à seqüência de pesquisa. Em vez de começar a busca da esquerda para a direita, como INSTR, RINSTR busca da direita para a esquerda (ou seja, ao contrário de INSTR). Se encontrado, RINSTR retorna a posição de índice da string encontrada, 0 caso contrário.

Síntaxe: RINSTR(início,] string origem, string procurada)
                A% = RINSTR("Alô Mundo", "n")
'-- retorna 3
                  A% = RINSTR(4, "Alô todo mundo", "do") '-- retorna 5
  RMDIR   Instrução do
  sistema
  Windows/Unix   Instrução que remove um diretório

Síntaxe:: RMDIR diretório
                 RMDIR "abc"
  RND   Função
  matemática
  Windows/Unix   Função que retorna um número aleatório cuja seqüência é gerada chamando RANDOMIZE.

Síntaxe: RND[(limite superior)]
                A% = RND(10)


Detalhes:Se nenhum limite superior é dado, RND retorna um número decimal na faixa de 0 a 1.
  ROUND   Função
  matemática
  Windows/Unix   Função matemática que converte um número para um inteiro arredondando a parte fracionária da expressão.

Síntaxe: ROUND(expressão numérica)
                A% = ROUND(3.49)  

'-- Retorna 3
                A% = ROUND(3.50)   '-- Retorna 4
  RTRIM$   Função string   Windows/Unix   Função que retorna uma string com os espaços à direita removidos.

Síntaxe:RTRIM$(expressão string)
             A$ = RTRIM$("Alô você   ")
'-- retorna Alô você
  RUN   Instrução
  do sistema
  Windows/Unix   Instrução que executa um programa especificado sem bloqueá-lo.

Síntaxe: RUN Programa
             RUN "rapidq.exe"
  SENDME-
  SSAGE
  Específico
  Rapid-q
  Windows   Chamada WinAPI para SendMessage, bloqueia até que a mensagem seja processada.

Síntaxe:SENDMESSAGE hWnd, uMsg, wParam, lParam
                SENDMESSAGE Form.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0


Detalhes: SendMessage é uma chamada WinAPI. Ao invés de preencher toda esta página com informações você pode olhar essa função em seu arquivo do manual/ajuda WinAPI.
  SGN   Função
  matemática
  Windows/Unix   Função matemática que indica o sinal de uma expressão numérica.

Síntaxe: SGN(expressão numérica)
                A% = SGN(-123)
   '-- Returns -1

Detalhes: Se a expressão numérica é positiva, SGN retorna +1.
                  Se a expressão numérica é zero, SGN retorna 0.
                  Se a expressão numérica for negativa, retornará SGN -1.
  SHELL   Instrução
  do sistema
  Windows/Unix   SHELL pode ser chamado como uma instrução ou como uma função. Ela tem a mesma funcionalidade que RUN exceto que bloqueia o seu aplicativo até que a execução tenha terminado.

Síntaxe: SHELL comando
              SHELL "rapidq.exe"


Síntaxe: SHELL(comando, showCMD)
              PID = SHELL("rapidq.exe", SW_SHOWNORMAL)


Detalhes: Se chamar SHELL como uma função, o valor de retorno é o ID do proprocesso do programa executado, e não bloqueia o seu programa. ShowCmd pode ser qualquer um dos seguintes:

0 = SW_HIDE                            6 = SW_MINIMIZE
1 = SW_SHOWNORMAL          7 = SW_SHOWMINNOACTIVE
2 = SW_SHOWMINIMIZED        8 = SW_SHOWNA
3 = SW_SHOWMAXIMIZED       9 = SW_RESTORE
4 = SW_SHOWNOACTIVATE   10 = SW_SHOWDEFAULT
5 = SW_SHOW
  SHOWME-
  SSAGE
  Específico
  Rapid-q
  Windows   Instrução usada para exibir uma caixa de mensagem genérica.

Síntaxe: SHOWMESSAGE expressão string
               SHOWMESSAGE"Alô mundo!"
  SIN   Função
  matemática
  Windows   Função matemática que retorna o seno de um ângulo dado em radianos.

Síntaxe: SIN(expressão numérica)
                PI = 3.14153
                C# = SIN(PI)


Detalhes: A expressão numérica é o ângulo expresso em radianos.
  SIZEOF   Função de
  memória
  Windows   Uma função que retorna o tamanho, em bytes, de um tipo de dados.

Síntaxe: SIZEOF(tipo de dado|variável
                PRINT SIZEOF(MinhaUDT)
                PRINT SIZEOF(MinhaVariavel)
                PRINT SIZEOF(INTEGER)


Detalhes: Para calcular o tamanho de um UDT, você deve primeiro DIMensioná-lo. ie. MinhaUDT Dim TMinhaUDT
  SOUND   Instrução
  entr/saida
  Windows   Dispositivo de comunicação de I/O que gera som através do alto-falante do PC.

Síntaxe: SOUND frequencia, duração
              SOUND 4000, 18


Detalhes: A freqüência é uma expressão numérica cujo valor está entre 37 e 32.767. A freqüência é medida em ciclos por segundo, ou hertz. A duração é uma expressão numérica cujo valor está entre 0 e 65.535. Há 18,2 tiques de clock por segundo, então 18 é considerado um segundo, etc ..
  SPACE$   Função string   Windows   Função que retorna uma string de espaços de comprimento n.

Síntaxe: SPACE$(n)
              A$ = SPACE$(5)
  SQR   Função
  matemática
  Windows   Função matemática que retorna a raiz quadrada de um número.

Síntaxe: SQR(expresão numérica)
              ;A# = SQR(9)
'-- retorna 3
  STATIC   Instrução   Windows   Semelhante ao DIM, esta instrução nomeia uma ou mais variáveis e aloca espaço de armazenamento para elas. No entanto, declarar variáveis static significa que os valores das variáveis são preservados entre chamadas de procedimentos. Note que apenas tipos simples são afetados.

Síntaxe: STATIC variável(subscritos)] AS type
                STATIC A AS INTEGER, B AS BYTE, S AS STRING


Detalhes: STATIC não tem efeito (ou seja, o mesmo que usar DIM), quando declarada no módulo principal. Use STATIC somente dentro de uma SUB/I ou FUNCTION/I.
  STR$   Função de
  conversão
  Windows/Unix   Função de conversão que retorna uma representação string do valor de uma expressão numérica.

SíntaxeSTR$(expressão numérica)
               A$ = STR$(99)
  STRF$   Função de
  conversão
  Windows/Unix   Função de conversão que retorna uma representação string formatada do valor de uma expressão numérica.

Síntaxe:STRF$(expressão numérica, Formato%, Precisão%, Digitos%)
                A$ = STRF$(99.9934, ffGeneral, 4, 4)
                A$ = STRF$(12345678, ffNumber, 8, 0)


Detalhes:  Precisão% especifica quantas casas decimais para fazer o cálculo.
Os seguintes são formatos válidos:

0 = ffGeneral       2 = ffFixed
1 = ffExponent    3 = ffNumber


ffGeneral converte para a string decimal menor possível, onde os zeros à direita são removidos. Dígitos% é a faixa e valores de 0 a 4.
ffExponent converte para a notação científica da forma d.ddd-... E + dddd. Digitos% é a faixa de valores de 0 a 4.
ffFixed converte em formato de ponto fixo de forma ddd.ddd-... Dígitos% é a faixa de valores de 0 a 18.
ffNumber converte para um formato de número da forma-d, ddd, ddd.ddd ... Onde a string resultante contém separadores de milhar.
  STRING$   Função string   Windows/Unix   Função que retorna uma string cujos caracteres têm um dado código ASCII ou cujos caracteres são todos o primeiro caractere de uma expressão string.

Síntaxe: STRING$(quantidade, código)
                A$ = STRING$(9, 65)
'-- Returns AAAAAAAAA

Síntaxe: STRING$(quantidade, expressão string)
               A$ = STRING$(9, "ABC")
'-- Returns AAAAAAAAA

Detalhes: O primeiro parâmetro indica o número de vezes para repetir o caractere. O segundo parâmetro pode ser uma expressão de string, cujo primeiro caractere é usado como o caractere de repetição, ou um código ASCII na faixa de 0-255.
  SWAP   Instrução   Windows/Unix   Instrução de atribuição que intercambia os valores de duas variáveis.

Síntaxe: SWAP variável1, variável2
                SWAP A$, B$


Detalhes: Variável1 e variável2 devem ser do mesmo tipo, mas o Rapid-Q não vai avisar. Além disso, não intercambia variantes se os seus tipos não correspondem.
  TALY   Função string   Windows/Unix   Tally conta o número de ocorrências da string procurada dentro de uma string de busca.

Síntaxe: TALLY(string de busca, string procurada)
                Quant& = TALLY("abcdefghijklmnabc", "abc") 
'-- retorna 2
  TAN   Função
  matemática
  Windows/Unix   Função matemática que retorna a tangente de um dado ângulo em radianos.

Síntaxe: TAN(expressão numérica)
                T# = TAN(90)


Detalhes: A expressão numérica é o ângulo expresso em radianos.
  TIME$   Função do
  sistema
  Windows/Unix   Função que retorna uma string contendo a hora atual formatada como HH: MM: SS. Onde HH = hora (0-23), MM = minuto (0-59) e SS = segundos (0-59)

Síntaxe: TIME$
              PRINT TIME$


Detalhes: Ao contrário do QBasic onde você pode definir a data atual usando a instrução TIME$, você não pode fazer isso no Rapid-Q.
  TIMER   Função do
  sistema
  Windows/Unix   Função que retorna o número de segundos passados desde a meia-noite.

Síntaxe: TIMER
              T! = TIMER


Detalhes: valor do temporizador para Linux / Unix é o número de segundos passados desde que o seu programa começou.
  UBOUND   Função de
  array
  Windows/Unix   Função que retorna o limite superior da matriz.

Síntaxe: UBOUND(nome do array [,dimensão)
                DIM A(-50 TO 100) AS INTEGER
                L% = UBOUND(A)
'-- Retorna 100

Detalhes: Se a matriz tem múltiplas dimensões, você pode usar o argumento dimensão opcional para verificar o limite superior de cada uma.
  UCASE$   Função string   Windows/Unix   Função que retorna uma expressão string com todas as letras maiúsculas.

Síntaxe: UCASE$(expressão string)
               A$ = UCASE$("Alô")
'-- retorna ALÔ
  UNLOAD-
  LIBRARY
  Instrução DLL   Windows   Remove DLL da memória (somente aquelas declaradas no Rapid-Q). Se a DLL não foi carregada ou não é encontrada, esta instrução não faz nada.

Síntaxe: UNLOADLIBRARY(DLLNome)
                DECLARE FUNCTION UpdateWindow LIB "USER32" ALIAS _
                           "UpdateWindow" (hWnd AS LONG) AS LONG
                UNLOADLIBRARY("USER32")
'-- Remove USER32.DLLda memória

Detalhes: Não é necessário descarregar uma DLL, isso é feito para você quando termina o seu programa Rapid-Q. Descargar uma biblioteca DLL da memória não significa que a chamada de função que requer a DLL irá falhar. A DLL é novamente recarregado na memória antes da chamada de função, assim você pode descarregá-la novamente se quiser. Note que os nomes da biblioteca deve corresponder, portanto, em sua declaração de Lib "user32" ... para descarregar esta biblioteca você deve fazer coincidir o nome. UNLOADLIBRARY ("user32.dll") não faz nada, ele deve ser "User32" neste caso particular. Veja também LIBRARYINST.
  VAL   Função de
  conversão
  Windows   Função de conversão que retorna uma representação numérica da expressão string.

Síntaxe: VAL(expresão string)
               ;A = VAL("995")
  VARPTR   Função de
  endereçamento
  Windows   Função que retorna o endereço, (ie. o ponteiro para) do nome da variável fornecido. A variável deve ser uma variável declarada, ou seja, não é a variável de um componente, como QForm.Caption

Síntaxe: VARPTR(nomeVarável)
Ender& = VARPTR(MinhaString$)
Ender& = VARPTR(MeuArray(0))
  VARPTR$   Função de
  endereçamento
  Windows   Função que retorna a representação string de um determinado endereço.

Síntaxe: VARPTR$(endereço)
                S$ = VARPTR$(279027343)
  VARTYPE   Função
  variante
  Windows   Função que retorna o tipo de dados do valor atual armazenado na variante.

Síntaxe: VARTYPE(variant)
               DIM minhaVariante(100) AS VARIANT
               minhaVariante(1) = "G"
               VarTipo = VARTYPE(minhaVariante(1))

Detalhes: Valores de retorno válidos:

0 - Number(inclui Byte, Word, Dword, Short, Long/Integer)
1 - Float (inclui Single, Double)
2 - String

Todas as variantes indefinidas são inicializadas como Numeros.



 
Envie-me um Email:
godin13@hotmail.com Críticas, sugestões e solicitações são benvindas Meus downloads favoritos: Kerodownload