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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.03.2017, 00:30
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
Вопрос В каком RichEdit нажата кнопка?

И снова здравствуйте!
Хотел бы поинтересоваться у глубокоуважаемых форумчан таким вопросом: как можно сделать перебор по RichEdit? (ответ "в цикле" не устраивает, так как это и так понятно. Вопрос "КАК?").

Объясню суть проблемы:

Есть n-ое количество RichEdit (допустим, 10). Я создал ActionList с корректировкой свойств шрифта (жирный, курсив, подчеркнутый). При описании первого же Action-а я столкнулся с проблемой: как понять, в каком из RichEdit-ов было замечено нажатие правой кнопки мыши?
Может, Вы, уважаемые форумчане, подскажете как это можно сделать или предложите более адекватный или простой путь к решению данной проблемы?

P.S. Вариант с PopupMenu не предлагать, так как получится очень громоздко и делать придется для каждого RichEdit в отдельности (если я все правильно понимаю). Я, во всяком случае, сделал с ним вот это:

Код:
// Обрабатываем процедуру выделения текста "Жирный"
procedure TForm1.N4Click(Sender: TObject);
var t:string;
 begin
  t:=RichEdit1.SelText;
  RichEdit1.SelStart:=pos(t,RichEdit1.Text)-1;
  RichEdit1.SelLength:=Length(t);
  with RichEdit1.SelAttributes do
   begin
     if Style<>[fsBold] then
      Style:=Style+[fsBold]
     else
      Style:=Style-[fsBold];
   end;
  t:='';
  RichEdit1.SetFocus;
end;

// Обрабатываем процедуру выделения текста "Курсив"
procedure TForm1.N8Click(Sender: TObject);
var t:string;
 begin
  t:=RichEdit1.SelText;
  RichEdit1.SelStart:=pos(t,RichEdit1.Text)-1;
  RichEdit1.SelLength:=Length(t);
  with RichEdit1.SelAttributes do
   begin
     if Style<>[fsItalic] then
      Style:=Style+[fsItalic]
     else
      Style:=Style-[fsItalic];
   end;
  t:='';
  RichEdit1.SetFocus;
end;

// Обрабатываем процедуру выделения текста "Подчеркнутый"
procedure TForm1.N9Click(Sender: TObject);
var t:string;
 begin
  t:=RichEdit1.SelText;
  RichEdit1.SelStart:=pos(t,RichEdit1.Text)-1;
  RichEdit1.SelLength:=Length(t);
  with RichEdit1.SelAttributes do
   begin
     if Style<>[fsUnderline] then
      Style:=Style+[fsUnderline]
     else
      Style:=Style-[fsUnderline];
   end;
  t:='';
  RichEdit1.SetFocus;
end;
Ответить с цитированием
  #2  
Старый 08.03.2017, 20:04
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А посмотреть что приходит в Sender?
обычно там ссылка на вызвавший событие объект.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
ffpereverzev (10.03.2017)
  #3  
Старый 10.03.2017, 04:17
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно завести под переменную рич типа
Код:
var
  Form1: TForm1;
  ds: TRichEdit;
...
и тогда явно указывать при отпускании ПКМ
Код:
procedure TForm1.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if Button = mbRight then
  ds:= Sender as TRichEdit;
end;
если задать этот обработчик для всех ричей, будет работать только от клика мышки, или ещё можно определить RichEdit где .SelText <> '', без перебора компонентов правда не обойтись
Код:
function TForm1.IsSelText: boolean;
var
i: integer;
begin
 Result:= false;
 for i := 0 to ComponentCount - 1 do
   if Components[i] is TRichEdit then
    if (Components[i] as TRichEdit).SelText <> '' then
     begin
      Result:= true;
      ds:= Components[i] as TRichEdit;
     end;
end;
а в коде тогда так
Код:
// Обрабатываем процедуру выделения текста "Жирный"
procedure TForm1.N4Click(Sender: TObject);
var
t:string;
 begin
  if IsSelText then
   begin
  t:=ds.SelText;
  ds.SelStart:=pos(t,ds.Text)-1;
  ds.SelLength:=Length(t);
  with ds.SelAttributes do
   begin
     if Style<>[fsBold] then
      Style:=Style+[fsBold]
     else
      Style:=Style-[fsBold];
   end;
  t:='';
  ds.SetFocus;
  end;
  end;
