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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.02.2016, 17:22
tonysim tonysim вне форума
Прохожий
 
Регистрация: 09.02.2013
Сообщения: 3
Репутация: 10
По умолчанию Форматирование текста

Здравствуйте, форумчане. Хотелось бы спросить вашего совета по следующей проблеме.

На форме приложения имеется многострочное поле ввода (на данный момент Richedit), в котором необходимо предусмотреть как ручной ввод текста пользователем, так и вставку нередактируемых блоков со служебной информацией (если пользователь перемещается по тексту, то данные блоки должны игнорироваться). Само содержание поля планирую сохранять в формате xml или т.п. Также (опционально) было бы еплохо реализовать возможность осуществления какого-либо действия по клику на конкретный блок со служебной информацией.

Для понятности привожу картинку. Оранжевым выделены служебные блоки, которые пользователь не может редактировать. Обычный текст - редактируется пользователем.

Буду благодарен за любые предложения по реализации подобного, быть может, имеются какие-либо сторонние бесплатные компоненты, которые позволят реализовать эту идею.

Безымянный.png
Ответить с цитированием
  #2  
Старый 02.03.2016, 08:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

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  
Старый 21.03.2016, 12:16
Kraeved Kraeved вне форума
Прохожий
 
Регистрация: 21.03.2016
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию RichEdit

Такая проблема: Не могу никак скопировать форматированный текст из RichEdit в DBRichEdit.
Текст программы такой:
Цитата:

type
DM.ADOQueryRichText: TMemoField; /это класс-поле из БД
.............
begin
DM.ADOQueryRichText.AsVariant:=RichEdit1.Lines.Tex t;
end;
Проблема в том, что текст копируется без форматирования, как обычный из TMemo. А в каком свойстве RichEdit1 хранится "форматированный" текст я никак не могу найти.
Дальше, получается, что скопированный текст в БД в DBRichEdit отображается "без форматный".
Ответить с цитированием
  #4  
Старый 21.03.2016, 15:23
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Не всё так просто, свойство 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;
Взято из Drkb::00568

З.Ы. Под DM.ADOQueryRichText ясенперец подразумевается не поле, а DBRichEdit

Последний раз редактировалось Alegun, 21.03.2016 в 16:14.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Kraeved (22.03.2016)
  #5  
Старый 22.03.2016, 11:29
Kraeved Kraeved вне форума
Прохожий
 
Регистрация: 21.03.2016
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Все заработало.

Теперь другая проблема. Нужно к RichEdit подсоединить кнопку из toolbar-а, при нажатии на которую, в текст вставляется стандартный шаблон типа простой формулы с надстрочными и подстрочными символами. Хотелось бы шаблоны в виде скрипта какого-нибудь сохранить как константу в коде программы.

Также желательно вставить кнопки в toolbar, которые форматируют текст RichEdit-а в надстрочный/подстрочный. Стандартные Action в Delphi 7 этого не умеют.

Еще нужно несколько греческих символов на кнопки выложить .... для вставки их в текст RichEdit.
Частично здесь нашел решение проблемы. Теперь осталось узнать как извлечь скрипт из rtf-текста, который будет шаблоном.

Последний раз редактировалось Kraeved, 22.03.2016 в 12:19.
Ответить с цитированием
  #6  
Старый 22.03.2016, 17:42
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

В принципе самое простое - это делать форматные вставки с помощью клипборда, копипастой, правда, в этом случае нужно заботиться о содержимом буфера обмена, или тогда способ посложнее, "ручками" через CharFormat и\или ParaFormat после обычной добавки текста... Если "скрипт" формулы покажете, можно и пример сварганить


З.Ы. Вспомнилось
Цитата:
Сообщение от Kraeved
...осталось узнать как извлечь скрипт из rtf-текста, который будет шаблоном.
Можно после сохранки готового файла выставить у RichEdit`а свойство PlainText в true, тогда при последующем открытии на экране будут отображены все rtf`ные "потроха" этого файла, а там можно готовый блок скопировать, в качестве шаблона

Последний раз редактировалось Alegun, 22.03.2016 в 19:18.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Kraeved (22.03.2016)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter