|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
В каком 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
|
|||
|
|||
А посмотреть что приходит в Sender?
обычно там ссылка на вызвавший событие объект. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
ffpereverzev (10.03.2017)
|
#3
|
||||
|
||||
Можно завести под переменную рич типа
Код:
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; Код:
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
|
||||
|
||||
Всем спасибо за ответы! Пока еще не попробовал (только вечером буду иметь возможность). Как только испробую, - сразу же отпишусь.
|
#5
|
||||
|
||||
С одним 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. Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
ffpereverzev (11.03.2017)
|
#6
|
||||
|
||||
Первой была таже мысля с попапкой, но
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ffpereverzev (11.03.2017)
|
#7
|
||||
|
||||
Вариант с Popup отпугнул автора потому что он решил что это будет громоздко и нужны меню для каждого редактора. Что не соответствует действительности. На самом деле все очень просто: одно меню на все редакторы и один обработчик на все элементы = одна процедура кода)
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
ffpereverzev (11.03.2017)
|
#8
|
|||||
|
|||||
Цитата:
Цитата:
Цитата:
Цитата:
Так что ОГРОМНОЕ спасибо всем откликнувшимся! Спасибо за Ваше понимание и за то, что мое незнание не стало поводом для неудачных шуток. |