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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.06.2011, 22:37
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию неправильное выделение в RichEdit

Посмотрите пожалуйста,по нажатию на конпку программа сканирует файлы/папки в своей директории,и выводит названия в ричедит. Если встречается папка то она выделяется жирным.
Но у меня почемутои папки и файлы выделяются,и еще,если после того как все папки показались,попробовать просто написать в этот ричедит,то написанный текст жирный.хотя жиирность задаю вродебы только к выделенной области
Код:
procedure TForm1.Button1Click(Sender: TObject);
var sr: TSearchRec;
x,strt,lengt:integer;
begin
RichEdit1.lines.Add('');
x:= RichEdit1.Lines.Count;
 if FindFirst(ExtractFilePath(ParamStr(0))+'\*.*', faAnyFile, sr) = 0 then
  begin
  repeat
  if FileExists(sr.Name) then lengt:=length(sr.Name);
  strt:=Length(RichEdit1.Text); //запоминаем позицию с которой выделять.
  RichEdit1.Lines[x]:=RichEdit1.Lines[x]+   (sr.Name)+'  ';
  if DirectoryExists(sr.Name) then //если папка то делаем её жирной
    begin
    //ShowMessage(sr.Name);
    RichEdit1.SelStart:=strt;
    RichEdit1.SelLength:=lengt;
    RichEdit1.SelAttributes.Style:= [fsBold];
    end;
  until FindNext(sr) <> 0;
  FindClose(sr);
 end;
end;
Вложения
Тип файла: zip Project1.zip (6.1 Кбайт, 2 просмотров)
Ответить с цитированием
  #2  
Старый 14.06.2011, 23:00
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  sr    : TSearchRec;
  Len  : Integer;
begin
  Len := 0;
  RichEdit1.Lines.Clear;
  if FindFirst(ExtractFilePath(ParamStr(0)) + '\*.*', faAnyFile, sr) = 0 then
  begin
    repeat
      if sr.Attr and faDirectory <> 0 then
        RichEdit1.SelAttributes.Style := [fsBold]
      else
        RichEdit1.SelAttributes.Style := [];

      RichEdit1.Lines.Add(sr.Name);
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
  RichEdit1.Lines.Add('');
  RichEdit1.Lines.Add('Сканирование завершено.');
end;

Последний раз редактировалось angvelem, 14.06.2011 в 23:05.
Ответить с цитированием
  #3  
Старый 15.06.2011, 13:30
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

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

Не смеши, замени RichEdit1.Lines.Add(sr.Name) на то, что было у тебя. А свой бредовый способ выделения выкинь.
Ответить с цитированием
  #5  
Старый 16.06.2011, 12:07
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  sr: TSearchRec;
  i:integer;
  sDir:array of array [0..1] of Cardinal;
begin
RichEdit1.Clear;
 if (FindFirst(ExtractFilePath(ParamStr(0))+'\*.*', faAnyFile, sr) = 0) then
  begin
  repeat
  RichEdit1.Text:=RichEdit1.Text+sr.Name+' ';
  if sr.Attr and faDirectory <> 0 then //если папка то делаем её жирной
    begin
      SetLength(sDir,Length(sDir)+1);
      sDir[Length(sDir)-1,0]:=length(sr.Name);
      sDir[Length(sDir)-1,1]:=length(RichEdit1.Text)-length(sr.Name)-1;
    end;

  until FindNext(sr) <> 0;
  for i:=0 to Length(sDir)-1 do
    begin
      RichEdit1.SelStart:=sDir[i,1];
      RichEdit1.SelLength:=sDir[i,0];
      RichEdit1.SelAttributes.Style := [fsBold];
    end;
  FindClose(sr);
  sDir:=nil;
 end;
end;
Ответить с цитированием
  #6  
Старый 17.06.2011, 22:44
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Слишком усложнёно, смотри выше.
Ответить с цитированием
  #7  
