Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

中文 Descriptors的使用

From Wiki
Jump to: navigation, search
Article Metadata

文章
huwell 在 27 Jun 2007 创建
最后由 hamishwillee 在 15 Dec 2011 编辑

任何Symbian的开发者都要对Descriptors 有所了解,因为在这里,无论是普通文本还是二进制数据,都要用到它,开发任何的应用软件,游戏或多媒体程序,也都要接触到它,在这里做个简单的介绍,自己也能重温并学习一下。 以下内容摘自newlc的数篇经典文章,整理后也会加入了自己的一些内容和观点。

Contents

相关类的使用

TPtrC<n>的使用

它指向了一组数据,但没有包含处理方法。它是从TDesC中直接继承下来的,只包括从父类中继承的那些函数,以及它自身的构造和设置函数。 如何为使用这个对象呢?有如下几种方式:

  • 生成一个空的TPtrC对象,并使用Set()函数将它指向一组数据。
void Set(const TDesC16& aDes);


  • 在构造它时,就将数据传递进去。

例1:用TBuf和TBufC构造出TPtrC对象。

LIT(KText , "Test Code");
TBufC<10> Buf ( KText ); //或者为 TBuf<10> Buf ( KText );
// Creation of TPtr using Constructor
TPtrC Ptr (Buf);
// Creation of TPtr using Member Function
TPtrC Ptr1;
Ptr1.Set(Buf);


例2:用TText*构造TPtrC

const TText * text = _S("Hello World\n");
TPtrC ptr(text);
// 或者
TPtrC Ptr1;
Ptr1.Set(text);
//如果要存储TText的一部分数据,我们使用下列方法
TPtrC ptr4 ( text , 5 );


例3:从另一个TPtrC中构造TPtrC

const TText * text = _S("Hello World\n");
TPtrC ptr(text);
// 从一个TPtrC中获得另一个TPtrC
TPtrC p1(ptr);
// 或
TPtrC p2;
p2.Set(ptr);


例4:从TPtrC中获得TText*

// Set the TPtrC
_LIT(KText , "Test Code");
TBufC<10> Buf ( KText );
TPtrC Ptr1 (Buf);
// 获得TText *
TText * Text1 = (TText *)Ptr1.Ptr();//使用Ptr()方法即可
//从SDK里看到的是const TUint16* Ptr() const;
//然后又能找到typedef unsigned short int TText16;
//呵呵所以说这里可以直接给TText

TBufC<n>的使用

例1:

// 直接从字符串中构造
_LIT(Ktext, "TestText");
TBufC<10> Buf (Ktext);
// 或
TBufC<10> Buf2;
Buf2 = Ktext;
// 从已有的对象中生成新的TBufC
TBufC<10> Buf3(Buf2);


TBufC<n>一般用来存储文本数据,而TBufC8<n>则用来存储二进制数据。尽管这里的对象表示数据是不能被修改的(因为有个后缀C代表 了常量的意思),但仍然有两种方式可以用来修改数据:

  • 这里的数据可以用赋值的方式替换掉。
  • 使用Des()函数构造出一个TPtr对象,这样就可以用它来修改数据


下面是例子: 例1:

_LIT(Ktext , "Test Text");         
_LIT(Ktext1 , "Test1Text");
TBufC<10> Buf1 ( Ktext );
TBufC<10> Buf2 ( Ktext1 );
// 通过赋值的方式改变数据
Buf2 = Buf1;
TBufC<10> Buf3;
Buf3 = Buf1;


例2:通过使用Des()改变TBufC的数据

_LIT(Ktext , "Test Text");
_LIT(KXtraText , "New:");
TBufC<10> Buf1 ( Ktext );
TPtr Pointer = Buf1.Des();
// 删除后四个字符
Pointer.Delete(Pointer.Length()-4, 4 );
TInt Len = Pointer.Length();
// 增加新的数据
Pointer.Append(KXtraText);
Len = Pointer.Length();
// 也可以使用下列方式改变数据
_LIT(NewText , "New1");
_LIT(NewText1 , "New2");
TBufC<10> Buf2(NewText);
Pointer.Copy(Buf2);
// 或直接从字符串里获得数据
Pointer.Copy(NewText1);

总结,这里TBufC时,我们通过Des()获得TPtr对象,因此获得了从TDes继承的一系列管理数据的方法。很好:)


HBufC的使用

当我们不知道数据大小时,我们可以使用它来处理,这里的C表示它是个常量,但同样有两种方式来修改它的数据。第一个是使用赋值 操作,另一个也是使用可修改指针型Descriptor,如TPtr。

