Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

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
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX