Поля memo в dbgrid.
Модератор: Модераторы
Поля memo в dbgrid.
Как заставить DbGrid показывать поля типа memo?
Какого типа база данных?
WAYFARER
Для показа мемо есть отдельный компонент.
Для показа мемо есть отдельный компонент.
Logo писал(а):Какого типа база данных?
Программа использует несколько СУБД на выбор Sqlite, PostgeSQL, FireBird.
Собственно без разницы, что подключено, результат один и тот же.
Vadim писал(а):WAYFARER
Для показа мемо есть отдельный компонент.
К сожалению задача такова, что поле должно быть показано в гриде.
WAYFARER писал(а):К сожалению задача такова, что поле должно быть показано в гриде.
А в этом мемо-поле буковок много? Сколько?
WAYFARER писал(а):Logo писал(а):Какого типа база данных?
Программа использует несколько СУБД на выбор Sqlite, PostgeSQL, FireBird.
Собственно без разницы, что подключено, результат один и тот же.
Разница есть, по разному решается.
Отображаться должно одной строкой или несколько?
Logo писал(а):WAYFARER писал(а):Logo писал(а):Какого типа база данных?
Программа использует несколько СУБД на выбор Sqlite, PostgeSQL, FireBird.
Собственно без разницы, что подключено, результат один и тот же.
Разница есть, по разному решается.
Отображаться должно одной строкой или несколько?
Да собственно надо то первые 50-70 знаков показать.
Vadim писал(а):А в этом мемо-поле буковок много? Сколько?
Очень много:) ~3-10 кб текста.
WAYFARER
Тогда это в принципе невозможно. Если хотите, вводите дополнительное varchar-поле в БД, в которое заносите первые 50..70 символов из рядом лежащего мемо-поля и его показывайте в гриде.
Это довольно распространённый приём для текстовых данных, называется "ключевые слова". К примеру Вы запихали в мемо-поле работу В. И. Ленина "Материализм и эмпириокритицизм" и создали дополнительное поле, которое может быть проиндексировано для поиска или показа краткого содержания, например "Ленин, критика одного из направлений немецкой философии".
Тогда это в принципе невозможно. Если хотите, вводите дополнительное varchar-поле в БД, в которое заносите первые 50..70 символов из рядом лежащего мемо-поля и его показывайте в гриде.
Это довольно распространённый приём для текстовых данных, называется "ключевые слова". К примеру Вы запихали в мемо-поле работу В. И. Ленина "Материализм и эмпириокритицизм" и создали дополнительное поле, которое может быть проиндексировано для поиска или показа краткого содержания, например "Ленин, критика одного из направлений немецкой философии".
WAYFARER писал(а):Да собственно надо то первые 50-70 знаков показать.
Очень много:) ~3-10 кб текста.
Попробуйте в SQL запросе преобразовать тип поля, например:
Код: Выделить всё
SELECT fld_memo::text AS new_fld_memoтоесть, BLOB поле запрашиваем, как текстовое.
Но если это Ваша задача, то целесообразнее было бы это делать на стороне сервера. В PostgreSQL можно создать View, где будет сразу формироваться нужное поле для DBGrid.
Logo писал(а):тоесть, BLOB поле запрашиваем, как текстовое.
В запросе надо ограничить количество символов.
Для FireBird и SQLite это можно сделать так:
Код: Выделить всё
SUBSTR(поле, 0,50)Для Postgre не знаю.
Vadim писал(а):Logo писал(а):тоесть, BLOB поле запрашиваем, как текстовое.
В запросе надо ограничить количество символов.
Для FireBird и SQLite это можно сделать так:Код: Выделить всё
SUBSTR(поле, 0,50)
Для Postgre не знаю.
Очень правильное замечание, ведь зачем гонять трафик невостребованными данными.
Postgres аналогично, даже к типу приводить не нужно. Получается примерно такой запрос:
SELECT adr_country, adr_region, substr(adr_distr, 0, 10), adr_city
FROM address;
Спасибо. Собственно такое решение уже приходило, но надеялсяо это сделать средствами Лазаруса.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Код: Выделить всё
substr
cast(adr_distr as varchar(10)),
adr_city
FROM
address;or
Код: Выделить всё
substr
adr_distr::varchar(10),
adr_city
FROM
address;
А как быть с отображением МЕМО полей в ДБГриде при использовании TDBF?
Опять я вернулся к идеи отобразить МЕМО поля из TDBF в ДбГриде... Нашёл такой пример:
http://e-dok.narod.ru/delphi/question1/ ... p-128.html
но разобраться с ним не получается. Во первых у стандартного лазарёвого ДбГрида нет события DrawDataCell, является ли DrawColumnCell его аналогом? Во вторых тип данных TBlobStream не идентифицируется...
На сколько этот пример адаптивен к лазарусу и как это сделать? Может есть другой способ заставить ДбГрид отображать МЕМО поля?
Добавлено спустя 14 часов 46 минут 33 секунды:
Есть ли в лазарусе такой тип TBlobStream? Или чем его заменить в данном примере?
Очень нужно отобразить мемо в гриде
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; Очень нужно отобразить мемо в гриде
