• Мобильные новости
  • Обзоры и статьи о PDA
  • Программы и игры Pocket PC
  • Группа о КПК ВКонтакте
  • Работа с полями таблицы

    Проблемам, связанным с применением 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 — ни что иное, как легкое преувеличение.

    Ронин Виктор

    цветное акриловое стекло для козырьков

    карта сайта | связь