Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 809

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!

Вопрос: Можно ли сделать, что бы DBGrid отображал содержимое поля таблицы имеющей тип Memo. В оригинале отображается слово (Memo) вместо текста.

конечно можно, содержимое поля впихивать через канву в обработчике OnDrawColumnCell, на данный момент я так и сделал, но хотелось бы видеть в самом Gride поле TMemo или TDBMemo, при чем с разным содержимым в соответсвии с данными, а не выделенной ячейки. Зачем? - просто в поле мемо может находиться текст с переносами коретки и прочее и как я понимаю, это не будет отображаться в простом поле грида корректно.

Mike Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Mike (статус: Посетитель)
Вопрос отправлен: 24 февраля 2010, 11:20
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, Mike!
Можно использовать события класса TField - OnGetText и OnSetText. DBGrid при этом вообще не трогаем. Этим обработчикам передаётся переменная Text. Первый в неё то, что запишет, будет выведено в гриде, а второй то, что передано в качестве текста, должен записать в базу.

Пример:
Скажем, у нас есть ADOTable1 (или Table1, если вы работаете с BDE). Делаем на этом компоненте двойной щелчок, открывается список полей. Добавляем все поля. У поля, имеющего тип memo, заходим в инспекторе свойств на вкладку обработчиков (Events). Там и прописываем обработчики OnGetText (получение текста из мемо и вывод его в DBGrid) и OnSetText (запись введённого пользователем текста из DBGrid в базу).
Если поле memo называется LongField, будем иметь:

procedure TForm1.ADOTable1LongFieldSetText(Sender: TField; const Text: String);
begin
  Sender.AsString:=Text;
end;
 
procedure TForm1.ADOTable1LongFieldGetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  Text:=Sender.AsString;
end;

Но огорчу вас тем, что спецзнаки (перевод каретки, табуляция) в таком случае будут выводиться некорректно - пустыми прямоугольничками.
Но зато ввод текста будет без проблем.

Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 25 февраля 2010, 09:08
Оценка за ответ: 4

Комментарий к оценке: Спасибо, именно это я и хотел получить, но .... надеялся, что как раз таки спец символы то и будут отображаться. Жаль :-)

Мини-форум вопроса

Всего сообщений: 15; последнее сообщение — 26 февраля 2010, 12:31; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 24 февраля 2010, 12:02 [#1]:

использовать сторонний грид. например EhLib
Галочка "подтверждения прочтения" - вселенское зло.
Mike

Mike (статус: Посетитель), 24 февраля 2010, 13:40 [#2]:

не хотелось бы использовать сторонние компоненты
Вадим К

Вадим К (статус: Академик), 24 февраля 2010, 14:02 [#3]:

тогда ручная отрисовка.
Галочка "подтверждения прочтения" - вселенское зло.
Mike

Mike (статус: Посетитель), 24 февраля 2010, 15:37 [#4]:

вот с этого места да поподробнее бы :-)
Вадим К

Вадим К (статус: Академик), 24 февраля 2010, 16:15 [#5]:

судя по тексту вопроса - вы ее как раз и делаете. или я чего то не понимаю?
Галочка "подтверждения прочтения" - вселенское зло.
Mike

Mike (статус: Посетитель), 25 февраля 2010, 08:48 [#6]:

Не все правильно, это я не так понял фразу "ручная отрисовка"... Подумал, что речь идет о ручной отрисовки memo...
Ладно, т.е. как я понимаю: либо использовать сторонний компонент, либо обрабатывать текст ручками и вставлять через канву?
Вариант наделить стандартный грид функционалом отображать мемо (при этом в каждой строчке) - не проходит?
Вадим К

Вадим К (статус: Академик), 25 февраля 2010, 12:42 [#7]:

наделить стандартный - то есть только написать наследника, то есть свой компонент. и отрисовку никто в этом случае не отменял.
Я думаю, это видео http://codegearguru.com/video/024/OnDrawColumnCell.html будет Вам полезно.
Галочка "подтверждения прочтения" - вселенское зло.
Mike

Mike (статус: Посетитель), 25 февраля 2010, 14:15 [#8]:

Спасибо, "Вадим К", нечто подобное я читал..но там не рассказывается, к сожалению, как подставить поле мемо вместо стандартного отображаемого Гридом (хотя есть пример как отобразить элемент CheckBox).
Наследник - это решение, но не снимается вопрос, так как же подставить.
Как всунуть мемо вместо какогото поля, пускай и в наследнике.
При выделении строки в гриде понятно (путем накладывания сверху), хотя там есть свои корявости, но мне нужно, что бы каждая строка отображала свои данные с неким форматированием, типа несколько строк и т.п. Это конечно не смертельно, можно и так как я уже сделал, но просто решил проконсультироваться. Сторонний компонент принципиально не хочу, ну по крайней мере пока...
Егор

Егор (статус: 10-ый класс), 25 февраля 2010, 19:44 [#9]:

насчёт спецсимволов - никто же не мешает их вырезать перед выводом текста.
тем более, что DBGrid всё равно же в одну строчку запись пишет и в несколько строк вывести не удастся
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Mike

Mike (статус: Посетитель), 26 февраля 2010, 09:31 [#10]:

ну естественно, что так и предется, но думалось, что мемо поле как раз таки и позволило бы писать текст в несколько строк увеличивая ширину строки грида...
Наверное лишнее :-)
Mike

Mike (статус: Посетитель), 26 февраля 2010, 09:47 [#11]:

Как вариант, при чем , не плохой, можно использовать контрол грид и столбцы набрать из разных элементов, в том числе и DBMemo
Егор

Егор (статус: 10-ый класс), 26 февраля 2010, 09:51 [#12]:

обычно для таких случаев делается следующее - текст мемо обрезается (скажем, выводятся лишь первые 50 символов), а затем ставится многоточие...
для подробного просмотра пользователь наводит мышку и ему высвечивается текст мемо в подсказке, либо по двойному щелчку по записи открывается отдельное окошко, в котором мемо отображается уже не в гриде, а в чём-нибудь типа DBMemo. ну или можно это же DBMemo поместить тут же на форму, а показываться там будет мемо из активной сточки.
вариантов - масса.

ну, и ссылки по теме на сайте Королевства Дельфи:
Разноцветный D B G R I D
НеОбычный TDBGrid
Grid с человеческим лицом
По следам «полосатого DBGrid»
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 26 февраля 2010, 09:54 [#13]:

либо при попытке входа в мемо-поле появляется отдельный компонент (который в обычном состоянии невидим), типа обычного многострочного поля поверх ячейки с мемо. при выходе из многострочного компонента текст записывается в базу.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 26 февраля 2010, 10:34 [#14]:

вот тут есть одна поправка, дело в том, что некоторые "писатели" умудряются сделать по одному memo на каждую запись! А этого как раз делать не нужно. Хватит всего одного memo. нужно только правильно позиционировать. И мемо не обязательно должно быть скрытым. Его можно создавать по необходимости. Но это эффективность этого - это уже отдельный вопрос.
Галочка "подтверждения прочтения" - вселенское зло.
Mike

Mike (статус: Посетитель), 26 февраля 2010, 12:31 [#15]:

Да, спасибо всем... наверное вариант с неполным текстом - это правильный способ, главное обыграть... Либо вообще уйти от самого грида, как я уже скзал...
Спасибо за участие всем, если у когото появятся еще идеи, поделитесь :-)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.03 сек.