Barra de rolagem (Simples)

28/12/2005

Bom dia a todos...
Preciso urgentemente descobrir como faço para rolar a barra de rolagem do TRichEdit, independente da posição cursor, como se estivesse usando o [b:4995ed8496]Scroll[/b:4995ed8496] do mouse....
Será q os amigos poderiam ajudar??

Sou muito grato a todos.
Abraços


Rcasistemas

Currículo

Respostas

28/12/2005

Marco Salles

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(RichEdit1.Handle,WM_VSCROLL,SB_Lineup,0);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
SendMessage(RichEdit1.Handle,WM_VSCROLL,SB_LineDown,0);
end;



Responder Citar

28/12/2005

Rcasistemas Currículo

Funcionou kra, se naum for abusar muito poderia dizer a message utilizar para ir para o inicio e para o fim do RichEdit???

Abraços.


Responder Citar

29/12/2005

Marco Salles

Funcionou kra, se naum for abusar muito poderia dizer a message utilizar para ir para o inicio e para o fim do RichEdit???


vou dar um exemplo indo para o fim... Se lhe servir posto a outra parte

Voce para executar esse exemplo precisa de :

[b:649229190e]Procure no seu CD de Delphi , na pasta extras a unit SndKey32.pas.[/b:649229190e]

[b:649229190e]Inclua essa Unit na Librayr , para que voce consiga acessar algumas funçoes[/b:649229190e]

[b:649229190e]Feito isso inclua a Unit SndKey32 na uses do Form do seu Projeto[/b:649229190e]

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,SndKey32,
  StdCtrls, ComCtrls;


Finalmente

procedure TForm1.Button1Click(Sender: TObject); var i,inicio,Fim:integer; begin RichEdit1.SetFocus; SendKeys(pchar(´^´), False); Fim:=RichEdit1.SelStart; inicio:=Fim - length(RichEdit1.Lines.Strings[RichEdit1.LINES.COUNT-1]); for i:=inicio to fim do SendKeys(pchar(´+´), False); end;



Responder Citar

29/12/2005

Nildo

Não seria mais facil usar:

RichEdit1.SelStart := 0;

para ir para o inicio, e

RichEdit1.SelStart := length( RichEdit1.Text );

para ir até o fim.

Depois você da um

RichEdit1.SetFocus;

para setar o focus no controle


Responder Citar

29/12/2005

Marco Salles

Não seria mais facil usar: RichEdit1.SelStart := 0; para ir para o inicio, e RichEdit1.SelStart := length( RichEdit1.Text ); para ir até o fim. Depois você da um RichEdit1.SetFocus; para setar o focus no controle


Acho que assim nun dá não :cry: :cry: Teste ai...

[b:2ad1667134]O Fato de parecer complicado [/b:2ad1667134], ´um pouco culpa minha.. Pelo que foi pedido poderia ter feito simplesmente

:lol: :lol: :lol:
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.SetFocus;
SendKeys(pchar(´^´), False);
end;

que teria o efeito de ir para o fim do RichEdit1

[b:2ad1667134]Mas quis dar uma imperequetada na perereca [/b:2ad1667134]e alem de ir para o Fim do RichEdit1 ,também selecionar a ultima linha
.. Uma especie de item Intex que aparetemente não tem no RichEdit1

Pois bem o ultimo post que coloquei , tem um comportamento duvidos , :cry: :cry: :cry: quando o RichEdit1 tem [b:2ad1667134]linhas em vazio[/b:2ad1667134].. Por isso reescrevi o código e acho que deve resolver

:P :P :P :P
procedure TForm1.Button1Click(Sender: TObject);
var
i,Fim:integer;
begin
Fim:=RichEdit1.Lines.Count;
while (RichEdit1.Lines.Strings[fim&93; = ´´) DO
begin
  RichEdit1.Lines.Delete(fim);
  Fim:=Fim-1;
  if RichEdit1.Lines.Count = 0 then
    break;
end;
if RichEdit1.Lines.Count > 0 Then
  begin
    RichEdit1.SetFocus;
    SendKeys(pchar(´^´), False);
    fim:=length(RichEdit1.Lines.Strings&91;fim&93;);
    for i:=0 to fim do
       SendKeys(pchar(´+´), False);
  end;
end;



Responder Citar

29/12/2005

Nildo

Na verdade eu testei antes de colocar a resposta! E retestei e continua funcionando! E quanto a não ter um ItemIndex, tem sim..

RichEdit1.CaretPos.Y

;)


