_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 descriptor)TLitC,它可以在任何使用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 函数来更改数据,如前面的例中所示
1、const TDesC& 表示只读的数据和字符串。
2、TDes& 表示可以被修改的数据和字符串。
函数方法小结
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、只有TPtr和TBuf才有的函数:
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. TTime转TBuf型
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. TDateTime转TBuf型
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. TBuf和Tint互转型
// 15位数字
TInt iNum1(123456789009876);
// TInt转TBuf
iBuf.Num(iNum1);//当buf只用来转Tint时可以使用AppendNum,但是性质是不一样的
// 使用iBuf包含的内容创建TLex对象
TLex iLex(iBuf);
TInt iNum2;
//TBuf转TInt
iLex.Val(iNum2);// Num2现在包含了15位数字
4. TBuf转TDateTime型
将长的TBuf截成小段,分别是年月日时分秒,通过下面TBuf转TInt ,再分别把转换成TInt的年月日取出,通过TDateTime的setYear(),setMonth()等方法将时间set进TdateTime。
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) );