Поля memo в dbgrid.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Поля memo в dbgrid.

Сообщение WAYFARER »

Как заставить DbGrid показывать поля типа memo?
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

Какого типа база данных?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

WAYFARER
Для показа мемо есть отдельный компонент.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

Logo писал(а):Какого типа база данных?

Программа использует несколько СУБД на выбор Sqlite, PostgeSQL, FireBird.
Собственно без разницы, что подключено, результат один и тот же.

Vadim писал(а):WAYFARER
Для показа мемо есть отдельный компонент.

К сожалению задача такова, что поле должно быть показано в гриде.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

WAYFARER писал(а):К сожалению задача такова, что поле должно быть показано в гриде.

А в этом мемо-поле буковок много? Сколько?
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

WAYFARER писал(а):
Logo писал(а):Какого типа база данных?

Программа использует несколько СУБД на выбор Sqlite, PostgeSQL, FireBird.
Собственно без разницы, что подключено, результат один и тот же.

Разница есть, по разному решается.
Отображаться должно одной строкой или несколько?
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

Logo писал(а):
WAYFARER писал(а):
Logo писал(а):Какого типа база данных?

Программа использует несколько СУБД на выбор Sqlite, PostgeSQL, FireBird.
Собственно без разницы, что подключено, результат один и тот же.

Разница есть, по разному решается.
Отображаться должно одной строкой или несколько?

Да собственно надо то первые 50-70 знаков показать.

Vadim писал(а):А в этом мемо-поле буковок много? Сколько?

Очень много:) ~3-10 кб текста.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

WAYFARER
Тогда это в принципе невозможно. Если хотите, вводите дополнительное varchar-поле в БД, в которое заносите первые 50..70 символов из рядом лежащего мемо-поля и его показывайте в гриде.
Это довольно распространённый приём для текстовых данных, называется "ключевые слова". К примеру Вы запихали в мемо-поле работу В. И. Ленина "Материализм и эмпириокритицизм" и создали дополнительное поле, которое может быть проиндексировано для поиска или показа краткого содержания, например "Ленин, критика одного из направлений немецкой философии".
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

WAYFARER писал(а):Да собственно надо то первые 50-70 знаков показать.
Очень много:) ~3-10 кб текста.

Попробуйте в SQL запросе преобразовать тип поля, например:

Код: Выделить всё

SELECT fld_memo::text AS new_fld_memo

тоесть, BLOB поле запрашиваем, как текстовое.

Но если это Ваша задача, то целесообразнее было бы это делать на стороне сервера. В PostgreSQL можно создать View, где будет сразу формироваться нужное поле для DBGrid.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Logo писал(а):тоесть, BLOB поле запрашиваем, как текстовое.

В запросе надо ограничить количество символов. ;)
Для FireBird и SQLite это можно сделать так:

Код: Выделить всё

SUBSTR(поле, 0,50)

Для Postgre не знаю. :)
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

Vadim писал(а):
Logo писал(а):тоесть, BLOB поле запрашиваем, как текстовое.

В запросе надо ограничить количество символов. ;)
Для FireBird и SQLite это можно сделать так:

Код: Выделить всё

SUBSTR(поле, 0,50)

Для Postgre не знаю. :)

Очень правильное замечание, ведь зачем гонять трафик невостребованными данными.
Postgres аналогично, даже к типу приводить не нужно. Получается примерно такой запрос:

SELECT adr_country, adr_region, substr(adr_distr, 0, 10), adr_city
FROM address;
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

Спасибо. Собственно такое решение уже приходило, но надеялсяо это сделать средствами Лазаруса.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Код: Выделить всё

substr
  cast(adr_distr as varchar(10)),
  adr_city
FROM
  address;


or

Код: Выделить всё

substr
  adr_distr::varchar(10),
  adr_city
FROM
  address;
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

А как быть с отображением МЕМО полей в ДБГриде при использовании TDBF?
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

Опять я вернулся к идеи отобразить МЕМО поля из TDBF в ДбГриде... Нашёл такой пример:
http://e-dok.narod.ru/delphi/question1/ ... p-128.html

но разобраться с ним не получается. Во первых у стандартного лазарёвого ДбГрида нет события DrawDataCell, является ли DrawColumnCell его аналогом? Во вторых тип данных TBlobStream не идентифицируется...

На сколько этот пример адаптивен к лазарусу и как это сделать? Может есть другой способ заставить ДбГрид отображать МЕМО поля?

Добавлено спустя 14 часов 46 минут 33 секунды:
Есть ли в лазарусе такой тип TBlobStream? Или чем его заменить в данном примере?

Код: Выделить всё

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
 var
   P: array [0..1023] of Char; { MemoField buffer }
   //BS: TBlobStream;
   S: string;
begin
 if dbf1.FieldByName('R') 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, SizeOf(P));
     //BS.Free;
     S := StrPas(P);
     {удаляем возврат каретки и перевод строки}
     while Pos(#13, S) > 0 do S[Pos(#13, S)] := ' ';
     while Pos(#10, S) > 0 do S[Pos(#10, S)] := ' ';
     {очистка ячейки}
     FillRect(Rect);
     {заполнить ячейки с данными памятки}
     TextOut(Rect.Left, Rect.Top, S);
    end;
  end;
end;


Очень нужно отобразить мемо в гриде :cry:
Ответить