![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, форумчане. Хотелось бы спросить вашего совета по следующей проблеме.
На форме приложения имеется многострочное поле ввода (на данный момент Richedit), в котором необходимо предусмотреть как ручной ввод текста пользователем, так и вставку нередактируемых блоков со служебной информацией (если пользователь перемещается по тексту, то данные блоки должны игнорироваться). Само содержание поля планирую сохранять в формате xml или т.п. Также (опционально) было бы еплохо реализовать возможность осуществления какого-либо действия по клику на конкретный блок со служебной информацией. Для понятности привожу картинку. Оранжевым выделены служебные блоки, которые пользователь не может редактировать. Обычный текст - редактируется пользователем. Буду благодарен за любые предложения по реализации подобного, быть может, имеются какие-либо сторонние бесплатные компоненты, которые позволят реализовать эту идею. Безымянный.png |
|
#2
|
||||
|
||||
|
RichEdit поддерживает вставку изображений, на рисунках можно организовать нередактируемые блоки, с гиперссылками немного сложнее, поскольку без заморочек он может открыть лишь стандартные (типа httр:\\..), есть другие, более богатые в плане возможностей редакторы, а может лучше подобный функционал воссоздать на браузерной подложке. Ну или вот частичный вариант на риче, всё что успел найти
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
i: integer;
cRect: TRect;
bm: TBitmap;
Format: CHARFORMAT2;
begin
with RichEdit1 do
begin
SelStart:= Length(Text);
Perform(EM_SCROLLCARET, 0, 0);
FillChar(Format, SizeOf(Format), 0);
with Format do
begin
cbSize:= SizeOf(Format);
dwMask:= CFM_BACKCOLOR;
crBackColor:= clFuchsia;
Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
end;
SelAttributes.Style:= [fsBold];
s:= FormatDateTime('hh:nn:ss', Now);
Windows.GetClientRect(Handle, cRect);
bm:= TBitmap.Create;
bm.Width:= cRect.Right;
bm.Height:= cRect.Bottom;
bm.Canvas.Font:= Font;
while bm.Canvas.TextWidth(s) < CRect.Right do s:= s + ' ';
Lines.Add(s);
s:= Edit1.Text;
while bm.Canvas.TextWidth(s) < CRect.Right do s:= s + ' ';
bm.Free;
with Format do
begin
cbSize:= SizeOf(Format);
dwMask:= CFM_BACKCOLOR or CFM_LINK or CFM_PROTECTED or CFM_UNDERLINE or CFM_COLOR;
crBackColor:= clFuchsia;
Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
end;
SelAttributes.Style:= [fsBold];
Lines.Add(s);
Lines.Add('');
Lines.Add(Memo1.Text);
end; |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Kraeved (21.03.2016)
| ||
|
#3
|
|||
|
|||
|
Такая проблема: Не могу никак скопировать форматированный текст из RichEdit в DBRichEdit.
Текст программы такой: Цитата:
Дальше, получается, что скопированный текст в БД в DBRichEdit отображается "без форматный". |
|
#4
|
||||
|
||||
|
Не всё так просто, свойство Text у любого компонента объявлено как String, отсюда и передаётся только текст, без формата. Чтоб и его показать, следует задействовать поток, требуется ведь воспроизвести содержимое одного RichEdit в другом полностью (формально передаётся виртуальный файл *.rtf), со всеми финтами, и делается это примерно так
Код:
var MemoryStream:TMemoryStream; begin MemoryStream:=TMemoryStream.Create; try RichEdit1.Lines.SaveToStream(MemoryStream); MemoryStream.Seek(0, soFromBeginning); DM.ADOQueryRichText.Lines.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; end; З.Ы. Под DM.ADOQueryRichText ясенперец подразумевается не поле, а DBRichEdit Последний раз редактировалось Alegun, 21.03.2016 в 16:14. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Kraeved (22.03.2016)
| ||
|
#5
|
|||
|
|||
|
Все заработало.
Теперь другая проблема. Нужно к RichEdit подсоединить кнопку из toolbar-а, при нажатии на которую, в текст вставляется стандартный шаблон типа простой формулы с надстрочными и подстрочными символами. Хотелось бы шаблоны в виде скрипта какого-нибудь сохранить как константу в коде программы. Также желательно вставить кнопки в toolbar, которые форматируют текст RichEdit-а в надстрочный/подстрочный. Стандартные Action в Delphi 7 этого не умеют. Еще нужно несколько греческих символов на кнопки выложить .... для вставки их в текст RichEdit. Частично здесь нашел решение проблемы. Теперь осталось узнать как извлечь скрипт из rtf-текста, который будет шаблоном. Последний раз редактировалось Kraeved, 22.03.2016 в 12:19. |
|
#6
|
||||
|
||||
|
В принципе самое простое - это делать форматные вставки с помощью клипборда, копипастой, правда, в этом случае нужно заботиться о содержимом буфера обмена, или тогда способ посложнее, "ручками" через CharFormat и\или ParaFormat после обычной добавки текста... Если "скрипт" формулы покажете, можно и пример сварганить
З.Ы. Вспомнилось Цитата:
Последний раз редактировалось Alegun, 22.03.2016 в 19:18. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Kraeved (22.03.2016)
| ||
|
#7
|
|||
|
|||
|
Собственно, вот они будущие названия кнопок:
bufer.jpg Первая из них на коде RTF получилась вот так Код HTML:
|
|
#8
|
||||
|
||||
|
К сожалению, у меня под iЭмулятором виндовс7 приведённый кусман отображается как tgd1, видимо, шрифты не совпадают, в смысле дельта вылезает в латинской транскрипции, и возможно, не только у меня такое - совет, надписи на кнопках лучше сделать графикой, тем более кнопаря на toolbar`е это поддерживают. Насчёт примера вставки: попробую подсобрать, если будет время, когда - пока не знаю, извнт
|
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Kraeved (23.03.2016)
| ||
|
#9
|
|||
|
|||
|
Кнопки, разумеется, будут с картинкой, а не текстом. ScreenShot мне в помощь.
Меня интересует каким образом, в то место, где стоит курсор текста RichEdit вставить заготовленное выражение при нажатии кнопки. Выражение закодировано кодом RTF. |
|
#10
|
|||
|
|||
|
Столкнулся с проблемой форматирования текста. В общем, в программе есть формы с RichEdit-ами. Для RichEdit-ов для редактирования текста создал универсальный список процедур ActionManager - один для всех. Для стандартных Action типа EditCut, EditPaste, EditCopy вызов соответствующей Action работает в любой форме и в любом RichEdit-е. Но те Action, которые я написал, работают только на той форме, на которой расположен ActionManager. Проблема в том, что я не знаю, как определить в Action указатель на активную в данный момент форму ( с фокусом ввода). Текст вот:
Код:
procedure TForm3.ActionEditPlusMinusExecute(Sender: TObject); var RichText: TRichEdit; begin if ActiveControl is TRichEdit then begin RichText:=TRichEdit(ActiveControl); SendMessage(RichText.Handle, EM_REPLACESEL, 0, integer(PCHAR(PlusMinus))); end; end; Последний раз редактировалось Kraeved, 07.04.2016 в 13:32. |
|
#11
|
||||
|
||||
|
активный Control на активной Form :
Код:
Screen.ActiveForm.ActiveControl |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Kraeved (07.04.2016)
| ||
|
#12
|
|||
|
|||
|
Получилось! Как все просто оказывается! Сделал так:
Код:
procedure TForm3.ActionEditPlusMinusExecute(Sender: TObject); begin if (Screen.ActiveControl <> nil) and (Screen.ActiveControl is TRichEdit) then begin SendMessage(Screen.ActiveControl.Handle, EM_REPLACESEL, 0, integer(PCHAR(PlusMinus))); end; end; |
|
#13
|
|||
|
|||
|
Не пойму что не так в этом коде:
Код:
try
MemoryStream:=TMemoryStream.Create;
// код программы ...
finally
MemoryStream.Free;
end;[Warning] Unit7.pas(120): Variable 'MemoryStream' might not have been initialized У меня в программе 4 таких же куска с такими же предупреждениями. Как то напрягает, когда выдается ошибка там, где ее нет... Или есть? Последний раз редактировалось Kraeved, 15.04.2016 в 21:23. |
|
#14
|
||||
|
||||
|
Первую и вторую строчки поменяй местами.
|