×
Namespaces

Variants
Actions

Пример класса RBufConsole

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Пример кода
Исходный файл: Media:WikiConsoleExample.zip

Статья
Автор: Carbider (30 Nov 2007)
Последнее редактирование: hamishwillee (10 Nov 2011)
== Аннотация ==

Этот пример показывает как работать с дескрипторами RBuf, затрагивает тему обозревателей Observers. Прилагается файл с исходными кодами.


Contents

Введение

Часто приложениям необходимо выводить текстовые сообщения с целью отладки, либо для общения с пользователем.

Если Вы разрабатываете 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"));


Загрузить этот пример

  • Загрузить рабочий исходный код этого примера можно отсюда: File:WikiConsoleExample.zip .
  • Со временем, функциональность класса будет расширяться.
  • RBuf
This page was last modified on 10 November 2011, at 03:17.
49 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×