<iframe align="right" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog02.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
利用TDesC为TBuf变量赋值时,必须首先调用TBuf的Delete()函数清空内容,否则如果用第一种方法,该TBuf变量不会正确赋值,尽管调试时跟踪TBuf变量的Length和iBuf指针内容都显示是正确的。
<iframe align="right" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog02.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>1. 简介
当我刚开始学习Symbian时,我遇到的第一件事情就是Symbian OS字符串的处理和使用问题。要学习Symbian字符串的使用,必须费一定脑筋才行。但是一旦你掌握了其中的要领,它就变得容易多了。
因此,下面我将解释我是怎样学习基本的Symbian OS
字符串处理并对之加以记忆的。
注意,理解本文的前提是对Symbian操作系统的工作机理有一定了解。
2. 背景
你要做的第一件事情是记住字符串描述符层次
结构图。这是很重要的,因为以后所有你要使用的五个描述符都派生于某些类,你必须了解它们分别是从哪些类派生的,以便确定应该使用哪些特别描述符及其使用场所。本文中我不准备解释什么是缓冲描述符及堆描述符的含义,以及可修改的描述符和不可修改的描述符是什么含义。但是,
我相信你必须对上面的术语有足够的了解才行。Symbian描述符层次结构看起来相当绝妙。你可以参考下图,该图来源于newlc。
3. TPtrC<n>用法<br><br> 其字面含义是"一个指向不可<a class="bluekey" target="_blank" href="http://www.yesky.com/key/1420/536420.html">被操</a>作的数据的指针"。关于TPtrC<n>,首先要记住,它不包含对自己的一些操作函数,而只含有构造器和设置方法。另外,既然它派生于TDesC,它就包含了TDesC的所有功能。<br><br> 指针指向数据的方式有下面两种:<br><br> ·先创建一个空的TPtrC<n>,然后用Set(...)函数把它指向一些数据。 <br><br> ·通过使用任何一个重载的<a class="bluekey" target="_blank" href="http://www.yesky.com/key/3379/193379.html">构造函数</a>,在构造过程中传递数据。<br><br> 让我们通过下面几个例子来看一下上面的描述:<br><br> 实例1:-从TBuf和TbufC中取得TPtrC:<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>LIT(KText , "Test Code");<br>TBufC Buf ( KText ); OR(/) TBuf Buf ( KText );<br>// 使用构造器创建TPtr<br>TPtrC Ptr (Buf);<br>//使用成员函数创建TPtr<br>TPtrC Ptr1;<br>Ptr1.Set(Buf);</td> </tr></tbody></table>
<br> 实例2:-从TText*中取得TPtrC:<br><br> 下面的实例使用了TText16:<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>TText * text = _S("Hello World\n");<br>TPtrC ptr(text);<br>// 或<br>TPtrC Ptr1;<br>Ptr1.Set(text);<br>//要只存储Ttext的一部分,我们可以使用下面的语句 <br>//这个描述符指针将只存储Hello<br>TPtrC ptr4(text,5);</td> </tr></tbody></table>
<br> 实例3:-从另外一个TPtrC取得TPtrC:<br><br> 你可以容易地把一个TPtrC赋值给另一个TPtrC。<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>TText * text = _S("Hello World\n");<br>TPtrC ptr(text);<br>//从另外一个TPtrC取得TPtrC<br>TPtrC p1(ptr);<br>//或<br>TPtrC p2;<br>p2.Set(ptr);</td> </tr></tbody></table>
<br> 实例4:-从TPtrC中取得TText *: <br><br> 我们可以通过Ptr()成员使用来从TPtrC中取得TText *。<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>//设置TPtrC<br>_LIT(KText,"Test Code");<br>TBufC Buf ( KText ); <br>TPtrC Ptr1 (Buf);<br>//取得TText*<br>TText* Text1 = (TText *)Ptr1.Ptr();</td> </tr></tbody></table>
<br>4. TBufC<n>的用法<br><br> 上面关于TPtrC的使用举例,有助于理解TBufC<n>的用法,不过下面有几个例子是关于如何创建TBufC<n>。<br><br> 实例5:-实例化TBufC<n>:<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>//用文字实例化<br>_LIT(Ktext, "TestText");<br>TBufC Buf (Ktext);<br>//或<br>TBufC Buf2;<br>Buf2 = Ktext;<br>//用现有的TBufC来创建一个新的TBufC<br>TBufC Buf3(Buf2);</td> </tr></tbody></table>
<br> TBufC<n>一般用于文本数据。对于二进制数据,应显示地使用TBufC8<n>。尽管TBufC<n>意味着数据不能被修改(’C’代表Constant:不变的),但是还有两种方法可以改变数据:<br><br> ·数据可以使用赋值运算符进行替换。<br><br> ·通过使用Des()函数来为缓冲区数据构建一个TPtr可修改的指针描述符。<br><br> 让我们看改变TBufC<n>的上下文的第一步。<br><br> 实例6:-改变TBufC<n>的上下文:<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>//测试用的一些文字<br>_LIT(Ktext , "Test Text");<br>_LIT(Ktext1 , "Test1Text");<br>//生成TPtrC<br>TBufC Buf1 ( Ktext );<br>TBufC Buf2 ( Ktext1 );<br>//改变Buf2的上下文<br>Buf2 = Buf1;<br>//创建一个空的TbufC并把它赋给Buf1<br>TBufC Buf3;<br>Buf3 = Buf1;</td> </tr></tbody></table>
<br> 另一种改变TBufC<n>的上下文内容的方式是使用Des()成员函数。这个成员函数使用TPtr成员返回一个TPtr可修改的指针描述符。TPtr的最大长度是TBufC<n>模板参数的值。所有的操作函数都来源于基类TdesC。<br><br> 实例7:-使用Des()来改变TBufC<n>的上下文:<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>_LIT(Ktext , "Test Text");<br>_LIT(KXtraText , "New:");<br>TBufC Buf1 ( Ktext );<br>TPtr Pointer = Buf1.Des();<br>// 删除最后4个字符<br>Pointer.Delete(Pointer.Length()-4, 4 );<br>//现在作相应的长度改变<br>TInt Len = Pointer.Length();<br>// 添加一个新串<br>Pointer.Append(KXtraText);<br>Len = Pointer.Length();<br>//要完全改变上面的缓冲区,我们可以使用下面的语句:<br>_LIT(NewText , "New1");<br>_LIT(NewText1 , "New2");<br>TBufC Buf2(NewText);<br>//改变上下文 <br>Pointer.Copy(Buf2);<br>//或者直接进行字面复制<br>Pointer.Copy(NewText1);<br>//所有上面所做的变化实际上改变了Buf1的上下文</td> </tr></tbody></table>
<br> 5. 使用堆描述符HBufC<br><br> 当我们不知道描述符中数据的大小时,HBufC是可选用的描述符。这里的’C’代表不变的(constant),这意味着数据是不可改变的,但是它在两种情况下也可以改变,就象对于TBufC<n>的情况所做的改变一样。第一种情况是使用赋值运算符,第二种情况是使用可修改的指针描述符,如使用成员函数时的TPtr。在使用HbufC时,要记住两种情况:<br><br> ·如果你需要把HbufC传递给一个用TDesC&作为参数的函数,你只须简单地取消对HBufC指针的参照即可。<br><br> ·可以通过使用ReAlloc函数来改变堆描述符缓冲区的大小,就象对于TBufC<n>的情况一样.<br><br> 实例8:-HbufC的用法:<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>//创建一个堆描述符,有两种方法<br>//第一种方法使用New(),NewL()或NewLC()之一<br>//让我们看一个例子.这里将构建一个HbufC:所用数据空间为15,但是当前大小是0<br>HBufC * Buf = HBufC::NewL(15);<br>// 第二种方法使用 <br>// 现有描述符的Alloc(), AllocL(), 或AllocLC()方法。这个新的堆描述符用描述符的内容自动初始化 <br>_LIT (KText , "Test Text");<br>TBufC CBuf = KText;<br>HBufC * Buf1 = CBuf.AllocL();<br>// 我们检查一下大小和长度。这里大小是18,而长度是9 <br>TInt BufSize = Buf->Size();<br>TInt BufLength = Buf->Length();<br>// 改变HbufC的指向<br>_LIT ( KText1 , "Text1");<br>//使用赋值运算符来改变指向KText1的缓冲区<br>*Buf1 = KText1;<br>// 下面通过可修改的指针描述符来改变 数据<br>TPtr Pointer = Buf1->Des();<br>Pointer.Delete( Pointer.Length() - 2, 2 );<br>// 所有能对 TBufC<n> 进行的操作在些都可用<br>//下面是一个这样的操作 <br>_LIT ( KNew, "New:");<br>Pointer.Append( KNew );</n>
</td> </tr></tbody></table>
<br> 6. TPtr的用法<br><br> 我们使用它来取代TBufC<n>和HBufC,因为我最了解它。因此,让我们先记住如何创建TPtr。<br><br> ·用另一个TPtr。<br><br> ·从TBufC<n>,或者通过成员函数Des()使用HbufC来创建。<br><br> ·从一个指向内存的外部指针并指定最大长度。<br><br> ·从一个指向内存的外部指针并指定数据及其最大长度。<br><br> 实例9:-TPtr的用法:<br><br><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr>
<td>//先让我们看一下两种取得TPtr的方法<br>_LIT(KText, "Test Data");<br>TBufC NBuf ( KText );<br>TPtr Pointer = NBuf.Des();<br>//第一种方法 <br>TPtr Pointer2 ( Pointer );<br>//第二种方法使用一个内存区段,用于存储数据和最大长度<br>TText * Text = _S("Test Second");<br>TPtr Pointer3 ( Text ,11, 12);<br>// 现在我们看一下,怎么用TPtr 替换数据,这完全可以通过<br>//赋值运算符或拷贝函数来实现<br>_LIT(K1, "Text1");<br>_LIT(K2, "Text2");<br>Pointer2 = K1; // 数据是Text1<br>Pointer.Copy(K2); // 数据是Text2;<br>// 我们还可以改变数据的长度或把它设置为0<br>Pointer2.SetLength(2); // 只剩下 Te两个字符<br>Pointer2.Zero(); // 把长度设置为0 <br>//可以使用delete 函数来更改数据,如前面的例中所示</td> </tr></tbody></table>
<br> 7. TBuf<n>的用法<br><br> 在这个数据结构中,其中的数据并不是固定不变的。运算、实例化和赋值都与TBufC<n>一致;对于它的修改操作,与TPtr一致,象复制、删除、赋值等等。我想这一部分就不用再给出例子了。<br></n></n></n></n></n></n></n></n></n></n></n></n></n></n></n></n></n></n></n></n></n>
相关推荐
本文档旨在介绍Symbian OS 编程的基础知识,包括对象的创建和析构、命名约定、错误处理和清除、描述符以及活动对象等内容。 #### 2. 对象的创建与销毁 **2.1 基本概念** 面向对象编程是Symbian OS 的核心特性之一...
描述符在SymbianOS中主要用于存储和操作字符数据,包括静态和动态分配的数据。 #### 二、描述符类型 SymbianOS提供了多种描述符类型来满足不同的需求: 1. **TBuf**:TBuf是描述符中最常用的一种,它可以用来存储...
4. **支持多语言和国际化的输入**:考虑到全球用户的需求,Symbian OS支持Unicode编码,这意味着输入法可以支持各种语言的输入,例如中文、英文等。 #### FEP开发模式及关键技术 - **FEP架构**:FEP作为输入法的...
SDK包含了模拟器、GBK和UNICODE转换的类,以及Java运行库和Perl。安装过程中,建议将SDK安装在C盘,以避免因盘符问题导致的潜在问题。如果安装过程中遇到Perl的问题,可能需要下载最新版本的ActivePerl。 安装完成...
本资料包" symbian中的字符串处理及简单的应用.zip"显然是为了帮助开发者理解和掌握Symbian平台上的字符串操作,并通过实例应用来加深理解。 首先,我们来看Symbian中的主要字符串类型:TDes和RDes。TDes是“临时...
开发者需要从Nokia的开发论坛下载S60 SDK,特别是0.9中文版,因为这个版本的模拟器是中文界面,还支持GBK和UNICODE转换。安装SDK时,建议将其安装在C盘,以避免因盘符问题导致的编译错误。SDK还包括Java运行库和Perl...
- 由于Symbian OS主要采用UCS-2编码,因此需要注意编码转换。 - **3.5 日期和时间** - 解释了如何在Python for S60中处理日期和时间。 - 包括本地化和时区支持等方面。 - **3.6 线程支持的限制** - 指出了在...
描述符是一种高效的数据结构,用于存储和操作字符串。它们不是简单的字符数组,而是包含了字符串数据以及与之相关的元数据,例如长度、容量和状态信息。这种设计允许描述符在内存管理上具有较高的效率,尤其是在处理...
谷歌早在 2002 年就进入了移动领域,可是由于目前的手机操作系统企业和手机企业相对封闭,提高了 行业的进入门槛,移动互联网的发展远没有拥有统一标准的传统互联网发展迅速,此次推出的开源手机操 作 系统平台就是...
支持Symbian S60、苹果iPhone OS 3.0和谷歌Android平台的手机终端软件稍后将陆续发布,目前正在研发过程中。 手机硬件平台 最低硬件配置 CPU:TI OMAP 850,200MHz ROM:32M RAM:32M 推荐硬件配置 CPU:...