This page was last modified 07:20, 3 December 2007.
Пример класса RBufConsole
From Forum Nokia Wiki
Contents |
Аннотация
Этот пример показывает как работать с дескрипторами RBuf, затрагивает тему обозревателей Observers. Прилагается файл с исходными кодами.
Введение
Часто приложениям необходимо выводить текстовые сообщения с целью отладки, либо для общения с пользователем.
Если Вы разрабатываете GUI приложение, то Вам наверняка понадобиться текстовое хранилище, содержание которого может быть отображено графически.
Я разработал класс RBufConsole который удобен для этих целей, а так же является хорошим примером дескрипторов RBuf.
RBuf это Symbian деспритор, который позволяет работать со строками и бинарными данными.
В данном примере RBuf используется для добавления строк, распределения памяти под буфер данных и для передачи параметров в функции.
Кроме того, класс RBufConsole может использоваться Активным Объектом, когда тот выполняет свои задачи.
Это возможно благодаря (M-классу) RBufConsoleObserver разработанному согласно парадигме обозревателей.
В соответствии с этим, Активный Объект может вызвать callback-функцию, чтобы добавить новое сообщение.
Когда Активный Объект прекращает работу, он может отобразить все содержимое хранилища, или это может сделать главная программа.
Конструктор класса RBufConsole
Конструктор инициализирует текстовое хранилище MessageStorage, которое является экземпляром класса RBuf. Так же, конструктор назначает идентификатор ресурса(rss) для графического сообщения (что будет рассмотрено ниже).
CRBufConsole::CRBufConsole(TInt aResourceID) { // Установить ID ресурса, определенного в .rss файле MessageDialogResourceID = aResourceID; //Инициализация хранилища TInt maxSizeOfMsgData = 150; _LIT(KGenesis , "App starts\n"); MessageStorage.Create(KGenesis(), maxSizeOfMsgData); }
Метод Append()
Метод Append() проверяет, чтобы буфер не был переполнен при добавлении нового сообщения. В противном случае, память для буфера будет перераспределена.
void CRBufConsole::Append(TPtrC16 appendString) { const TInt newLength = MessageStorage.Length() + appendString.Length(); if (MessageStorage.MaxLength() < newLength ) { //Выделить память для хранилища, если уже недостаточно MessageStorage.ReAlloc(newLength); } MessageStorage.Append(appendString); }
Метод Show()
По решению программиста, все сообщения, находящиеся в RBufConsole хранилише, могут быть отображены на экране. Для этого был написан этот метод:
void CRBufConsole::Show() { _LIT(KDialogHeader, "Output"); RBuf title; CAknMessageQueryDialog* dlg = new (ELeave)CAknMessageQueryDialog(); dlg->PrepareLC(MessageDialogResourceID); title.Create(KDialogHeader()); dlg->QueryHeading()->SetTextL(title); //Установить хранилище, которое нужно вывести dlg->SetMessageTextL(MessageStorage); //Показать прокручиваемое сообщение dlg->RunLD(); title.Close(); return; }
Файл ресурса для диалога Message Query Dialog
В Вашем .rss файле должен быть определен ресурс для диалога CAknMessageQueryDialog. Далее он будет передан в качестве параметра конструктору таким образом:
CRBufConsole (R_RBUFCONSOLE_QUERY_DIALOG);
Текст ресурса:
RESOURCE DIALOG r_rbufconsole_query_dialog { flags = EGeneralQueryFlags | EEikDialogFlagNoBorder | EEikDialogFlagNoShadow; buttons = R_AVKON_SOFTKEYS_OK_EMPTY; items= { DLG_LINE { type = EAknCtPopupHeadingPane; id = EAknMessageQueryHeaderId; itemflags = EEikDlgItemNonFocusing; control = AVKON_HEADING { }; }, DLG_LINE { type = EAknCtMessageQuery; id = EAknMessageQueryContentId; control = AVKON_MESSAGE_QUERY { }; } }; }
Пример использования
Добавить новое сообщение:
iConsole.Append(_L("Шаг 1\n"));
Вывести содержимое хранилища:
iConsole.Show(); //Выводит содержимое RBufConsole в графическом окне
Выполнить callback-функцию Append() из Активного Объекта:
iRBufConsoleObserver->ObserverAppend(_L("Активный объект запущен\n"));
Загрузить этот пример
Загрузить рабочий исходный код этого примера можно отсюда: Image:WikiConsoleExample.zip . Со временем, функциональность класса будет расширяться.
Внешние Ссылки (на английском)
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Эмулятор не видит mbm | dotice | Russian Developer Forum - Форум Российских разработчиков | 4 | Today 04:59 |
| CAknView | b_monkey | Russian Developer Forum - Форум Российских разработчиков | 7 | 2007-12-04 12:12 |
| Делаем основной цикл игры | Ecconaut | Russian Developer Forum - Форум Российских разработчиков | 17 | 2007-12-12 04:32 |
| NokiaCLFileTransfer | soumi | Russian Developer Forum - Форум Российских разработчиков | 3 | 2008-07-02 09:50 |
| Отслеживание событий журнала звонков | Den123 | Russian Developer Forum - Форум Российских разработчиков | 2 | 2008-03-11 06:09 |
