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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.10.2011, 23:32
vasa911 vasa911 вне форума
Прохожий
 
Регистрация: 21.10.2011
Сообщения: 4
Репутация: 10
По умолчанию Окраска букв в RichEdit

Добрый вечер.Есть цель, загрузить текст в RichEdit, и окрасить определённые буквы, сделать это надо так, запомнить позиции в тексте определённой буквы, и по этим позиция окрасить.
Проблема в том, что после первого абзаца раскраска как-бы съезжает , не могу понять почему.
Заранее благодарен за помощь.
П.С. прилагаю текст, который загружают.

Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  Path:string;// путь к текстовому файлу
  bufpoiska:string;
  positionbukv: array[0..1000] of integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);//Загрузка текста
var
  UserName : string;
  UserNameLen : Dword;
begin
UserNameLen := 255;
  SetLength(userName, UserNameLen);
  if GetUserName(PChar(UserName), UserNameLen) then
    UserName := Copy(UserName,1,UserNameLen - 1);

OpenDialog1.InitialDir:='C:\Users\'+UserName+'\Desktop\';
if OpenDialog1.Execute then
  Path:=OpenDialog1.FileName;
RichEdit1.Lines.LoadFromFile(Path);

end;

procedure TForm1.Button2Click(Sender: TObject);//Запоминание позиции
var
n,j,z:Integer;
begin

     bufpoiska:=Edit1.Text;
     z:=0;

    for j := 1 to Length(RichEdit1.text) do
    begin
          if RichEdit1.text[j]=bufpoiska then
          begin
          positionbukv[z]:=j;
          inc(z);
          end;
    end;
end;



procedure TForm1.Button3Click(Sender: TObject); //Окраска по позициям
var
 i: integer;
begin
 i:=0;
 while positionbukv[i]<>0 do
  begin
    RichEdit1.SelStart:=positionbukv[i]-1;
    Richedit1.SelLength:=1;
    Richedit1.SelAttributes.Color:=clRed;
    inc(i);
  end;

end;

end.
Вложения
Тип файла: txt 1.txt (4.7 Кбайт, 4 просмотров)
Ответить с цитированием
  #2  
Старый 22.10.2011, 00:12
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

хм вроде всё норм!
Ответить с цитированием
  #3  
Старый 22.10.2011, 00:45
vasa911 vasa911 вне форума
Прохожий
 
Регистрация: 21.10.2011
Сообщения: 4
Репутация: 10
По умолчанию

ты мой код вставлял или свой написал?
если свой то покажи пожалуйста
Ответить с цитированием
  #4  
Старый 22.10.2011, 00:55
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я так понимаю, что Snake22 проверял код в Дельфи7. В нём действительно всё нормально, проверил в Дельфи2009 - плывёт. Пока не ясно почему.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 22.10.2011, 01:00
vasa911 vasa911 вне форума
Прохожий
 
Регистрация: 21.10.2011
Сообщения: 4
Репутация: 10
По умолчанию

вот я тоже так подумал, у меня delphi XE и плывёт, после каждого абзаца на 2 символа
Ответить с цитированием
  #6  
Старый 22.10.2011, 01:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Так и есть, но не улавливаю, почему. Сравниваю отдаваемый текст в 7-ке и 2009-ом, текст отдаётся одинаковый. Ещё посмотрю.

Как и предполагал, учитывются символы переноса строки. Такой вариант спасёт "отца русской демократии":
Код:
 
procedure TForm2.Button2Click(Sender: TObject);
var
  j, z : Integer;
  St : String;
begin
  z := 0;
  St := StringReplace(RichEdit1.Text, #13#10, ' ', [rfReplaceAll]);
  for j := 1 to Length(St) do
  begin
    if St[j] = Edit1.Text then
    begin
      positionbukv[z] := j;
      inc(z);
    end;
  end;
end;
Но... тут нужно учитывать в какой версии Дельфи компилится. В 7-ке такая поправка исказит результат
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 22.10.2011 в 01:19.
Ответить с цитированием
  #7  
Старый 22.10.2011, 11:35
vasa911 vasa911 вне форума
Прохожий
 
Регистрация: 21.10.2011
Сообщения: 4
Репутация: 10
По умолчанию

Огромное спасибо, так как я пытался сделать, то что вы предложили уже на окраске, а надо было ещё на подсчете позиции.Недодумал((
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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