![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
И снова здравствуйте!
Хотел бы поинтересоваться у глубокоуважаемых форумчан таким вопросом: как можно сделать перебор по 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
|
|||||
|
|||||
|
Цитата:
Цитата:
Цитата:
Цитата:
Так что ОГРОМНОЕ спасибо всем откликнувшимся! Спасибо за Ваше понимание и за то, что мое незнание не стало поводом для неудачных шуток. ![]() |