Ir para conteúdo
Fórum Script Brasil
  • 0

Consertar Digitação Errada


José Luiz

Pergunta

É muito comum as pessoas digitarem um texto, e só após algum tempo notarem que estão com a Caps Lock acionada.

Para não ter que apagar e escrever tudo novamente, estou tentando fazer com que isto possa ser feito de forma automática, apenas pressionando a tecla F9, por exemplo.

Para testar, fiz uma rotina bem simples, que necessito de ajuda para completar.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Function Inverte_CX ( TEXTO : string ): string ;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

procedure WMHotKey ( var Msg: TWMHotKey ); message WM_HOTKEY ;

end;

var

Form1: TForm1;

HKeySet9 : Integer;

implementation

{$R *.dfm}

procedure TForm1.WMHotKey ( var Msg: TWMHotKey );

begin

if ( Msg.HotKey = HKeySet9 ) then begin

if Edit1.Focused = True then Edit1.Text := Inverte_CX ( Edit1.Text ) ;

if Edit2.Focused = True then Edit2.Text := Inverte_CX ( Edit2.Text ) ;

if Edit3.Focused = True then Edit3.Text := Inverte_CX ( Edit3.Text ) ;

if Edit4.Focused = True then Edit4.Text := Inverte_CX ( Edit4.Text ) ;

end ;

end;

Function TForm1.Inverte_CX ( TEXTO : string ): string ;

var

mVAR_I : String ;

mVAR_F : String ;

mVAR_R : String ;

mPOS : Integer ;

i : Integer ;

begin

mVAR_I := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÇÃÕçãõÁÉÍÓÚáéíóú' ;

mVAR_F := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZçãõÇÃÕáéíóúÁÉÍÓÚ' ;

mVAR_R := '' ;

for i := 1 to length ( Texto ) do begin

mPOS := Pos ( Texto, mVAR_I ) ;

if mPOS > 0 then

mVAR_R := mVAR_R + Copy ( mVAR_F, mPOS, 1 )

else

mVAR_R := mVAR_R + Texto ;

end ;

result := mVAR_R ;

end ;

procedure TForm1.FormCreate(Sender: TObject);

begin

HKeySet9 := GlobalAddAtom ( 'Hotkey9' );

RegisterHotKey ( Handle, HKeySet9, 0, vk_F9 );

end;

end.

Neste caso, tenho 4 Edits, e preciso fazer a verificação de qual Edit está no foco para então alterá-lo.

A minha dúvida, é como fazer isto de forma automática, ou seja, o programa verifica qual Edit ou DBEdit está no foco, e retorna a String alterada para este campo, em qualquer lugar do programa, sem que eu necessite efetuar manualmente a verificação de qual Edit está no foco.

Antecipadamente, agradeço,

José Luiz.

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
É muito comum as pessoas digitarem um texto, e só após algum tempo notarem que estão com a Caps Lock acionada.

Para não ter que apagar e escrever tudo novamente, estou tentando fazer com que isto possa ser feito de forma automática, apenas pressionando a tecla F9, por exemplo.

Neste caso, tenho 4 Edits, e preciso fazer a verificação de qual Edit está no foco para então alterá-lo.

A minha dúvida, é como fazer isto de forma automática, ou seja, o programa verifica qual Edit ou DBEdit está no foco, e retorna a String alterada para este campo, em qualquer lugar do programa, sem que eu necessite efetuar manualmente a verificação de qual Edit está no foco.

Uma forma muito mais simples.. utilize o código abaixo no evento OnKeyPress do Edit

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  KeyState: TKeyboardState;
begin
  GetKeyboardState(KeyState);

  if(KeyState[VK_CAPITAL] = 0) then
  else
    begin
      Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
      Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
    end;

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, obrigado por sua resposta ( muito interessante a forma colocada ), porém não atende ao que eu necessito.

No caso mostrado, se eu desejar digitar tudo em caixa alta, terei problemas, além do fato que eu precisarei repetir o ONKEYPRESS em todos os edits do programa.

O que eu gostaria de obter é o seguinte.

A tecla F9 chama uma função que verifica qual o Edit do programa ( em todos os Forms do programa ) que está em foco no momento, e devolve a String invertida para esta mesma Edit.

Desta forma, eu só preciso fazer o chamado a esta função uma vez, no início do programa.

Obrigado,

José Luiz.

PS.

Eu tenho esta rotina em Clipper, e estou tentando levar para o Delphi.

No Clipper, basta eu colocar no início do programa Set Key -8 to Inverte_CX que o programa se encarrega do restante.

( a função Inverte_CX já está em um arquivo que eu chamo em todos os programas, ou melhor, chamava ! - No Delphi eu tenho um arquivo semelhante. )

Link para o comentário
Compartilhar em outros sites

  • 0
Jhonas, obrigado por sua resposta ( muito interessante a forma colocada ), porém não atende ao que eu necessito
José Luiz... acho que voce vai achar uma maneira inteligente de aproveitar essa rotina no seu sistema... pense um pouco

procedure TForm1.Button1Click(Sender: TObject);
var
  KeyState: TKeyboardState;
begin
  GetKeyboardState(KeyState);
  if(KeyState[VK_CAPITAL] = 0) then
    begin
      Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0);
      Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
    end
  else
    begin
      Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
      Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
    end;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas,

Descobri uma rotina que faz parte do que eu desejo.

ActiveControl - Envia valor para Edit que tiver em foco

Verifica se o componente que está com o foco é da classe do TEdit, se for envia um Texto para esse componente.

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if (ActiveControl is TEdit) then
    (ActiveControl as TEdit).Text := 'Teste';
end;

Funciona para outros componentes, trocando a propriedade Text utilizado neste exemplo pela propriedade do outro componente.

Desta forma, consigo escrever no Edit que está no foco, mas ainda não sei como pegar o texto que está nesse Edit, e enviá-lo alterado no lugar da palavra 'Teste' do exemplo acima.

Obrigado,

José Luiz.

Link para o comentário
Compartilhar em outros sites

  • 0

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if (ActiveControl is TEdit) then
    (ActiveControl as TEdit).Text := 'Teste';
end;
Este código não especifica qual é o edit ... se voce tiver uns 5 no form ele ira pegar sempre o primeiro
Desta forma, consigo escrever no Edit que está no foco, mas ainda não sei como pegar o texto que está nesse Edit, e enviá-lo alterado no lugar da palavra 'Teste' do exemplo acima.
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if (ActiveControl is TEdit) then
    (ActiveControl as TEdit).Text := Inverte_CX (Edit1.Text);
end;

OBS: ainda acho que voce quer fazer da maneira mais dificil

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...