Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как использовать диалоги? с компонентом Richedit 
:(
    Опции темы
Torn@do
Дата 13.6.2006, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 24.9.2002
Где: Kiev

Репутация: нет
Всего: нет



Приветик.
Я забыл как пользоваться диалогами. На пятом билдере был классный хелп, решались все вопросы. А вот на шестом что-то мне не удаётся вообще ничего найти, что меня интересует. ((

Короче, добавил я диалоги на форму, в элементах управления прописал диалогам метод Execute(). Разобрался только с диалогом печати и диалогом шрифта. Работают. Остались Открыть, Сохранить, Найти, Заменить. Все должны работать с текстом в RichEdit. 
PM MAIL ICQ   Вверх
Link90
Дата 13.6.2006, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Битый" пиксель
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 25.11.2005
Где: Иркутск - середин а земли!

Репутация: 3
Всего: 7



Открыть, Сохранить:
Код

if(OpenDialog1->Execute())
RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName); //Загрузит в RichEdit1 файл, указанный в диалоге

if(SaveDialog1->Execute())
RichEdit1->Lines->SaveToFile(SaveDialog1->FileName); //Сохранит содержимое RichEdit'а в указанный в диалоге файл
  

Это сообщение отредактировал(а) Link90 - 13.6.2006, 09:19
PM MAIL ICQ   Вверх
Torn@do
Дата 13.6.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 24.9.2002
Где: Kiev

Репутация: нет
Всего: нет



Link90, точно! Спасибо.
А не подскажешь, как работают диалоги Найти, Заменить.. ? 
PM MAIL ICQ   Вверх
Link90
Дата 13.6.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Битый" пиксель
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 25.11.2005
Где: Иркутск - середин а земли!

Репутация: 3
Всего: 7



Почитай бильдеровский хелп!!!! Там всё написано! Введи: FindText - это для TFindDialog, а для TReplaceDialog: ReplaceText! 
PM MAIL ICQ   Вверх
Torn@do
Дата 13.6.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 24.9.2002
Где: Kiev

Репутация: нет
Всего: нет



Link90, да про хелп я сразу написал. В пятом билдере всё было отлично. А сейчас у меня шестой стоит. Так вот, всё это я и сам сначала искал. В хелпе написано, какая это афигенно удобная штука, диалог поиска текста (про диалог замены написано, что он такой же, как и поиска) и расписаны опции, которые доступны в окне диалогов, чтоб можно было поменять их в программе. А как ими пользоваться не написано. 
PM MAIL ICQ   Вверх
Kuber
Дата 13.6.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 7.4.2006
Где: #vingrad

Репутация: 1
Всего: 3



Код

FindText Текст - заданный пользователем для поиска или замены. Программно может быть установлен как начальное значение, предлагаемое пользователю
  
ReplaceText - Только в компоненте ReplaceDialog — текст, который должен заменять FindText  
Position  - Позиция левого верхнего угла диалогового окна, заданная типом TPoint — записью, содержащей поля X (экранная координата по горизонтали) и Y (экранная координата по вертикали)  
Left - Координата левого края диалогового окна, то же, что Position.X  
Top - Координата верхнего края диалогового окна, то же, что Position.Y  
Options - Множество опций  
--------------------------------------------------------------------------------
frDisableMatchCase - Делает недоступным индикатор С учетом регистра в диалоговом окне 
 
frDisableUpDown - Делает недоступными в диалоговом окне кнопки Вверх и Вниз группы Направление, определяющие направление поиска
  
frDisableWholeWord - Делает недоступным индикатор Только слово целиком в диалоговом окне
  
frDown - Выбирает кнопку Вниз группы Направление при открытии диалогового окна. Если эта опция не установлена, то выбирается кнопка Вверх
  
frFindNext - Эта опция включается автоматически, когда пользователь в диалоговом окне щелкает на кнопке Найти далее, и выключается при закрытии диалога
  
frHideMatchCase - Удаляет индикатор С учетом регистра из диалогового окна 
 
frHideWholeWord - Удаляет индикатор Только слово целиком из диалогового окна
  
frHideUpDown - Удаляет кнопки Вверх и Вниз из диалогового окна
  
frMatchCase - Этот флаг включается и выключается, если пользователь включает и выключает опцию С учетом регистра в диалоговом окне. Можно установить эту опцию по умолчанию во время проектирования, чтобы при открытии диалога она была включена  

frReplace - Применяется только для ReplaceDialog. Этот флаг устанавливается системой, чтобы показать, что текущее (и только текущее) найденное значение FindText должно быть заменено значением ReplaceText  

frReplaceAll - Применяется только для ReplaceDialog. Этот флаг устанавливается системой, чтобы показать, что все найденные значения FindText должны быть заменены значениями ReplaceText 
 
frShowHelp - Задает отображение кнопки Справка в диалоговом окне 
 
frWholeWord - Этот флаг включается и выключается, если пользователь включает и выключает опцию Только слово целиком в диалоговом окне. Можно установить эту опцию по умолчанию во время проектирования, чтобы при открытии диалога она была включена 


Сами по себе компоненты FindDialog и ReplaceDialog не осуществляют ни поиска, ни замены. Они только обеспечивают интерфейс с пользователем. А поиск и замену надо осуществлять программно. Для этого можно пользоваться событием OnFind, происходящим, когда пользователь нажал в диалоге кнопку Найти далее, и событием OnReplace, возникающим, если пользователь нажал кнопку Заменить или Заменить все. В событии OnReplace узнать, какую именно кнопку нажал пользователь, можно но значениям флагов frReplace и frReplaceAll. 

Поиск заданного фрагмента легко проводить, пользуясь функцией Object Pascal Pos, которая определена в модуле System следующим образом: 

Код

function Pos(Substr: string; S: string): Byte;


где S — строка, в которой ищется фрагмент текста, a Substr — искомый фрагмент. Функция возвращает позицию первого символа первого вхождения искомого фрагмента в строку. Если Substr в S не найден, возвращается 0. 
Для организации поиска нам потребуется еще две функции: Сору и AnsiLowerCase. Первая из них определена как: 

Код

function Copy(S: string; Index, Count: Integer): string;


Она возвращает фрагмент строки S, начинающийся с позиции Index и содержащий число символов, не превышающее Count. Функция AnsiLowerCase, определенная как 

Код

function AnsiLowerCase(const S: string): string;


возвращает строку символов S, переведенную в нижний регистр. 
Теперь мы можем рассмотреть пример организации поиска. Пусть в вашем приложении имеется компонент Memo1 и при выборе раздела меню MFind вы хотите организовать поиск в тексте, содержащемся в Memo1. Для упрощения задачи исключим опцию поиска только целых слов и опцию поиска вверх от положения курсора. 

Программа, реализующая поиск, может иметь следующий вид: 

Код

var SPos: integer;
procedure TForm1.MFindClick(Sender: TObject);
begin
 {запоминание позиции курсора}
 SPos := Memo1.SelStart;
 with FindDialog1 do
 begin
  {начальное   значение  текста поиска —
   текст, выделенный в Memo1}
  FindText := Memo1.SelText;
  {позиционирование окна диалога внизу Memo1}
  Position := Point(Form1.Left, Form1.Top +
              Memo1.Top + Memo1.Height);
  {удаление из диалога кнопок «Вверх», «Вниз»,
   «Только  слово целиком»}
  Options := Options + [frHideUpDown, frHideWholeWord];
  {выполнение}
  Execute;
 end;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
 with FindDialog1 do
 begin
  if frMatchCase in Options
   {поиск с учетом регистра}
   then Memo1.SelStart := Pos(FindText,
    Copy(Memo1.Lines.Text, SPos + 1,
         Length(Memo1.Lines.Text))) + Spos - 1
   {поиск без учета регистра}
   else Memo1.SelStart := Pos(AnsiLowerCase(FindText),
    AnsiLowerCase(Copy(Memo1.Lines.Text, SPos + 1,
                  Length(Memo1.Lines.Text)))) + Spos - 1;
  if Memo1.SelStart >= Spos
   then
    begin
     {выделение найденного текста}
     Memo1.SelLength := Length(FindText);
     {изменение начальной позиции поиска}
     SPos := Memo1.SelStart + Memo1.SelLength + 1;
    end
   else if MessageDlg(
    'Текст "'+FindText+'" не найден. Продолжать диалог?',
    mtConfirmation, mbYesNoCancel, 0) <> mrYes
    then CloseDialog;
 end;
 Memo1.SetFocus;
end;


В программе вводится переменная SPos, сохраняющая позицию, начиная с которой надо проводить поиск. 

Процедура MFindClick вызывает диалог, процедура FindDialog1Find обеспечивает поиск с учетом или без учета регистра в зависимости от флага frMatchCase. После нахождения очередного вхождения искомого текста этот текст выделяется в окне Memo1 и управление передается этому окну редактирования. Затем при нажатии пользователем в диалоговом окне кнопки Найти далее, поиск продолжается в оставшейся части текста. Если искомый текст не найден, делается запрос пользователю о продолжении диалога. Если пользователь не ответил на этот запрос положительно, то диалог закрывается методом CloseDialog. 

В дополнение к приведенному тексту полезно в обработчики событий OnClick и OnKeyUp компонента Memo1 ввести операторы 

Код

SPos := Memo1.SelStart;


Это позволяет пользователю во время диалога изменить положение курсора в окне Memo1. Это новое положение сохранится в переменной SPos и будет использовано при продолжении поиска. 

При реализации команды Заменить приведенные выше процедуры можно оставить теми же самыми, заменив в них FindDialog1 на ReplaceDialog1. Дополнительно можно написать процедуру обработки события OnReplace компонента ReplaceDialog1: 

Код

procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
 if Memo1.SelText <> ''
  then Memo1.SelText := ReplaceDialog1.ReplaceText;
 if frReplaceAll in ReplaceDialog1.Options
  then ReplaceDialog1Find(Self);
end;


Этот код производит замену выделенного текста и, если пользователь нажал кнопку Заменить все, то продолжается поиск вызовом уже имеющейся процедуры поиска ReplaceDialog1Find*. Если же пользователь нажал кнопку Заменить, то производится только одна замена и для продолжения поиска пользователь должен нажать кнопку Найти далее. 
--------------------------------------------------------------------------------
* Предлагаемый автором алгоритм принажатии на кнопку Заменить все заменяет только одно значение и находит следующее. На наш взгляд такия действия более логично было бы задать кнопке Заменить, а для Заменить все организовать цикл. Причем такой цикл проще осуществить в процедуре ReplaceDialog1Find. В приведенном ниже коде кроме того введена локальная переменная ss, так как свойству SelStart нельзя присваивать отрицательные значения.

Код

procedure TForm1.ReplaceDialog1Find(Sender: TObject);
var ss: integer;
    last: Boolean;
    st: string;
begin
 with ReplaceDialog1 do begin
  if (frFindNext in Options) then
    {изменение начальной позиции поиска}
    SPos := Memo1.SelStart + Memo1.SelLength + 1;
  last := not (frReplaceAll in Options);
  repeat
   if frMatchCase in Options
   {поиск с учетом регистра}
   then ss := Pos(FindText,
    Copy(Memo1.Lines.Text, SPos + 1,
         Length(Memo1.Lines.Text))) + Spos - 1
   {поиск без учета регистра}
   else ss := Pos(AnsiLowerCase(FindText),
    AnsiLowerCase(Copy(Memo1.Lines.Text, SPos + 1,
                  Length(Memo1.Lines.Text)))) + Spos - 1;
   if ss >= Spos then
    begin
     {выделение найденного текста}
     Memo1.SelStart := ss;
     Memo1.SelLength := Length(FindText);
     if (frReplaceAll in Options) then begin
      {замена}
      Memo1.SelText := ReplaceDialog1.ReplaceText;
      {изменение начальной позиции поиска}
      SPos := Memo1.SelStart + Memo1.SelLength + 1;
     end;
    end
   else 
    begin
      if (frReplaceAll in Options) or (frReplace in Options) then
         st := 'Замена "' + FindText + '" на "' + ReplaceText + '" закончена'
       else st := 'Текст "' + FindText + '" не найден';
      if MessageDlg(st + '. Продолжать диалог?',
       mtConfirmation, mbYesNoCancel, 0) <> mrYes
       then CloseDialog;
      last:=true;
    end;
  until last;
 end;
end;

procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
 if (frReplace in ReplaceDialog1.Options) and (Memo1.SelText <> '')
   then  Memo1.SelText := ReplaceDialog1.ReplaceText;
 ReplaceDialog1Find(Self);
end;


 
Хоть из Delphi, но думаю тебе поможет.
Взято из А. Я. Архангельский - 100 компонентов общего назначения Delphi5
 
--------------------
Если меня угораздило написать что то умное и вам понравилось, то не забудте нажать [-]...:)    
PM ICQ   Вверх
Torn@do
Дата 14.6.2006, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 24.9.2002
Где: Kiev

Репутация: нет
Всего: нет



Kuber, спасибо!  
PM MAIL ICQ   Вверх
Link90
Дата 14.6.2006, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Битый" пиксель
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 25.11.2005
Где: Иркутск - середин а земли!

Репутация: 3
Всего: 7



Torn@do, у меня тоже 6 бильдер, а ты на ссылку Example жать не пробовал??? 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.