Symbian开发中描述符的使用

 

_LIT

使用宏_LIT_LIT16_LIT8)和_L定义字符串常量

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

 

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

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

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

_LIT()宏的结果(就是上面的KMyFile)实际上是个文字描述符(literal descriptorTLitC,它可以在任何使用TDesC&的地方使用。 可以使用()操作符将描述符转换成常量的TDesC对象如:TInt length=KHelloWorld().Length()

 

  TbufC<n>

TBufC<n>一般用于文本数据。对于二进制数据,应显示地使用TBufC8<n>。尽管TBufC<n>意味着数据不能被修改(C’代表Constant:不变的),但是还有两种方法可以改变数据:

  ·数据可以使用赋值运算符进行替换。

  ·通过使用Des()函数来为缓冲区数据构建一个TPtr可修改的指针描述符。

 

TBufC的用法如下:

_LIT(KHelloWorld, "Hello World");

const TInt maxBuf = 32;

TBufC<maxBuf> buf;

TInt currentLen = buf.Length(); // == 0

buf = KHelloWorld;

currentLen = buf.Length(); // == 11

TText ch = buf[2]; // == 'l'

 

TBufC的用法如下:

const TInt bufLen = 6;

/用文字实例化

_LIT(Ktext, "TestText");

TBufC<10> Buf (Ktext);     

// TBufC<10> Buf2;

Buf2 = Ktext;

 

//用现有的TBufC来创建一个新的TBufC

TBufC<10> Buf3(Buf2);

 

//测试用的一些文字

_LIT(Ktext , "Test Text");

_LIT(Ktext1 , "Test1Text");

//生成TPtrC

TBufC<10> Buf1 ( Ktext );

TBufC<10> Buf2 ( Ktext1 );

//改变Buf2的上下文

Buf2 = Buf1;

//创建一个空的TbufC并把它赋给Buf1

TBufC<10> Buf3;

Buf3 = Buf1;

 

另一种改变TBufC<n>的上下文内容的方式是使用Des()成员函数。这个成员函数使用TPtr成员返回一个TPtr可修改的指针描述符。TPtr的最大长度是TBufC<n>模板参数的值。

HbufC

HBufC通常在以下几种情况下使用:

在运行时从资源文件中加载字符串

从用户界面中接收用户输入的字符串

从应用程序引擎中接收字符串,如contacts database中的名字

     HBufC中的内容进行修改:

_LIT(KHello, "Hello!");

_LIT(KWorld, "World!");

HBufC* heapBuf = HBufC::NewL(KHello().Length());

*heapBuf = KHello;    //buf holds "Hello!"

 

 //第二种方式是采用Alloc()AllocL()AllcLC()来处理,

 //不过这是已经存在的数据的管理方式。新的Heap Descriptor

//可以自动的根据这个内容来构造。

_LIT (KText , "Test Text");

TBufC<10>  CBuf = KText;

HBufC * Buf1 = CBuf.AllocL();

CleanupStack::PushL(Buf1);

 

 // 通过可修改指针来改变数据的方式

TPtr Pointer = Buf1->Des();

//添加数据

LIT ( KNew, "New:");

Pointer.Append(KNew);

//删除数据

Pointer.Delete(Pointer.Length() - 2, 2);

 

heapBuf = heapBuf->ReAllocL(KHello().Length() + KWorld().Length());

CleanupStack::PushL(heapBuf);

 

 

 

在使用HbufC时,要记住两种情况:

·如果你需要把HbufC传递给一个用TDesC&作为参数的函数,你只须简单地取消对HBufC指针的参照即可。

·可以通过使用ReAlloc函数来改变堆描述符缓冲区的大小,就象对于TBufC<N>的情况一样.

 

//创建一个堆描述符,有两种方法

//第一种方法使用New(),NewL()NewLC()之一

//让我们看一个例子.这里将构建一个HbufC:所用数据空间为15,但是当前大小是0

HBufC * Buf = HBufC::NewL(15);

// 第二种方法使用

// 现有描述符的Alloc(), AllocL(), AllocLC()方法。这个新的堆描述符用描述符的内容自动初始化

_LIT (KText , "Test Text");

TBufC<10> CBuf = KText;

HBufC * Buf1 = CBuf.AllocL()

TInt BufSize = Buf->Size();

TInt BufLength = Buf->Length();

 

// 改变HbufC的指向

_LIT ( KText1 , "Text1");

 

//使用赋值运算符来改变指向KText1的缓冲区

*Buf1 = KText1;

 

// 下面通过可修改的指针描述符来改变 数据

TPtr Pointer = Buf1->Des();

Pointer.Delete( Pointer.Length() - 2, 2 );

 

// 所有能对 TBufC<n> 进行的操作在些都可用

//下面是一个这样的操作

_LIT ( KNew, "New:");

Pointer.Append( KNew );

 

TPtrC<n>

让我们先记住如何创建TPtr

 

  ·用另一个TPtr

 

  ·从TBufC<N>,或者通过成员函数Des()使用HbufC来创建。

 

  ·从一个指向内存的外部指针并指定最大长度。

 

  ·从一个指向内存的外部指针并指定数据及其最大长度。

 

LIT(KText, "Test Data");

TBufC<10> NBuf ( KText );

TPtr Pointer = NBuf.Des();

//第一种方法

TPtr Pointer2 ( Pointer );

 

// 现在我们看一下,怎么用TPtr 替换数据,这完全可以通过

//赋值运算符或拷贝函数来实现

_LIT(K1, "Text1");

_LIT(K2, "Text2");

Pointer2 = K1; // 数据是Text1

Pointer.Copy(K2); // 数据是Text2;

// 我们还可以改变数据的长度或把它设置为0

Pointer2.SetLength(2); // 只剩下 Te两个字符

Pointer2.Zero(); // 把长度设置为0

//可以使用delete 函数来更改数据,如前面的例中所示

 

 

1const  TDesC&amp;  表示只读的数据和字符串。

2TDes&amp;  表示可以被修改的数据和字符串。

 

函数方法小结

 1、描述符都有的方法:

  TInt Locate(TChar aChar) const;    定位指定字符的位置;

  TInt Compare(const TDesC16& aDes) const;  按字节比较两个描述符大小

  TInt Match(const TDesC16& aDes) const  搜索指定描述符的位置,可使用? *等通配符

  TInt Find(const TDesC16& aDes) const;    搜索指定描述符在当前描述符中第一次出现的位置

  TPtrC16 Left(TInt aLength) const      提取描述符最左边的数据

  TPtrC16 Right(TInt aLength) const    提取描述符最右边的数据

  TPtrC16 Mid(TInt aPos) const        提取描述符中间的位置

 2、只有TPtrTBuf才有的函数

  void Append(const TDesC16& aDes);    在描述符后面添加一个字符;

   LowerCase():将描述符转为小写字母

   UpperCase():将描述符转为大写字母

  void Insert(TInt aPos,const TDesC16& aDes)在指定位置插入新的描述符

  void Delete(TInt aPos,TInt aLength);在指定位置删除指定长度个数据项 

使用总结:

1.       HBufC->Des()来调用TDesC的函数。应该是直接使用HBufC->的方式调用。

2.       调用参数为const TDesC& 的系统函数或者自定义函数时,应该是使用*HBufC的方式调用

 

一、声明内存
HBufC* sBufC = HBufC::NewL( 1024 );
TBuf<32> sBuf;

 

二、改变值(使用TDes的函数)
TPtr sDes = sBufC->Des();
sDes = _L("Abc");
sDes.Append( _L("def") );

 

sBuf = _L("Abc");
sBuf.Append( _L("def") );

 

三、引用值
void A( const TDesC& a1 );
A( *sBufC );
A( sBuf );

 

A( sBufC->Des() ); //错误的,不能用。

 

HBufC* sBufC2 = HBufC::NewL( 1024 );
sBufC2->Des() = *sBufC ;
TBuf<32> sBuf2 = *sBufC;

 

void A( const TDesC& a1 );

{

HBufC* sBufC2 = HBufC::NewL( 1024 );
sBufC2->Des() = a1;
TBuf<32> sBuf2 = a1;

}

 

TInt sLen = sBufC->Length();

 

TPtrC sPtrC(*sBufC); //sPtrC ==> "abcdef", sPtrC.Length() = 6
sPtrC.Set( sPtrC.Left( sPtrC.Length() - 1 ) ); //"abcde", sPtrC.Length() = 5

A ( sBufC->Left( 1 ) );

 

HBufC* sBufC3 = sBufC->AllocL();
delete sBufC3;

 

四、释放
delete sBufC;

 

 

格式转换:

常用的通知函数

NeikonEnvironment::MessageBox_L("Error: init file not found!") );