будет работать с любым рич, где есть выделенный текст
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ffpereverzev (10.03.2017)
  #4  
Старый 10.03.2017, 13:32
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Всем спасибо за ответы! Пока еще не попробовал (только вечером буду иметь возможность). Как только испробую, - сразу же отпишусь.
Ответить с цитированием
  #5  
Старый 10.03.2017, 14:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

С одним PopupMenu на все 100500 RichEdit делается очень просто:

Код:
procedure TForm1.PopupMenu1Click(Sender: TObject);
begin
  if (PopupMenu1.PopupComponent is TRichEdit) and (Sender is TMenuItem) then
  begin
    with TRichEdit(PopupMenu1.PopupComponent) do
    if Sender=fsBold1 then SelAttributes.Style:=[fsBold]
    else if Sender=fsItalic1 then SelAttributes.Style:=[fsItalic]
    else if Sender=fsUnderline1 then SelAttributes.Style:=[fsUnderline]
  end;
end;

Всем RichEdit свойству PopupMenu назначается один компонент PopupMenu1. Всем обработчикам OnClick элементов меню PopupMenu1 для упрощения назначается одно событие PopupMenu1Click.
Вложения
Тип файла: zip RichEdit.zip (2.1 Кбайт, 1 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
ffpereverzev (11.03.2017)
  #6  
Старый 10.03.2017, 14:30
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Первой была таже мысля с попапкой, но
Цитата:
Сообщение от ffpereverzev
...Вариант с PopupMenu не предлагать...
привязать к пункту "обычного" меню по-другому вроде как не получится, окромя как проверять в каком риче фокус выделения
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ffpereverzev (11.03.2017)
  #7  
Старый 10.03.2017, 15:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Вариант с Popup отпугнул автора потому что он решил что это будет громоздко и нужны меню для каждого редактора. Что не соответствует действительности. На самом деле все очень просто: одно меню на все редакторы и один обработчик на все элементы = одна процедура кода)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
ffpereverzev (11.03.2017)
  #8  
Старый 11.03.2017, 15:24
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Первой была таже мысля с попапкой, но
Цитата:
Сообщение от ffpereverzev
...Вариант с PopupMenu не предлагать...
привязать к пункту "обычного" меню по-другому вроде как не получится, окромя как проверять в каком риче фокус выделения
Уважаемый Alegun, прошу прощения что ввел Вас в заблуждение, но ведь действительно, я именно так и думал, как написал не менее уважаемый NumLock:
Цитата:
Сообщение от NumLock
Вариант с Popup отпугнул автора потому что он решил что это будет громоздко и нужны меню для каждого редактора.
Я и не понял, что можно было:
Цитата:
Сообщение от NumLock
С одним PopupMenu на все 100500 RichEdit делается очень просто:

Код:
procedure TForm1.PopupMenu1Click(Sender: TObject);
begin
  if (PopupMenu1.PopupComponent is TRichEdit) and (Sender is TMenuItem) then
  begin
    with TRichEdit(PopupMenu1.PopupComponent) do
    if Sender=fsBold1 then SelAttributes.Style:=[fsBold]
    else if Sender=fsItalic1 then SelAttributes.Style:=[fsItalic]
    else if Sender=fsUnderline1 then SelAttributes.Style:=[fsUnderline]
  end;
end;

Всем RichEdit свойству PopupMenu назначается один компонент PopupMenu1. Всем обработчикам OnClick элементов меню PopupMenu1 для упрощения назначается одно событие PopupMenu1Click.
Но, во всяком случае, это полностью соответствует моей доктрине:
Цитата:
Сообщение от ffpereverzev
Может, Вы, уважаемые форумчане, подскажете как это можно сделать или предложите более адекватный или простой путь к решению данной проблемы?

Так что ОГРОМНОЕ спасибо всем откликнувшимся! Спасибо за Ваше понимание и за то, что мое незнание не стало поводом для неудачных шуток.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter