Ajuda - Busca - Membros - Calendário
Versão Completa: [Duvida] Destacando palavras
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
brhvitor6
Em quanto o usuário estiver digitando no richedit algumas palavras se destacam. ex:

ola meu nome é...

A palavra nome foi destacada.
Douglas Soares
mas qual o critério para o destacamento de palavras?
brhvitor6
tipo
mudar a cor da palavra ou deixa-la em negrito...
Douglas Soares
Segue um exemplo que acabei de fazer: http://www.4shared.com/file/241868050/3fe2...r_richedit.html



coloca a palavra vaca no edit, seleciona uma cor e clica em pintar, ai você vai ver que vai pintar todas as palavras vacas independentemente se estão maiusculas ou minusculas.

Abraços
brhvitor6
Obrigao... vou ver se consigo aplicar em meu projeto... por enquanto é so =)
brhvitor6
Tive um certo problema... quando estou digitando ele sempre volta para a primeira coluna...

porq exemplo estou digitando vitor ... sai rotiv...

outro ex:

vou digitar abc: a| b|a c|ba

o | é aquele negocio que fica piscando enquanto você digita
Douglas Soares
Vai no richedit1 e no evento OnChange coloca isso:

CODE
Application.ProcessMessages;


Abraços
brhvitor6
obrigado.. irei testar
brhvitor6
o problema persiste... eu usei um timer para verificar as palavras no richedit e coloquei
CODE
Application.ProcessMessages;

no onchange mas o problema persiste


---------------------------------

Descobri o erro:
CODE
SelStart := 0;
    SelLength := 0;

Mas não sei corrigi-lo...

ele volta para a coluna 0 e linha 0 porq isso ficava voltando.
Jhonas
QUOTE
Em quanto o usuário estiver digitando no richedit algumas palavras se destacam. ex:

ola meu nome é...

A palavra nome foi destacada.


Existe um ou mais posts versando sobre esse assunto ... faça uma pesquisa

http://scriptbrasil.com.br/forum/index.php...ghlite=richedit

abraço
brhvitor6
resolvi mais umas coisa...

mas agora por ex:

eu digito vitor huahuahuahuahua

era para ficar: vitor huahuahuahuahua
mas fica: vitor huahuahuahuahua
Douglas Soares
cara a função Pintar palavras é essa

CODE
function TfrmColorir.PintarPalavras(RichEdit : TRichEdit; Cor : TColor; Negrito : Boolean): string;
var
  FoundAt : LongInt;
  StartPos, ToEnd : integer;
  vBusca : string;
  str : string;
begin
  vBusca := Edit1.text;
  with RichEdit1 do
  begin
    SelStart := 0;
    SelLength := 0;
    repeat
      StartPos := SelStart + SelLength;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(vBusca, StartPos, ToEnd, []);
      if FoundAt < 0 then Break;
      begin
        SelStart := FoundAt;
        SelLength := Length(vBusca);
      end;
      SelAttributes.Color := Cor;
      if Negrito then
      SelAttributes.Style := SelAttributes.Style + [fsBold]
      else
      SelAttributes.Style := SelAttributes.Style - [fsBold]
    until False;
    SelStart := 0;
    SelLength := 0;
    SelAttributes.Color := clWindowText;
  end;
end;


Fiz testes aqui e nenhum dos problemas citados está ocorrendo, tente testar o executável que enviei junto com as fontes, e me diga se nele dá o erro.

Abraços
brhvitor6
com minhas alterações n funciona:

CODE
function PintarPalavras(palavra:string;RichEdit : TRichEdit; Cor : TColor; Negrito : Boolean): string;
var
  FoundAt : LongInt;
  StartPos, ToEnd : integer;
  vBusca : string;
  str : string;
begin
  vBusca := palavra;
  with form1.RichEdit1 do
  begin
    SelStart := 0;
    SelLength := 0;
    repeat
      StartPos := SelStart + SelLength;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(vBusca, StartPos, ToEnd, []);
      if FoundAt < 0 then Break;
      begin
        SelStart := FoundAt;
        SelLength := Length(vBusca);
      end;
      SelAttributes.Color := Cor;
      if Negrito then
      SelAttributes.Style := SelAttributes.Style + [fsBold]
      else
      SelAttributes.Style := SelAttributes.Style - [fsBold]
    until False;
    SelStart := 0;
    SelLength := 0;
    SelAttributes.Color := clWindowText;
  end;
end;


timer 1
CODE
PintarPalavras('vitor',RichEdit1, clblack,true);


o objetivo é que o usuario não tenha que apertar o botão...
Douglas Soares
Porque você está referenciando um componente do form na função sendo que já existe um parametro para isso?

with form1.RichEdit1 do

Fiz como você disse e funcione normal, substitua sua função.

Segue função:

CODE
function Tform1.PintarPalavras(Palavra: string; RichEdit : TRichEdit; Cor : TColor; Negrito : Boolean): string;
var
  FoundAt : LongInt;
  StartPos, ToEnd : integer;
  vBusca : string;
begin
  vBusca := Palavra;
  with RichEdit1 do
  begin
    SelStart := 0;
    SelLength := 0;
    repeat
      StartPos := SelStart + SelLength;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(vBusca, StartPos, ToEnd, []);
      if FoundAt < 0 then Break;
      begin
        SelStart := FoundAt;
        SelLength := Length(vBusca);
      end;
      SelAttributes.Color := Cor;
      if Negrito then
      SelAttributes.Style := SelAttributes.Style + [fsBold]
      else
      SelAttributes.Style := SelAttributes.Style - [fsBold]
    until False;
    SelStart := 0;
    SelLength := 0;
    SelAttributes.Color := clWindowText;
  end;
