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