数字转字符串

Tbuf16<20>buf;

Tint iNum = 20;

buf.Format( _L(“%d”), iNum );

 

1.    TTimeTBuf

TBuf<32> theTime;//存储转换后的时间

TTime tt;

tt.HomeTime();

_LIT(KTimeFormat,"%Y%M%D%1-%2-%3 %H:%T:%S");//格式为:2006-03-04 12:12:12

tt.FormatL(theTime,KTimeFormat);

 

2.    TDateTimeTBuf

TTime currentTime;//声明一个TTime类型

currentTime.HomeTime();//设置TTime为当前时间

TDateTime tdt=currentTime.DateTime();//TTime  --->  TdateTime

TBuf<32> tmp;//存储转换完的Buf

tmp.AppendNum(tdt.Year());//AppendNum()方法将一个Tint加入到TBuf中。

_LIT(gang,"-");//声明一个横线分隔年月日,同样可声明冒号分隔小时分秒

tmp.Append(gang);

tmp.AppendNum(tdt.Month());

tmp.Append(gang);

tmp.AppendNum(tdt.Day());//…………时分秒的转换同上

 

3.    TBufTint互转型

// 15位数字

TInt iNum1(123456789009876);

// TIntTBuf

iBuf.Num(iNum1);//buf只用来转Tint时可以使用AppendNum,但是性质是不一样的

 

// 使用iBuf包含的内容创建TLex对象

TLex iLex(iBuf);

TInt iNum2;

//TBufTInt

iLex.Val(iNum2);// Num2现在包含了15位数字

 

4.    TBufTDateTime

将长的TBuf截成小段,分别是年月日时分秒,通过下面TBufTInt ,再分别把转换成TInt的年月日取出,通过TDateTimesetYear(),setMonth()等方法将时间setTdateTime

 

5. .symbian串转换成char

char* p = NULL;

TBuf8<20> buf( _L( "aaaaa" ) );

p = (char *)buf.Ptr();

 

6.char串转换成symbian

char* cc = "aaaa";

TPtrC 8 a;

a.Set( (const TUint8*)cc , strlen(cc) );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值