15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как показать содержимое Memo-поля в DBGrid.

Компилятор: Delphi

Поумолчанию, 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-поля.