Responder Citar

29/12/2005

Marco Salles

Na verdade eu testei antes de colocar a resposta! E retestei e continua funcionando!


por gentileza , coloque o código completo , porque aqui eu não consegui.. Da certo somente nos casos em que o Numero de linhas do Richeet esta toda dentro da area visivel da mesma .. Mas quando tem linhas ocultas , não consiguir

E quanto a não ter um ItemIndex, tem sim.. RichEdit1.CaretPos.Y


mas acho que e somente leitura ...


Responder Citar

29/12/2005

Nildo

[quote:72a5cc92e3=´Marco Salles´]por gentileza , coloque o código completo , porque aqui eu não consegui.. Da certo somente nos casos em que o Numero de linhas do Richeet esta toda dentro da area visivel da mesma .. Mas quando tem linhas ocultas , não consiguir[/quote:72a5cc92e3]

Realmente, somente quando a posição está visivel. Mas funciona (nesse caso)! rsrs

[quote:72a5cc92e3=´Marco Salles´]mas acho que e somente leitura ...[/quote:72a5cc92e3]

Sim, mas funciona como um ItemIndex na hora de obter a linha e caracter do cursor do teclado


Responder Citar

29/12/2005

Marco Salles

Marco Salles escreveu: mas acho que e somente leitura
...

Sim, mas funciona como um ItemIndex na hora de obter a linha e caracter do cursor do teclado


[b:6215f4b77f]Se for para ver a Linha ou a coluna do Cursor Poderia tb usar :[/b:6215f4b77f]

var
linha,coluna:Integer;

with RichEdit1 do
  begin
     Linha:=Perform(EM_LINEFROMCHAR,SelStart, 0);
     Coluna := SelStart - Perform(EM_LINEINDEX, Linha, 0);
  end;


So que mas não vejo aplicação direta , dessas intruçoes que pudesse facilitar a imperequetada que eu dei na perereca


Responder Citar

30/12/2005

Marco Salles

volto nesse tópico porque constatei que o ´efeito´ selecionado que tentei dar a ultima linha do RicheetEdit , em determinados textos , principalmente com formataçoes do tipo tabela , o laço for não se comportava da maneira que deveria

Então fiz um [b:a5b0873149]novo[/b:a5b0873149] código sem o laço for , para [b:a5b0873149]tentar[/b:a5b0873149] corrigir estas [b:a5b0873149]distorção[/b:a5b0873149] com esse tipo de formatação

Ficando o codigo assim :

procedure TForm1.Button1Click(Sender: TObject);
var
fim:integer;
begin
Fim:=RichEdit1.Lines.Count;
while (RichEdit1.Lines.Strings[fim&93; = ´´) DO
begin
  RichEdit1.Lines.Delete(fim);
  fim:=fim-1;
  if RichEdit1.Lines.Count = 0 then
    break;
end;
if RichEdit1.Lines.Count > 0 Then
  begin
    RichEdit1.SetFocus;
    SendKeys(pchar(´^´), False);
    application.ProcessMessages;
     RichEdit1.SelStart:=RichEdit1.SelStart-1;
     SendKeys(pchar(´+´), False);
  end;
end;


Quero dizer que para a questão de somente ir para o final do RicheetEdit
bastava

RichEdit1.SetFocus;
SendKeys(pchar(´^´), False);



a demais codificaçao é uma tentativa por conta e risco de dar um efeito destacado no fim do texto.. Tipo isso:

Imagem [b:a5b0873149]antes[/b:a5b0873149] do Click Do Botao :
[URL=http://imageshack.us][img:a5b0873149]http://img512.imageshack.us/img512/6383/imagemricheet17we.jpg[/img:a5b0873149][/URL]

Imagem [b:a5b0873149]apos[/b:a5b0873149] o Click Do Botao
[URL=http://imageshack.us][img:a5b0873149]http://img512.imageshack.us/img512/6666/imagemricheet25mf.jpg[/img:a5b0873149][/URL]

E so isso que estou tentando...


Responder Citar