|
Вопрос # 3 809/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Вопрос: Можно ли сделать, что бы DBGrid отображал содержимое поля таблицы имеющей тип Memo. В оригинале отображается слово (Memo) вместо текста.
конечно можно, содержимое поля впихивать через канву в обработчике OnDrawColumnCell, на данный момент я так и сделал, но хотелось бы видеть в самом Gride поле TMemo или TDBMemo, при чем с разным содержимым в соответсвии с данными, а не выделенной ячейки. Зачем? - просто в поле мемо может находиться текст с переносами коретки и прочее и как я понимаю, это не будет отображаться в простом поле грида корректно.
 |
Вопрос задал: 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 (статус: Посетитель), 24 февраля 2010, 13:40 [#2]:
не хотелось бы использовать сторонние компоненты
|
|
Вадим К (статус: Академик), 24 февраля 2010, 14:02 [#3]:
тогда ручная отрисовка.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Mike (статус: Посетитель), 24 февраля 2010, 15:37 [#4]:
вот с этого места да поподробнее бы
|
|
Вадим К (статус: Академик), 24 февраля 2010, 16:15 [#5]:
судя по тексту вопроса - вы ее как раз и делаете. или я чего то не понимаю?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Mike (статус: Посетитель), 25 февраля 2010, 08:48 [#6]:
Не все правильно, это я не так понял фразу "ручная отрисовка"... Подумал, что речь идет о ручной отрисовки memo...
Ладно, т.е. как я понимаю: либо использовать сторонний компонент, либо обрабатывать текст ручками и вставлять через канву?
Вариант наделить стандартный грид функционалом отображать мемо (при этом в каждой строчке) - не проходит?
|
|
Вадим К (статус: Академик), 25 февраля 2010, 12:42 [#7]:
наделить стандартный - то есть только написать наследника, то есть свой компонент. и отрисовку никто в этом случае не отменял.
Я думаю, это видео http://codegearguru.com/video/024/OnDrawColumnCell.html будет Вам полезно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Mike (статус: Посетитель), 25 февраля 2010, 14:15 [#8]:
Спасибо, "Вадим К", нечто подобное я читал..но там не рассказывается, к сожалению, как подставить поле мемо вместо стандартного отображаемого Гридом (хотя есть пример как отобразить элемент CheckBox).
Наследник - это решение, но не снимается вопрос, так как же подставить.
Как всунуть мемо вместо какогото поля, пускай и в наследнике.
При выделении строки в гриде понятно (путем накладывания сверху), хотя там есть свои корявости, но мне нужно, что бы каждая строка отображала свои данные с неким форматированием, типа несколько строк и т.п. Это конечно не смертельно, можно и так как я уже сделал, но просто решил проконсультироваться. Сторонний компонент принципиально не хочу, ну по крайней мере пока...
|
|
Егор (статус: 10-ый класс), 25 февраля 2010, 19:44 [#9]:
насчёт спецсимволов - никто же не мешает их вырезать перед выводом текста.
тем более, что DBGrid всё равно же в одну строчку запись пишет и в несколько строк вывести не удастся
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Mike (статус: Посетитель), 26 февраля 2010, 09:31 [#10]:
ну естественно, что так и предется, но думалось, что мемо поле как раз таки и позволило бы писать текст в несколько строк увеличивая ширину строки грида...
Наверное лишнее
|
|
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 (статус: Посетитель), 26 февраля 2010, 12:31 [#15]:
Да, спасибо всем... наверное вариант с неполным текстом - это правильный способ, главное обыграть... Либо вообще уйти от самого грида, как я уже скзал...
Спасибо за участие всем, если у когото появятся еще идеи, поделитесь
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|