Logo Hardware.com.br
GBastos
GBastos Super Participante Registrado
777 Mensagens 4 Curtidas

Problema em chamada a procedimento no Delphi

#1 Por GBastos 16/12/2002 - 13:26
Pessoal, estou com um problema sério, analisem o seguinte código:

procedure TEditorForm.Memo1Change(Sender: TObject);
var
LinhaPos, ChrPos, TamanhoLinha: Integer;
begin
LinhaPos := SendMessage(Memo1.Handle,EM_LINEFROMCHAR,Memo1.SelStart,0);
Chrpos := SendMessage(Memo1.Handle,EM_LINEINDEX,LinhaPos,0);
TamanhoLinha := SendMessage(Memo1.Handle, EM_LINELENGTH, ChrPos, 0);
ChrPos := Memo1.SelStart - ChrPos;
StatusBar.Panels[0].Text := 'Linha ' + IntToStr(LinhaPos + 1);
StatusBar.Panels[1].Text := 'Coluna ' + IntToStr(ChrPos + 1);
StatusBar.Panels[2].Text := 'Nº de carac. na linha: ' + IntToStr(TamanhoLinha);
end;

procedure TEditorForm.Memo1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Memo1Change(Sender);
end;

procedure TEditorForm.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Memo1Change(Sender);
end;


Ou seja, sempre que houver uma alteração ou o usuário apertar qualquer tecla do teclado ou clicar com o mouse, aparecerá na status bar a linha e a coluna em que o cursor está.
Tudo funciona com o mouse ou quando altero, o problema acontece no keydown, ele sempre funciona um ciclo atrasado.
Por exemplo, abri um arquivo, na status bar mostra lin. 1 col. 1, se eu apertar a seta de direção para a esquerda continua mostrando a mesma coisa. Aí depois se eu apertar seta para baixo, muda para lin 1 col 2, ou seja a mensagem anterior. E sempre assim. Alguma dica?

PS: Se alguém tiver uma idéia para posicionar o cursor em uma determinada linha e/ou coluna, também agradeceria pois não estou conseguindo...
GBastos
GBastos Super Participante Registrado
777 Mensagens 4 Curtidas
#3 Por GBastos
18/12/2002 - 14:56
romulo
Isso tá acontecendo porque você está usando o evento OnKeyDown, que acontece antes do processamento da ação de pressi...


Valeu Romulo, funcionou! Nao sabia disso nao, nao achei isso nem na documentação do Delphi...

Agora, alguem tem alguma dica sobre o posicionamento do cursor?
E também já vi que com o TMemo não dá para abrir arquivos muito grandes. Alguem sabe qual o tamanho máximo? E o TRichEdit suporta mais ou é a mesma coisa?
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
romulo
romulo General de Pijama Registrado
7.4K Mensagens 0 Curtidas
#4 Por romulo
18/12/2002 - 15:12
GBastos
Valeu Romulo, funcionou! Nao sabia disso nao, nao achei isso nem na documentação do Delphi...

Agora, alguem tem al...


Você fala reposicionar o cursor por código? Você pode usar a propriedade SelStart (e opcionalmente SelLength pra garantir que não haja um comportamento estranho). Tipo:

Memo1.SelStart := 5;
Memo1.SelLength := 0;
Minha coleção de jogos (todos originais)
GBastos
GBastos Super Participante Registrado
777 Mensagens 4 Curtidas
#5 Por GBastos
19/12/2002 - 16:16
romulo
Você fala reposicionar o cursor por código? Você pode usar a propriedade SelStart (e opcionalmente SelLength pra gara...


Já tentei isso, mas acontece o seguinte, digamos que o cursor está no inicio da segunda linha deste texto:

abcd
efgh

Se eu botar SelStart para 4 o cursor não vai para o h, vai para o d, só vai para o h se eu botar 8...
Eu queria um jeito de ir para tal coluna na linha atual.. E com outro botão vc iria para tal linha..
Esse código de obter linha e coluna eu achei na net, mas não ao certo como funcionam esses EM_LINEFROMCHAR e EM_LINEINDEX, nem achei em nenhum livro..
Ever tried. Ever failed. No matter. Try again. Fail again. Fail better.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal