Проблемам, связанным с применением 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 ни что иное, как легкое преувеличение.
тем немее покупка продажа автомобилей дает нам
лототроны подставки
Логотипы, фирменный стиль: разработка логотипа, создание логотипа и фирменного стиля вашей фирмы
охранное агентство по охранные услуги http://www.globez.ru
раскрутка сайтов оптимизация и поисковая раскрутка сайтов
Русские традиции. Русские народные песни
авторынки москвы каталог продажа подержанных автомобилей авторынок