end;


Não se esqueça de declarar essa função no Type...

CODE
type
  Tform1 = class(TForm)
    RichEdit1: TRichEdit;
    ...............
   procedure ........
   function PintarPalavras(Palavra: string; RichEdit : TRichEdit; Cor : TColor; Negrito : Boolean): string;
   procedure ......
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Abraços
brhvitor6
fiz algumas alterações para que não fique voltando o |...
CODE
function Tform1.PintarPalavras(Palavra: string; RichEdit : TRichEdit; Cor : TColor; Negrito : Boolean): string;
var
  FoundAt : LongInt;
  StartPos, ToEnd : integer;
  vBusca : string;
  v,b:integer;
begin
  vBusca := Palavra;
  with RichEdit1 do
  begin
    v := SelStart;
    b := SelLength;
    SelStart := 0;
    SelLength := 0;
    repeat
      StartPos := SelStart + SelLength;
      ToEnd := Length(Text) - StartPos;
      FoundAt := FindText(vBusca, StartPos, ToEnd, []);
      if FoundAt < 0 then Break;
      begin
        SelStart := FoundAt;
        SelLength := Length(vBusca);
      end;
      SelAttributes.Color := Cor;
      if Negrito then
      SelAttributes.Style := SelAttributes.Style + [fsBold]
      else
      SelAttributes.Style := SelAttributes.Style - [fsBold]
    until False;
    SelStart := v;
    SelLength := b;
    SelAttributes.Color := clWindowText;
  end;
end;


mas continua com o erro que ele n muda so a palavra que eu quero...

era pra ficar:
vitor huahuahuahuahu

mas fica:
vitor huahuahuahuahu
Douglas Soares
Acho que entendi, se você escreve Vitor e poe negrito, quando você digita qualquer outra coisa fica em negrito também não é??
Deu isso comigo aqui vou tentar resolver e te falo em breve..

abraços
brhvitor6
isso mesmo...mas com as cores n tem esse problema... vou tentar também... em quanto isso...

como posso "importar" de um arquivo txt as palavras pensei em importar com o Tmemo mas ele verificaria linha por linha

mas acho que é um loop inutil.
Douglas Soares
pra importar você usa:

CODE
RichEdit1.Lines.LoadFromFile('C:\teste.txt');


Vou ter que sair agora e só volto amanha, muda o tópico do Titulo e acrescenta Jhonas dai ele te da uma força, pois também n sou muito bom em delphi.. hehehe

Abraços
brhvitor6
sim o load file eu já sei... mas n sei como ele pode ver palavra por palavra sem usar um loop toda veiz
Jhonas
QUOTE
sim o load file eu já sei... mas n sei como ele pode ver palavra por palavra sem usar um loop toda veiz


Veja eses posts ... mude o código para seu uso

http://scriptbrasil.com.br/forum/index.php...st&p=574689

http://scriptbrasil.com.br/forum/index.php...st&p=575073

abraço
brhvitor6
dei uma lida... mas ambos usam database... vou tentar me basear nos códigos... qualquer duvida eu posto aqui...
Jhonas
QUOTE
dei uma lida... mas ambos usam database... vou tentar me basear nos códigos... qualquer duvida eu posto aqui...


tirando o database fica assim:

CODE
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    FindDialog1: TFindDialog;
    RichEdit1: TRichEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FindDialog1Find(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin
  FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
  FindDialog1.Execute;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
  X : INTEGER;
  vBusca : string;
begin
  X := 0;

  with RichEdit1 do
  begin
    WHILE X <= RichEdit1.Lines.Count DO
    BEGIN

       if SelLength <> 0 then
         StartPos := SelStart + SelLength
       else
         StartPos := 0;

       ToEnd := Length(Text) - StartPos;

       FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
       if FoundAt <> -1 then
       begin
         SetFocus;
         SelStart := FoundAt;
         SelLength := Length(FindDialog1.FindText);
         SelAttributes.Color := clRed;
         SelAttributes.Style := SelAttributes.Style + [fsBold];
       end;
       INC(X);

    END;
   end;
end;


end.


abraço

brhvitor6
com esse script q você me passou n resolve....

eu importei todas as palavras que quero em um memo e quero que toda vez que eu escreva uma palavra que esteja no memo se destaque no richtext...
Jhonas
QUOTE
com esse script q você me passou n resolve....

eu importei todas as palavras que quero em um memo e quero que toda vez que eu escreva uma palavra que esteja no memo se destaque no richtext...


Voce quer aprender ou quer tudo de bandeja ....rs

se voce olhar o exemplo que te passei no post

http://scriptbrasil.com.br/forum/index.php...st&p=583811

verá que voce pode trocar o database por um memo e conseguir esse resultado ( ou se pesquisar existe um post com essa duvida usando um Memo ) .... então se esforce um pouquinho que voce consegue .... não é dificil

abraço
brhvitor6
Desculpe... mas tudo que aprendi foi sozinho pois nunca tive oportunidade de fazer um curso ou algo parecido.

E quando pessoa ajuda pois não estou conseguindo fazer alguma coisa as pessoas me julgam desta forma...

Pode dar close não precisa mais não.
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.