Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отобразить Memo поле в DBGrid - вариация на тему [D6, KeyDB]


DeepProg ©   (2004-11-07 16:03:00) 

Как это делается буквально я уже нашел.
Однако вышла заминка с реализацией.

Таблица создается динамически, а я не знаю(побочный эффект использования Object Inspector ;) ) где и как в этом случае надо писать обработчик события OnGetText (класс таблицы заново описывать что ли?).

Подробнее о ситуации:
Сама таблица объявлена просто как переменная TUdbTable(потомок TDataSet - т.е. считайте, что просто TTable). При ее формировании я просто использую AddFieldDefs. А заполнение произволжу с помощью AppendRecord
Поэтому компилятору заранее не известно, что у меня в таблице есть TMemoField - оно же не прописано статически в design-time.

Дополнительно:
В поле типа Memo должен храниться путь к директории. Такой тип выбран потому, что путь может быть довольно длинным, а длина string у используемого движка БД урезана до 255 байт.
При клике на строку в таблице должна открываться папка путь к которой хранится в описываемом поле.
Попутно возник вопрос.
Предположим, что путь превышает 8192 (или сколько там у обычной TTable) символов, а в FAQ по subj приведен код урезающий-таки строку до 255 символов. В общем, не повлияет ли изменения отображения на содержимое записи, так как используется свойство Text? (ясно, что хочется ответить RTFM!, но сроки...)
Может лучше использовать процедуру TextOut при отрисовке? (между прочим, в одном из FAQ примерно так и советовали делать, только  но в ходе заполнения моей таблицы и отображения ее содержимого в Grid'e OnDrawDataCell ни разу не наступило (?..) )


Val   (2004-11-08 14:56:00) [1]

А зачем вам OnGetText? Вы содержимое мемо-поля собираетесь в сетке рисовать? Если оно длинное - зачем?- налицо неудобство. Все равно, этот путь увидит пользователь, когда откроется файловый диалог, в который вы его подставите...
По поводу присвоения обработчика - можно также воспользоваться procedure ..of object, дабы не лепить обработчик к "левому" классу, скажем.


DeepProg   (2004-11-08 14:38:00) [2]

Спасибо всем за просвещение насчет длинных имен.
Однако программа действительно предполагает работу с доступными из файловых менеджеров путями, поэтому принимаю предложение Сергея.
jack128
Спасибо за прием описания обработчика in_run-time_создаваемого объекта - общий принцип примерно понятен.


сергей1   (2004-11-07 21:17:00) [3]

2 jack128

то, что createfilew позволяет это делать, не означает, что в базе надо с этим заморачиваться. Ты сначала найди в винде такие файлы, или попробуй их создать стандартными методами. Я вообще сомневаюсь, что к примеру проводник увидит такой файл, даже если ты его создашь.
А в топике :
>При клике на строку в таблице должна открываться папка путь к которой хранится в описываемом поле.

Я не эксперт в API, и не знаю, для каких целей используются файлы с такими длинными именами. Явно, не для каждодневного использования. Уверен, что к примеру Word такой файл не подхватит. И вообще, на эту тему надо вопрос задать в форуме по API.

2 Anatoly Podgoretsky
проводник позволяет создавать файлы с размером только меньше 255 (кажется, в районе 247).


Anatoly Podgoretsky   (2004-11-07 21:06:00) [4]

Да и без этого MAX_PATH > 255


jack128   (2004-11-07 18:30:00) [5]

сергей1   (07.11.04 17:29) [2]
хех, длина пути к файлу в Windows не может превышать 255 символов


Из справки к CreateFile

Windows NT: You can use paths longer than MAX_PATH charactersby calling the wide (W) version of CreateFile and prepending "\\?\" to the path.


сергей1   (2004-11-07 17:29:00) [6]

>Такой тип выбран потому, что путь может быть довольно длинным, а длина string у используемого движка БД урезана до 255 байт.

хех, длина пути к файлу в Windows не может превышать 255 символов.
Так что memo здесь непричем. Работай с обычным string


jack128   (2004-11-07 17:15:00) [7]

DeepProg   (07.11.04 16:03)
Поэтому компилятору заранее не известно, что у меня в таблице есть TMemoField - оно же не прописано статически в design-time
ну естественно, если ты создаешь поля в ран тайм, то в дезин тайм назначить обработчик ты не можешь.. Но что мешает сделать это ран тайм??  

> ) где и как в этом случае надо писать обработчик
> события OnGetText
объявлять его методом любого класса.

procedure TDBGeneratorFrame.IBDataSetNULL_RESISTANCEGetText(Sender: TField;
 var Text: String; DisplayText: Boolean);
begin
 inherited;
 if DisplayText then
   if Sender.AsInteger = 0 then
     Text := '---'
   else
     Text := Sender.AsString;
end;


и где нить в коде  

constructor TDBGeneratorFrame.Create(AOwner: TComponent);
begin
 inherited;
 IbDataSet.FieldByName('NULL_RESISTANCE').OnGetText := IBDataSetNULL_RESISTANCEGetText;
end;

Или можешь сделать этот обработчик методом самого TUdbTable... В общем как хочешь..


> Предположим, что путь превышает 8192 (или сколько там
> у обычной TTable) символов,

Это ограничение движка или TTable? Тогда ничего не поделаваешь..


Наверх

Титульная страница Поиск, карта сайта Написать письмо