Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как показать содержимое TMemo-поля в TDBGrid?

01.01.2007

Поумолчанию, DBGrid не может отображать memo-поля. Однако, проблему можно решить при помощи события OnDrawDataCell в DBGrid.

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const 
                 Rect: TRect; Field: TField; State: 
                 TGridDrawState); 
 
var 
  P: array [0..50] of char; {размер массива, это количество необходимых символов}
  bs: TBlobStream;          {из memo-поля} 
  hStr: String; 
 
begin 
  if Field is TMemoField then 
  begin 
    with (Sender as TDBGrid).Canvas do 
    begin   {Table1Notes это TMemoField} 
      bs := TBlobStream.Create(Table1Notes, bmRead); 
      FillChar(P,SizeOf(P),#0); {строка завершается нулём} 
      bs.Read(P, 50); {читаем 50 символов из memo в blobStream} 
      bs.Free; 
      hStr := StrPas(P); 
      while Pos(#13, hStr) > 0 do  {удаляем переносы каретки и}
        hStr[Pos(#13, hStr)] := ' '; 
      while Pos(#10, hStr) > 0 do  {отступы строк}
        S[Pos(#10, hStr)] := ' '; 
 
      FillRect(Rect);  {очищаем ячейку}
      TextOut(Rect.Left, Rect.Top, hStr);  {заполняем ячейку данными из memo}
    end; 
  end; 
end; 

Замечание: перед тем, запустить пример, создайте объект TMemoField для memo-поля двойным кликом по компоненту TTable и добавлением memo-поля.

Взято из https://forum.sources.ru


В обработчик события GetText TMemoField поместите следующую строку:

Text := GrabMemoAsString(TMemoField(Sender));

и поместите следующую функцию так, чтобы к ней можно было свободно обратиться:

function GrabMemoAsString(TheField: TMemoField): string;
begin
  if TheField.IsNull then
    Result := ''
  else
    with TBlobStream.Create(TheField, bmRead) do
    begin
      if Size >= 255 then
      begin
        Read(Result[1], 255);
        Result[0] := #255;
      end
      else
      begin
        Read(Result[1], Size);
        Result[0] := Chr(Size);
      end;
      Free;
      while Pos(#10, Result) > 0 do
        Result[Pos(#10, Result)] := ' ';
      while Pos(#13, Result) > 0 do
        Result[Pos(#13, Result)] := ' ';
    end;
end;
 

Взято с https://delphiworld.narod.ru