Старый 18.06.2011, 15:45
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Цитата:
Сообщение от angvelem
Не смеши, замени RichEdit1.Lines.Add(sr.Name) на то, что было у тебя. А свой бредовый способ выделения выкинь.
заменял,
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  sr    : TSearchRec;
  Len  : Integer;
begin
  Len := 0;
  if FindFirst(ExtractFilePath(ParamStr(0)) + '\*.*', faAnyFile, sr) = 0 then
  begin
    repeat
      RichEdit1.Text:= RichEdit1.Text+ sr.Name+'  ';
      if sr.Attr and faDirectory <> 0 then
       begin
        RichEdit1.SelStart:=Length(RichEdit1.Text)-length(sr.Name)-2;
        RichEdit1.SelLength:=Length(sr.Name);
        RichEdit1.SelAttributes.Style := [fsBold];
        end;
    until FindNext(sr) <> 0;
    FindClose(sr);
  end;
  RichEdit1.Lines.Add('');
end;
и выделяет только последнюю папку,
всё прежнее форматирование сбрасывается(
Janom спс работает)

Последний раз редактировалось Snake22, 18.06.2011 в 16:23.
Ответить с цитированием
  #8  
Старый 18.06.2011, 16:25
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ага,врубился,это оказывается при добавлени текста с сохранением предыдущего, форматирование сбрасывается!!
richedit1.text:=richedit1.text+'text';
блиин!
можно както сохранить форматирование? а то если нельзято это пипец((
Ответить с цитированием
  #9  
Старый 18.06.2011, 22:59
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Snake22
можно както сохранить форматирование? а то если нельзято это пипец((

Форматирование добавляется к строке или выделенному фрагменту. При использовании
Код:
  RichEdit1.Text := RichEdit1.Text + sr.Name + '  ';
затирается старое значение формата из-за особенностей реализации RichEdit-а в VCL. Приходится использовать POST-форматирование, когда вся строка сформирована. Если не подходит по-строчное добавление, то вариант Janom или вот похожий вариант (по сути, тоже самое).

Код:
procedure TForm1.Button2Click(Sender: TObject);
type
  TPos = TPoint;
var
  sr : TSearchRec;
  I  : Integer;
  fp : array of TPos;
begin
  RichEdit1.Lines.Clear;
  I := 0;
  if FindFirst(ExtractFilePath(ParamStr(0)) + '\*.*', faAnyFile, sr) = 0 then
    with RichEdit1.SelAttributes do
    begin
      repeat
        if sr.Attr and faDirectory <> 0 then
        begin
          inc(I);
          SetLength(fp, I);
          fp[I - 1].X := Length(RichEdit1.Text);
          fp[I - 1].Y := Length(sr.Name);
        end;
        RichEdit1.Text := RichEdit1.Text + sr.Name + ' ';
      until FindNext(sr) <> 0;
      FindClose(sr);

      for I := 0 to Length(fp) - 1 do
      begin
        RichEdit1.SelStart  := fp[i].X;
        RichEdit1.SelLength := fp[i].Y;
        Style := [fsBold];
        Color := clRed;
      end;

      RichEdit1.Lines.Add('');
      RichEdit1.Lines.Add('Сканирование завершено.');
    end;
end;

Последний раз редактировалось angvelem, 18.06.2011 в 23:19.
Ответить с цитированием
  #10  
Старый 19.06.2011, 00:02
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

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

Планируй форматирование для уже готовой строки и проблемы исчезнут.
Ответить с цитированием
  #12  
Старый 04.07.2011, 19:26
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

нашел способ как добалвять без потери предыдущего форматирования.
посылаем сообщение
Код:
SendMessage(RichEdit1.Handle, EM_REPLACESEL, 0, integer(PCHAR('Текст!')));
текст вставляется от курсора,т.е. курсор должен в конце находится.
может кому пригодится =)
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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