|
|
Регистрация | << Правила форума >> | 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
Такая проблема: Не могу никак скопировать форматированный текст из 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
|
||||
|
||||
Первую и вторую строчки поменяй местами.
Пишу программы за еду. __________________ |