Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.04.2010, 13:47
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию почему не выделяется текст в RichEdit?

Не могу понять , почему при нажатии кнопки в рич эдите подстрока выделяется только в первой строке, хотя проверенно что цикл проходит все строки текста. Работаю в 2009 Delphi

Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var j:integer;
s:string;
begin
for j:=0 to RichEdit1.Lines.Count-1 do
begin
  s:= RichEdit1.Lines[j] ;
  RichEdit1.SelStart:= pos(Edit1.Text,s)-1;
  RichEdit1.SelLength:=length(Edit1.Text);
  RichEdit1.SelAttributes.Color:= clRed;
end;
end;

end.
Ответить с цитированием
  #2  
Старый 12.04.2010, 15:57
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Код:
var
  j, l, Count :integer;
  s:string;
  textpos :string;
begin
  Count:=0;
  textpos:=edit1.Text;
  for j:=0 to RichEdit1.Lines.Count-1 do
    begin
      s:= RichEdit1.Lines[j];
      l := Pos(textpos, s);
      if l <> 0 Then
        begin
          RichEdit1.SelStart:= Count+l-1;
          RichEdit1.SelLength:=length(textpos);
          RichEdit1.SelAttributes.Color:= clRed;
        end;
      Count:=Count+LENGTH(S)+2;
    end;
end;

вот еще
Код:
Function TextColor(RE :TrichEdit; const TextPos :string; TextColor :TColor):integer;
var
  j, l, Count :integer;
  s:string;
begin
  Result:=0;
  Count:=0;
  for j:=0 to RE.Lines.Count-1 do
    begin
      s:= RE.Lines[j];
      l := Pos(textpos, s);
      if l <> 0 Then
        begin
          RE.SelStart:= Count+l-1;
          RE.SelLength:=length(textpos);
          RE.SelAttributes.Color:= TextColor;
          inc(result);
        end;
      Count:=Count+LENGTH(S)+2;
    end;
end;
Код:
 ShowMessage('Закрашено '+IntToStr(TextColor(RichEdit1, Edit1.Text, clRed))+' вхождений текста');
проверено на Delphi 7

Последний раз редактировалось pesi, 12.04.2010 в 16:13.
Ответить с цитированием
  #3  
Старый 12.04.2010, 18:09
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

pesi, уже ближе подправил
Код:
 Count:=Count+LENGTH(S)+2;
на
Код:
 Count:=Count+LENGTH(S)+1;
выделяет всё правильно, но только первое вхождение в каждой строке, остальные не выделяет, попробую доработать
Ответить с цитированием
  #4  
Старый 12.04.2010, 23:11
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Код:
function TextColorReplace( RE :TRichEdit; TextPos :string; TextColor :TColor; Flags: TReplaceFlags ): Integer;
var
  SearchStr : string;
  Offset: Integer;
  i :integer;
  TextLength :integer;
begin
  Result := 0;
  SearchStr := re.Text;
  i := 0;
  Offset := 1;
  TextLength := length(TextPos);

if rfIgnoreCase in Flags then
  begin
    SearchStr := AnsiUpperCase(SearchStr);
    TextPos := AnsiUpperCase(TextPos);
  end;

if not (rfReplaceAll in Flags) then
  begin
   Offset := Pos(TextPos, SearchStr);
   if Offset <> 0 then
   begin
    RE.SelStart := Offset-1;
    RE.SelLength := TextLength;
    RE.SelAttributes.Color := TextColor;
    Inc(Result);
   end;
  end
else
  while Offset <> 0 do
  begin
    Offset := PosEx(TextPos, SearchStr, i);
    if Offset <> 0 then
    begin
      RE.SelStart := Offset-1;
      RE.SelLength := TextLength;
      RE.SelAttributes.Color := TextColor;
      Inc(Result);
      i := Offset+1;
    end;
  end;
end;

Код:
Application.MessageBox(PChar('Закрашено '+IntToStr(TextColorReplace(RichEdit1, 'и', clred, [rfReplaceAll, rfIgnoreCase]))+' вхождений текста'), PChar('Количество вхождений текста'), MB_OK	);

Последний раз редактировалось pesi, 13.04.2010 в 15:18.
Ответить с цитированием
  #5  
Старый 13.04.2010, 15:24
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Подправил функцию выше
Ответить с цитированием
  #6  
Старый 14.04.2010, 07:13
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

pesi, СПАСИБО !!!!! Дошлифовал, всё работает!!!

PS: а как тут репутацию добавлять ?
Ответить с цитированием
  #7  
Старый 14.04.2010, 14:01
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

Цитата:
Сообщение от kaizer131
всё работает!!!
Рано порадовался , всё равно в некоторых моментах возникают неправильные сдвиги, может есть какие либо невидимые символы помимо
#10#13 которые портят картину.
Что интересно сдвиги иногда смещаюстя в право на кол-во символов равное кол-ву пройденных строк, но не всегда.
Ответить с цитированием
  #8  
Старый 14.04.2010, 14:05
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

Есть ещё одна странность , если вручную печатаю в рич едите , то всё в порядке, а если загружаю текст через опен диалог или копирую из файла Ctrl+C и Ctrl+V, то получаются неправильные сдвиги

Последний раз редактировалось kaizer131, 14.04.2010 в 14:07.
Ответить с цитированием
  #9  
Старый 14.04.2010, 15:00
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

попробуй ето
Ответить с цитированием
  #10  
Старый 14.04.2010, 15:19
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

Исходник работает корректно
Ответить с цитированием
  #11  
Старый 14.04.2010, 15:30
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Может проблеммы из-за 2009 Delphi?
Ответить с цитированием
  #12  
Старый 14.04.2010, 16:47
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

незнаю, сейчас пошагово пройду программу, может выловлю баг
Ответить с цитированием
  #13  
Старый 14.04.2010, 17:52
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

Хм, в некоторых местах текста присутствуют лишние символы #$D онже вроде #13 ,перевод строки или конец вводимых данных. Незнаю точно но есть вероятность что дело в них

Последний раз редактировалось kaizer131, 14.04.2010 в 18:16.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter