Página 1 de 1

Buffer do teclado é limpo no Memoedit()

Enviado: 08 Jun 2011 17:25
por chrissoares
Prezados,

Estou passando pela seguinte situação:
No sistema que estou dando manutenção existe uma rotina para fazer a criação de formulários personalizados onde o usuário pode escrever textos e colocar os campos que deseja que sejam impressos, semelhante a Mala Direta do Word.

A escolha dos campos é feita ao pressionar uma tecla (F2) que apresenta uma lista de campos disponíveis e ao escolher o campo é preenchido no memoedit o código referente a este campo. Esta função sempre funcionou e começou a apresentar erro depois que passei a utilizar o xHarbour 1.0, testei com versões mais recentes mas com este sistema ele ocupa quase 50% do tempo do processado, isto estando parado sem processar nada.

O problema ocorre pois na função passada ao Memoedit, quando o usuário escolhe o campo, o seu código é armazenado em uma variável local e depois de um processamento é utilizado a função Keyboard para colocar o código do campo no MemoEdit no local onde o cursor esta. Depois de passar para o xHarbour 1.0 é apresentado apenas o primeiro caracter do código.

Pelo que pode analisar, colocando alertas, antes de chamar a função Keyboard(variavel), a variável que armazena o campo esta com o valor correto, na linha abaixo da chamada do Keyboard(variavel) a variável já não possui mais o valor. Observei que ao chamar o Keyboard a função definida no Memoedit é chamada novamente, o que causa a perda do conteúdo da variável, e o primeiro caracter é retornado pois ele fica armazenado na Lastkey().

Alguém já passou por algo parecido ou teria alguma ideia, que não seja migrar para o Harbour ou uma versão mais recente do xHarbour ?

Agradeço a atenção de todos!

Buffer do teclado é limpo no Memoedit()

Enviado: 09 Jun 2011 12:18
por Jairo Maia
Olá Chrissoares,

Nã passei por isso, mas lendo seu post, e considerando que o primeiro caracter chega no MemoEdit, acredito que o buffer não está sendo limpo.

Se vc teve sucesso com versões mais recentes, será que no caso do xHarbour 1.0 não é necessário aumentar ou definir o buffer do teclado?

Você tentou usar:

Código: Selecionar todos

SET TYPEAHEAD TO <nTamnho> // Onde nTamanho pode ser qualquer número entre 0 e 4096.

Buffer do teclado é limpo no Memoedit()

Enviado: 09 Jun 2011 14:02
por chrissoares
Obrigado Jairo pela resposta.

Na verdade eu verifiquei o tamanho do Buffer no momento que é chamado o Keyboard, ele esta com o tamanho de 50 neste momento.
Fiz a alteração e coloquei antes da chamada do MemoEdit definindo o tamanho do Buffer para 100, mesmo assim não deu certo.

Um detalhe que esqueci de mencionar é que existe um Case dentro da função passada ao MemoEdit. Neste Case eu verifico o seguinte:
Quando é um ME_INIT, Ligo o Insert e seto o Cursor.
Quando é ME_IDLE, não faço nada, apenas retorno da função.
Quando é ME_UNKEY ou ME_UNKEYX, verifico se a tecla pressionada não foi F2 (ou alguma outra com função definida), caso seja F2, é apresentado a lista com os campos para o usuário escolher, depois que ele escolhe, o código do campo é armazenado na variável e depois é chamado o Keyboard.

Obrigado mais uma vez, vou continuar pesquisando e testando combinações diferentes.

Abraços!

Buffer do teclado é limpo no Memoedit()

Enviado: 09 Jun 2011 14:58
por alxsts
Olá!

Não tive tempo de olhar melhor o caso mas, você está jogando o conteúdo da variável de uma só vez no buffer do teclado?

Acho que teria que fazer um loop:

Código: Selecionar todos

   Local cVar, cChar

   For Each cChar in cVar
       KEYBOARD Chr( Asc( cChar ) ) 
   Next

Buffer do teclado é limpo no Memoedit()

Enviado: 09 Jun 2011 18:27
por chrissoares
Obrigado pela ajuda Alex, mas ainda não foi a solução para o problema.

Eu acredito que o problema esteja no caso que ao entrar na função passada para o MemoEdit, o primeiro parametro da função (Modo), recebe o modo ME_UNKEY e ME_UNKEYX. Vou tentar cercar pois estes modos indicam se altera ou não o Buffer.


Obrigado mais uma vez!
Abraços!