Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2009, 17:31   #1
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию Доступность Undo/Redo и редактирование текста в TRichEdit

1) На форме есть TRichEdit, TPopupActionBar. Хочу сделать чтобы пункты меню Undo и Redo были доступны только тогда, когда были произведены изменения.
С кнопками "Вставить" и "Копировать" я разобрался сам. Для компонента TPopupActionBar в обработчик события OnPopup я написал вот этот код:

procedure TForm1.PopupActionBar1Popup(Sender: TObject);
begin
Cut.Enabled := RichEdit1.SelLength > 0;
Copy.Enabled := RichEdit1.SelLength > 0;
Paste.Enabled := Clipboard.HasFormat(CF_TEXT);
end;

Возможно ли подобным образом проделать тоже самое и с Undo и Redo?

2) Для кнопки "Выделить все" я написал такой код:

SelectAllPopup.Enabled := RichEdit1.SelStart > 0;
но мне кажется что он немного кривоват

Последний раз редактировалось Ser11; 11.08.2009 в 13:36.
Ser11 вне форума Ответить с цитированием
Старый 10.08.2009, 17:47   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

1) Отчего же нельзя, можно. Но нужно историю хранить. Когда подошли к концу истории - делаем пункт Повторить неактивным, подошли к началу - делаем Отменить не активным.

2) По логике этот пункт должен быть активен когда есть что выделять. Просто проверяйте или документ не пустой, и все. Например так:
if RichEdit1.Lines.Text='' //значит пустой
Правда я не проверял или так можно с RichEdit, оставляю это вам )
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 11.08.2009, 13:41   #3
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию

mutabor, благодарю за подсказку. Кое что уже начинает получаться.
Хотел еще спросить как правильно реализуется нажатие кнопки Aplly для компонента FontDialog?
Я сделал так, только не знаю правильно или нет:
Код:
procedure TForm1.FontDialog1Apply(Sender: TObject; Wnd: HWND);
begin
RichEdit1.SelAttributes.Assign(FontDialog1.Font);
end;
И еще было бы неплохо разобраться с тем, как выделенный текст переводится в верхний/нижний регистр в компоненте TRichEdit.
Ser11 вне форума Ответить с цитированием
Старый 11.08.2009, 13:54   #4
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Напишите вот так:
Код:
procedure TForm1.FontDialog1Apply(Sender: TObject; Wnd: HWND);
begin
 RichEdit1.SelAttributes.Assign(TTextAttributes(FontDialog1.Font));
end;
А регистр еще легче, вот:
Код:
//В верхний
procedure TForm1.bt_3Click(Sender: TObject);
begin
 RichEdit1.SetSelText(UpperCase(RichEdit1.SelText));
 RichEdit1.SetFocus;
end;
//В нижний
procedure TForm1.bt_2Click(Sender: TObject);
begin
 RichEdit1.SetSelText(LowerCase(RichEdit1.SelText));
 RichEdit1.SetFocus;
end;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 11.08.2009, 15:06   #5
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию

Еще раз благодарю всех за помощь, большое спасибо.
Выловил у себя в коде баг. При изменении шрифта например с Arial на Lucida Fax русские буквы заменялись на нечитаемые сиволы. Вот из-за этого кода:
Код:
RichEdit1.SelAttributes.Charset := FontDialog1.Font.Charset;
Как только его убрал, все встало на свои места.
Ser11 вне форума Ответить с цитированием
Старый 11.08.2009, 15:27   #6
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию

Neeter, а процедуры для верхнего/нижнего регистра надо объявить в private?
Ser11 вне форума Ответить с цитированием
Старый 11.08.2009, 15:51   #7
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Нет, что вы, это просто обработчики кнопок)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 11.08.2009, 16:03   #8
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию

У меня делфи2009 выводит ошибку:
Цитата:
Incompatible types: 'string' and 'TAction'
Missing operator or semicolon
Ser11 вне форума Ответить с цитированием
Старый 11.08.2009, 16:09   #9
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Что-то вы не то делаете...
Код приведите...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 11.08.2009, 16:25   #10
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию

Во всплывающем меню обработчик события:

Код:
procedure TForm1.UpperCaseClick(Sender: TObject);
begin
RichEdit1.SetSelText(UpperCase(RichEdit1.SelText));
RichEdit1.SetFocus;
end;
Ser11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация Undo и Redo Bayazet Общие вопросы Delphi 5 03.03.2009 15:48
Undo на форме yulia Общие вопросы Delphi 1 16.11.2008 17:22
Undo-Redo NeiL Общие вопросы Delphi 8 14.03.2008 19:04
Undo, Redo Xardas Общие вопросы Delphi 1 24.01.2008 19:35
Меню, создание нового пункта Yogik™ Помощь студентам 2 17.08.2007 17:32