注意其大小可以通过ReAlloc函数来重新分配。

//有两种方式来生成一个Heap Descriptor
//第一种方式用New(),NewL(),或NewLC()
//如下操作便可以构建一个存放数据的空间,空间为15,不过目前大小//为0
HBufC * Buf = HBufC::NewL(15);
 
//第二种方式是采用Alloc(),AllocL()或AllcLC()来处理,不过这是已綺存在的数据的管理方式。新的Heap Descriptor可以自动的
根据这个内容来构造。
_LIT (KText , "Test Text");
TBufC<10> CBuf = KText;
HBufC * Buf1 = CBuf.AllocL();
 
//下面是通过赋值方式改变其数据的方法
_LIT ( KText1 , "Text1");
*Buf1 = KText1;
 
// 通过可修改指针来改变数据的方式
TPtr Pointer = Buf1->Des();
Pointer.Delete( Pointer.Length() - 2, 2 );
 
//这样我们添加删除数据了:)
_LIT ( KNew, "New:");
Pointer.Append( KNew );


TPtr的使用

通过上面的介绍,我们已綺看到它的使用方式,这里可以看看如何来构造它:

  • 通过另一个TPtr对象
  • 通过TBufC,HBufC的Des()方法获取
  • 通过内存中的确定指针和大小长度来生成
// 通过TBufC来生成
_LIT(KText, "Test Data");
TBufC<10> NBuf ( KText );
TPtr Pointer = NBuf.Des();
 
// 通过另一个对象来生成
TPtr Pointer2 ( Pointer );
 
//通过指定内存区域和大小来生成
const TText * Text = _S("Test Second");
TPtr Pointer3 ((TText*)Text ,11, 12);
 
//改变已有TPtr数据的方式:赋值和Copy()方法
_LIT(K1, "Text1");
_LIT(K2, "Text2");
Pointer2 = K1; // Data will be Text1
Pointer.Copy(K2); // Data Will be Text2;
 
// 可以改变数据的大小,并置0
Pointer2.SetLength(2); // 只有"Te"了呵呵

TBuf<n>的使用

这个对象的操作和从TBufC<n>中通过获得TPtr对象的进行的数据操作一样,可以Copy,Delete和赋值等。


描述符主要特性

  • 以同样的方式对待字符串和二进制数据。
  • 数据可以存放在内存的任何区域上——ROM或RAM,在堆或栈上都可以。
  • 描述符使用指针和长度信息来描述它包含的数据,有些描述符还包括最大长度的信息。


所有的描述符都是从抽象类TDesC中派生的,他们可以分为三个大类:

  • 缓冲区描述符——数据做为描述符对象的组成部分而存在,描述符对象存放在程序的堆栈中:TBuf和TBufC,
  • 堆描述符——数据做为描述符对象的组成部分而存在,描述符对象存放在堆中:HBufC,
  • 指针描述符——描述符对象和它所表示的实际数据是分开存放的:TPtr和TPtrC.


如果对照C/C++语法来看:

  • TPtrC可以被看作是const char*的使用
  • TBufC可以被看作是char[]的使用

其他类没有相应对照语句。


TDes和TDesC是抽象类,因此你不可能实例化它们。它们的主要用途是做为函数的参数来描述字符串和二进制数据。在这样的函数中,你应该按如下规则使用: 1、const TDesC& 表示只读的数据和字符串。 2、TDes& 表示可以被修改的数据和字符串。 (我们所看到大多数涉及Descriptor参数的函数和方法都使用了他们来描述)


Litterals

字符串常量可以使用_L()或_LIT()宏来定义。

  • _L()可以生成一个指向字符值的地址(TPtrC),它綺常被用来传递字符串到函数中:

NEikonEnvironment::MessageBox(_L("Error: init file not found!"));

  • _LIT()可以生成个常量名,以便以后重复使用:

_LIT(KMyFile, "c:\System\Apps\MyApp\MyFile.jpg");

  • _LIT()宏的结果(就是上面的KMyFile)实际上是个文字描述符(literal descriptor)TLitC,它可以在任何使用TDesC&的地方使用。


用法


TDesC中最常用的函数如下:

  • Ptr(),用来获得描述符数据中的指针。
  • Length(),用来获得描述符数据中的字符数。
  • Size(),用来获得描述符数据中的字节数目。
  • Cpmpare()或操作符==、!=、>=和<=等专为比较描述符数据用的。
  • 操作符[],可以被当作c/c++中一样,用来获得描述符字符串中的单个字符。
This page was last modified on 15 December 2011, at 10:01.
392 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.

×