 |

Автор/Источник: Ронин Виктор» 31.10.2002 08:54, просмотров сегодня: 1, всего: 2673
статья размещена в группе: Программирование
оценка: 2.334, 24 голоса
Сложность: Intermediate
Проблемам, связанным с применением Table в Palm’е, можно
посвятить ОЧЕНЬ много времени, потому что этих проблем немало. Тем не менее, в рамках этой статьи, хочу пройтись по следам одной из проблем, которая обсуждалась в форуме «На Ладошках», то есть описать особенности работы Field’ов внутри Table.
Главный вопрос этой темы — как получить данные, хранящиеся внутри Field’а в Table? Достаточно быстрого взгляда в документацию, чтобы найти простой и... неправильный ответ — использование функции TblGetItemPtr. Как написано в ее описании: «Некоторые типы элементов таблицы отображают то, что хранится в поле ptr, а некоторые — то, что хранится в поле intValue». Заглянув в описание TableItemType, мы увидим, что textTableItem (отвечающий за обычное редактируемое поле в таблице) использует поля fontID и ptr из структуры, описывающей элемент таблицы. Судя по этим двум фактам, логично предположить, что содержимое field’а хранится в ptr, откуда мы и пытались получить данные посредством функции TblGetItemPtr. Но логика в этом случае не уместна, так что копаем глубже.
Первое, что меня насторожило, это то, что для загрузки данных в редактируемые поля надо применять функцию типа TableLoadDataFuncType, которая, на самом деле, должна возвращать не указатель, а MemHandle. Конечно, можно допустить, что в ptr хранится указатель на MemHandle или необходимо привести ptr к MemHandle, но как-то это уж очень странно. Следующей стадией был глубокий Debug, во время которого я вспомнил, что TableLoadDataFuncType указывает на прорисовку таблицы и на выбор одного из полей редактирования. И тут я во второй раз засомневался — почему на щелчок по полю еще раз считывается MemHandle, ведь должен же он где-то храниться внутри таблицы?
Как результат, через некоторое время я раскопал, что в таблице НЕ ХРАНЯТСЯ данные о содержимом ее полей. Только на момент прорисовки они временно берутся из функции TableLoadDataFuncType, прорисовываются и высвобождаются. При выборе какого-то поля оно существует до тех пор, пока есть фокус на нем, после чего вызывается TableSaveDataFuncType и тоже высвобождается. Таким образом, все содержимое мы сами должны где-то хранить и подсовывать таблице, когда ей нужны данные, и сохранять, когда она хочет их высвободить. Поэтому, единственный метод получить данные из поля — получать их из наших же личных запасов, откуда мы их даем таблице в функции load. В том случае, если поле уже с фокусом, то есть реально существует, единственным отклонение от вышеприведенного правила может быть использование функции TblGetCurrentField, а после — FldGetTextPtr.
Можно считать, что решение проблемы найдено. Правда, упустили один момент: а что же такое хранит ptr? А в том то и хитрость, что ptr хранит только то, что мы ему непосредственно передали функцией TblSetItemPtr. А то, что в документации на этот счет написано будто бы textTableItem использует ptr — ни что иное, как легкое преувеличение. :)
|