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



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

Собственно, вот они будущие названия кнопок:
bufer.jpg

Первая из них на коде RTF получилась вот так
Код HTML:
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\froman\fprq2\fcharset204{\*\fname Times New Roman;}Times New Roman CYR;}{\f1\fnil\fprq2\fcharset204 GreekC;}{\f2\fnil\fcharset0 Calibri;}} {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\f0\fs20 tg\f1 d\sub\f0 1\nosupersub \par \pard\sa200\sl276\slmult1\lang9\f2\fs22\par }
Ответить с цитированием
  #8  
Старый 22.03.2016, 22:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

К сожалению, у меня под iЭмулятором виндовс7 приведённый кусман отображается как tgd1, видимо, шрифты не совпадают, в смысле дельта вылезает в латинской транскрипции, и возможно, не только у меня такое - совет, надписи на кнопках лучше сделать графикой, тем более кнопаря на toolbar`е это поддерживают. Насчёт примера вставки: попробую подсобрать, если будет время, когда - пока не знаю, извнт
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Kraeved (23.03.2016)
  #9  
Старый 23.03.2016, 03:26
Kraeved Kraeved вне форума
Прохожий
 
Регистрация: 21.03.2016
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Кнопки, разумеется, будут с картинкой, а не текстом. ScreenShot мне в помощь.
Меня интересует каким образом, в то место, где стоит курсор текста RichEdit вставить заготовленное выражение при нажатии кнопки. Выражение закодировано кодом RTF.
Ответить с цитированием
  #10  
Старый 07.04.2016, 13:30
Kraeved Kraeved вне форума
Прохожий
 
Регистрация: 21.03.2016
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 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;
Это процедура вставляет знак "плюс-минус" в текст RichEdit-а. Здесь ActiveControl ищет активный RichEdit только в Form3. Но, вызов этой процедуры нужен также из другой активной формы. Как сделать, чтобы не плодить одни и те же action в каждой форме???

Последний раз редактировалось Kraeved, 07.04.2016 в 13:32.
Ответить с цитированием
  #11  
Старый 07.04.2016, 13:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

активный Control на активной Form :
Код:
Screen.ActiveForm.ActiveControl
проверка на nil ActiveForm и ActiveControl не помешает.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Kraeved (07.04.2016)
  #12  
Старый 07.04.2016, 14:05
Kraeved Kraeved вне форума
Прохожий
 
Регистрация: 21.03.2016
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Получилось! Как все просто оказывается! Сделал так:
Код:
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  
Старый 15.04.2016, 21:20
Kraeved Kraeved вне форума
Прохожий
 
Регистрация: 21.03.2016
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не пойму что не так в этом коде:
Код:
  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  
Старый 15.04.2016, 21:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Первую и вторую строчки поменяй местами.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter   Ссылка на Telegram