Как отобразить форматированный текст в TDBGrid?

У меня есть таблица с полем RTF.

Как я могу отобразить это в TDBGrid, чтобы он действительно отображал форматированный текст, а не только (FMTMEMO) в столбце?

Я действительно не хочу использовать сторонний компонент для этого.

Спасибо!


person croceldon    schedule 17.09.2009    source источник


Ответы (4)


Я сделал для вас очень грубый пример, который работает, и вы можете попробовать улучшить его по мере необходимости.

Поместите элемент управления TDBRichEdit на форму и установите для его свойства Visible значение False. Установите свойства DataSource и DataField, чтобы подобрать соответствующее поле.

Скажем, имя поля, которое содержит текст RTF, называется «RTF»:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DrawState: Integer;
  DrawRect: TRect;
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = 'RTF') then
    with DBRichEdit1 do
    begin
      Left := Rect.Left + DBGrid1.Left + 1;
      Top := Rect.Top + DBGrid1.Top + 1;

      Visible := True;
    end;
  end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  if DBGrid1.SelectedField.FieldName = 'RTF' then
   DBRichEdit1.Visible := False;
end;

Это покажет полный отформатированный текст RichEdit во всплывающем окне, когда вы нажмете на столбец в сетке. Когда вы щелкаете, он скрывает всплывающее окно.

person J__    schedule 17.09.2009

Я не знаю, применимо ли это к вашей ситуации, но однажды я использовал OwnerDrawing для получения форматированного текста. Если это вариант, проверьте DrawRtfText в блоке DrawRichText.

person Uli Gerhardt    schedule 17.09.2009
comment
Я не использовал этот код, но использовал безоконный расширенный элемент управления редактированием, на котором он основан. В итоге я написал точно такой же элемент управления TRtfLabel вместе с отдельной функцией PaintRTF, и я был доволен результатами. Это идеальное решение для ситуаций с розыгрышем владельца. - person Rob Kennedy; 17.09.2009

В Delphi нет встроенного компонента для этого.

Есть много внешних компонентов, которые могут это сделать.

Простой запрос в Google выведет их достаточное количество.

--jeroen

person Jeroen Wiert Pluimers    schedule 17.09.2009

Если вам просто нужен текст в столбце, то самым простым способом было бы добавить вычисляемое поле в ваш набор данных типа String разумной длины (скажем, 80) и в событии onCalculate для набора данных вытащить простой текст из RTF поле в строковое поле. Используйте поле строки для отображения, а не поле RTF.

Если вам нужно все форматирование, то это становится немного сложнее, поскольку нет поддержки компонентов по умолчанию для рендеринга данных RTF, кроме TRichEdit и потомков, которые являются обертками вокруг элемента управления Microsoft. Вам придется самостоятельно выполнять большую часть синтаксического анализа RTF и использовать событие OnDrawDataCell для рисования текста в ячейке. Если вы выберете этот подход, то документ со спецификациями RTF будет очень полезен.

person skamradt    schedule 17.09.2009