Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Отобразить Memo поле в DBGrid - вариация на тему   Найти похожие ветки 

 
DeepProg   (2004-11-07 16:03) [0]

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

Таблица создается динамически, а я не знаю(побочный эффект использования 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 ни разу не наступило (?..) )


 
jack128 ©   (2004-11-07 17:15) [1]

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? Тогда ничего не поделаваешь..


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

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

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


 
jack128 ©   (2004-11-07 18:30) [3]

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


Из справки к CreateFile

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


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

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


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

2 jack128

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

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

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


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

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


 
Val ©   (2004-11-08 14:56) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.034 c
1-1100852111
Torin
2004-11-19 11:15
2004.12.05
Чтение/запись строк в поток


1-1100968084
lp
2004-11-20 19:28
2004.12.05
Grid


1-1100882886
aliced
2004-11-19 19:48
2004.12.05
Incopatible types: String and Char


14-1100797528
Sanek_Metaller
2004-11-18 20:05
2004.12.05
Задачка


3-1100003561
onix
2004-11-09 15:32
2004.12.05
Выбрать из таблицы