Поля memo в dbgrid.

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

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

Поля memo в dbgrid.

Сообщение WAYFARER » 06.11.2009 20:18:30

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

Re: Поля memo в dbgrid.

Сообщение Logo » 07.11.2009 03:17:31

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

Re: Поля memo в dbgrid.

Сообщение Vadim » 07.11.2009 08:35:08

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

Re: Поля memo в dbgrid.

Сообщение WAYFARER » 07.11.2009 09:26:02

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

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

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

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

Re: Поля memo в dbgrid.

Сообщение Vadim » 07.11.2009 09:46:25

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

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

Re: Поля memo в dbgrid.

Сообщение Logo » 07.11.2009 16:44:57

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

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

Разница есть, по разному решается.
Отображаться должно одной строкой или несколько?
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Поля memo в dbgrid.

Сообщение WAYFARER » 07.11.2009 16:51:43

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

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

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

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

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

Очень много:) ~3-10 кб текста.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Поля memo в dbgrid.

Сообщение Vadim » 07.11.2009 17:05:50

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

Re: Поля memo в dbgrid.

Сообщение Logo » 07.11.2009 17:29:54

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

Попробуйте в SQL запросе преобразовать тип поля, например:
Код: Выделить всё
SELECT fld_memo::text AS new_fld_memo

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

Но если это Ваша задача, то целесообразнее было бы это делать на стороне сервера. В PostgreSQL можно создать View, где будет сразу формироваться нужное поле для DBGrid.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Поля memo в dbgrid.

Сообщение Vadim » 07.11.2009 18:11:16

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

В запросе надо ограничить количество символов. ;)
Для FireBird и SQLite это можно сделать так:
Код: Выделить всё
SUBSTR(поле, 0,50)

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

Re: Поля memo в dbgrid.

Сообщение Logo » 07.11.2009 18:23:30

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

В запросе надо ограничить количество символов. ;)
Для FireBird и SQLite это можно сделать так:
Код: Выделить всё
SUBSTR(поле, 0,50)

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

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

SELECT adr_country, adr_region, substr(adr_distr, 0, 10), adr_city
FROM address;
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Поля memo в dbgrid.

Сообщение WAYFARER » 07.11.2009 18:47:55

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

Re: Поля memo в dbgrid.

Сообщение debi12345 » 10.11.2009 11:28:05

Код: Выделить всё
substr
  cast(adr_distr as varchar(10)),
  adr_city
FROM
  address;


or

Код: Выделить всё
substr
  adr_distr::varchar(10),
  adr_city
FROM
  address;
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Поля memo в dbgrid.

Сообщение qivi » 20.11.2009 07:29:03

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

Re: Поля memo в dbgrid.

Сообщение qivi » 24.04.2010 04:17:38

Опять я вернулся к идеи отобразить МЕМО поля из 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:
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Рейтинг@Mail.ru