系统开发培训学习教案_第1页
系统开发培训学习教案_第2页
系统开发培训学习教案_第3页
系统开发培训学习教案_第4页
系统开发培训学习教案_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1系统系统(xtng)开发培训开发培训第一页,共77页。第2页/共77页第二页,共77页。Nokia Series 80: 主要(zhyo)机型有Nokia9200 系列Nokia Series 60: 主要(zhyo)机型包括诺基亚7650、 6600、西门子SX1 等UIQ2、UIQ3: Sony Ericsson P800,P900Sony Sony Ericsson P900第3页/共77页第三页,共77页。安装ActivePerl(x86和x64分别对应(duyng)32位和64位cpu )jre (java的应用平台)Symbian OS SDK (建议安装在 盘符根目录下

2、)(C+)开发工具 第4页/共77页第四页,共77页。第一步:安装开发软件,搭建开发环境(下面主要介绍series 60 sdk, 其余类似(li s)第二步:在模拟器上开发调试(以VC环境开发为例)第三步:生成sis文件,在手机上安装运行第5页/共77页第五页,共77页。Visual C+ 6.0Borland C+ Builder 6Carbide C+第6页/共77页第六页,共77页。工程基本目录(ml)结构:1.aif用来存放程序图标2.data用来存放运行所需要(xyo)的资源文件 .rss。3.group中比较重要的几个文件:bld.inf、*.mmp。4.inc 和src 存放工

3、程头文件和源代 码文件。5.sis 用来存放 程序打包所需要(xyo)的pkg文件,打包后生成的安装文件 .sis也存放在此处。第7页/共77页第七页,共77页。1.bld.inf声明build的相关信息 通常只包括这次build会引用到的mmp文件。2.例如:3. PRJ_MMPFILES hello.mmp 4.2.mmp文件保存工程 编译相关信息,主要内容如下5. TARGET hello.app /目标名称6. TARGETTYPE app /目标类型7. UID 0 x100039CE 0 x07B9DE87 /UID 唯一系统标示符8. TARGETPATH systemappsh

4、ello /目标路径9. SOURCEPATH .src /源代码存放位置(wi zhi)10. SOURCE helloApp.cpp /源代码列表11. 12. 第8页/共77页第八页,共77页。 SOURCEPATH .data /资源文件路径(ljng) RESOURCE hello.rss /资源文件 LANG SC /默认英语 USERINCLUDE . USERINCLUDE .inc /头文件路径(ljng) SYSTEMINCLUDE . epoc32include /系统包含文件目录 LIBRARY euser.lib apparc.lib cone.lib eikcore

5、.lib LIBRARY eikcoctl.lib avkon.lib /库文件3. UID UID1-第一个UID(类型): UID1用来设定该应用程序是一个执行程序(executable file)还是一个数据文件(data file). UID value Numeric value (Hex) Meaning KExecutableImageUid 0 x1000007A .exe 可执行文件 KDaynamicLibraryUid 0 x10000079 .dll .app .ldd, .pdd 文件 KDirectFileStoreLayoutUid 0 x10000037dire

6、ct file store KPermanentFileStoreLayoutUid 0 x10000050permanent file store 第9页/共77页第九页,共77页。UID2-第二个UID(子类型): UID2-具体含义取决于UID1的值: 如果(rgu)UID1是KExecutableImageUid, UID2不使用,所以UID2的值可以随意取。 如果(rgu)UID1是KDynamicLibraryUid, UID2将会是: 如果(rgu)UID1是KDirectFileStoreLayoutUid或者KPermanentFileStoreLayoutUid,那么UID

7、2将是: UID value Numeric value (Hex) Meaning KSharedLibraryUid 0 x1000008D .dll KUidApp 0 x100039CE .app KLogicalDeviceDriverUid 0 x100000AF a logical decive driver (.ldd) KPhysicalDeviceDriverUid 0 x100039D0 a physical device driver(.pdd) UID value Numeric value (Hex) Meaning KUidAppDllDoc 0 x10003A1

8、2 indicates this is a file store created by an .app to store user data (i.e, a document) KUidAppInfoFile 0 x10003A38 Indicates this is an AIF file (a type of file store) 第10页/共77页第十页,共77页。UID3-第三个第三个UID(子子类型子子类型): 每个独立的应用程序有一个唯一的每个独立的应用程序有一个唯一的UID3值,它也被用作安全值,它也被用作安全ID(secure ID),对于对于UIKON应用程序而言,用于关联

9、应用程序而言,用于关联(gunlin)数据文件和程序:数据文件和程序:1. 对于对于dll和和exe文件,它辩识特定的二进制文件,它辩识特定的二进制(it identified the particular binary)。2. 对于对于.app(UIKON应用程序),它辩识特定的应用程序应用程序),它辩识特定的应用程序(it identified the particular application program).3. 对于由对于由.apps创建的文件存储创建的文件存储(file stores),它辩识和该文件相关的应用程序,它辩识和该文件相关的应用程序(it identifies th

10、e application program associated with this file).4. 对于其他文件存储对于其他文件存储(file stores), 它没有典型的用途(但是你可以自定义它的用途它没有典型的用途(但是你可以自定义它的用途) 第11页/共77页第十一页,共77页。Symbian 命名约定 Symbian大致分了四种类 C:C前缀表示类从CBase派生并应该基于堆构造。 T:T前缀表示一个简单类,这种类不拥有任何额外的资源。 如Tint、 TReal等基本数据类型。 R:R前缀表示一个资源类,它包含其它位置拥有资源的句柄。 M:M前缀表示一个接口类,它定义了接口但需要

11、派生类实现。结构(struct)类型作为T类对待,因为它也不拥有任何额外的资源,它的前缀通常(tngchng)是T(但也有一些以S开头)。 enum TColorsERed, /尽量用E开头 ,尽量用枚举EGreen成员变量的名字以i开头 ,参数名以a开头 class TMyClass TInt iMyValue; void MyAddFunc(TInt aArg1,TInt aArg2); void MyAddFunc(TInt aArg1,TInt aArg2); void MyAddFuncL(TInt aArg1,TInt aArg2);-后缀L的约定是该 函数可 能产生异常退出; v

12、oid MyAddFuncLC(TInt aArg1,TInt aArg2);-后缀LC的约定表示 成功完成之后,返回值会被压入清理栈中; (栈不保存); 第12页/共77页第十二页,共77页。Symbian 命名约定常量应加前缀K const CInt KMyconstant;宏全部为大写 #define MY_HARDCODED_VALUE (25) Symbian四个主要的应用软件框架类 针对右图Graphics ,UI程序应该具备的基本功能类:视图(View)、文档(Document)、应用程序(Application)、应用程序UI(Application UI)。 所有的S60 U

13、I应用程序都具有一些基本功能: 提供(tgng)一个用户界面,用于显示信息并允许用户进行交互。 响应各种用户启动的事件,比如用户选择一个菜单项。 响应系统启动的不同事件,比如导致屏幕重绘的window服务器事件。能够保存和恢复应用程序数据。 可以唯一性的向框架标志自身。 向框架提供(tgng)有关应用程序的描述性信息,比如图标和标题等。第13页/共77页第十三页,共77页。Symbian四个主要的应用软件框架类 一个程序只能有一个文档,可以有多个视图。必须创建下面的每个方法,才能提供最小的S60应用程序:所有S60 UI都实现一个全局函数E32DLL(),当应用程序启动时,框架将首先调用该函数

14、,该函数也称为DLL入口点,应用程序必须存在该函数。 框架调用NewApplication(),创建Application类,其基类是CAknApplication. Application类创建应用程序类的Document对象 ,并返回它的指针,以后框架使用该指针完成应用程序的创建。由框架调用AppDllUid()返回应用程序的UID。该函数必须返回在.mmp文件中指定的值。 Document基类是CAknDocument. Document对象通过(tnggu)CreateAppUiL创建获取AppUi类的指针。AppUi类的基类是CAknAppUi 或者 CAknViewAppUi ,它

15、是用来处理应用程序事件,如操作菜单,操作视图,切换视图等等。View 是控制类(c类),在屏幕上显示数据,用户与界面交互,传递命令给AppUi。第14页/共77页第十四页,共77页。Symbian处理内存泄漏的手段 1.Trap和TrapD 处理异常 TInt err; Trap(err,CreateObject(); /需要先定义err变量 TrapD(err,CreateObject(); /不需要定义err变量 2.CleanupStack 它是处理内存泄漏的又一重要手段 CFoo *p = new (ELeave) CFoo(); CleanupStack:PushL(p) p-Som

16、eFunctionL(); /可能异常退出,使得delete p 得不到调用 CleanupStack:Pop(); delete p; Symbian二阶段构造 在Symbian中,如果在一个类的构造函数中需要执行某些比如申请内存等操作(cozu),那么有可能会Leave。如果Leave的话,这个时候这个类的析构 函数是不会被调用,因为还没有初始化完,也就没法把自己加入CleanupStack,那么那些申请了的内存可能会因为没有变量引用而造成内存泄漏。因此 在Symbian中类的构造函数中不能有可能会Leave的代码。 第15页/共77页第十五页,共77页。Symbian二阶段构造二阶段构造

17、初始化一个类确实需要执行某些可能会初始化一个类确实需要执行某些可能会Leave的函数,这就是的函数,这就是Symbian中要求中要求的两阶段初始化了。第一阶段,也就是在构造函数中执行一些不会的两阶段初始化了。第一阶段,也就是在构造函数中执行一些不会(b hu) Leave的初始化工的初始化工作。然后是第二阶段,把这个实例推进作。然后是第二阶段,把这个实例推进CleanupStack,再执行第二阶段的可能会,再执行第二阶段的可能会Leave的代码。当然,在析构函数中,要能的代码。当然,在析构函数中,要能 够处理部分初始化的情况,也就是实例没够处理部分初始化的情况,也就是实例没有初始化成功,也能释

18、放那些已经申请的内存或资源。有初始化成功,也能释放那些已经申请的内存或资源。 CGraphicsAppView:CGraphicsAppView()CGraphicsAppView* CGraphicsAppView:NewL( const TRect& aRect ) CGraphicsAppView* self = NewLC( aRect ); CleanupStack:Pop( self ); return self; CGraphicsAppView* CGraphicsAppView:NewLC( const TRect& aRect ) CGraphicsAppV

19、iew* self = new ( ELeave ) CGraphicsAppView; CleanupStack:PushL( self ); self-ConstructL( aRect ); return self; void CGraphicsAppView:ConstructL( const TRect& aRect ) CreateWindowL(); SetRect( aRect ); 第16页/共77页第十六页,共77页。描述符描述符 描述符是用来描述符是用来(yn li)存储文本和二进制的基本类存储文本和二进制的基本类抽象类抽象类(Abstract): ( TDes、

20、TDesC、TDes8、TDesC8),描述符的基类,仅提供接口和基本功能,不能被实例化,一般只用作函数的参数。,描述符的基类,仅提供接口和基本功能,不能被实例化,一般只用作函数的参数。文字常量文字常量( Literal):(TlitC、_LIT(),用于存储文字字符串,用于存储文字字符串(literal string),即,即C中字符串常量,通常使用中字符串常量,通常使用_LIT()这种方式,也有这种方式,也有_L(),_L8()这种方式。这种方式。 栈类栈类( Buffer):(TBuf、TBufC、 TBuf8、TBufC8),数据存储于栈上,最基本的描述符变量类型,大小在编译时确定,包

21、含描述符本身数据,使用最为普遍,数据存储于栈上,最基本的描述符变量类型,大小在编译时确定,包含描述符本身数据,使用最为普遍,具体方法如下具体方法如下堆类堆类( Heap):(HBufC、HBufC8),数据存储于堆上,大小在运行时确定,数据存储于堆上,大小在运行时确定 , 也就是用来也就是用来(yn li)处理动态申请的描述符类。在处理动态申请的描述符类。在C/C+中用过动态内存的都知道,中用过动态内存的都知道, 动态内存是啥回事,这里堆类描述符用的时候,也是差不多,由于堆描述符动态内存是啥回事,这里堆类描述符用的时候,也是差不多,由于堆描述符 没有构造函数,所以只能声明为指针类型,通过堆描述

22、符类内静态函数没有构造函数,所以只能声明为指针类型,通过堆描述符类内静态函数NewL 方法申请内存,具体方法如下方法申请内存,具体方法如下 HBufC* errorTitleCode = HBufC:NewLC(50); HbufC* unUseCode = NULL;指针类指针类(Pointer):(TPtr、TPtrC、TPtr8、TPtrC8),本身不包含描述符数据,但是包含长度数据,而且还包含一个指向位于描述符之外数据的指针。,本身不包含描述符数据,但是包含长度数据,而且还包含一个指向位于描述符之外数据的指针。 第17页/共77页第十七页,共77页。描述符关系描述符关系(gun x)简

23、图简图 第18页/共77页第十八页,共77页。描述符的使用描述符的使用 文字描述符常量文字描述符常量 _LIT(KMyFile, “c:SystemAppsMyAppMyFile.jpg”);它可以在任何使用它可以在任何使用TDesC& 的地方使用的地方使用 。 /常用的通知函数常用的通知函数 NEikonEnvironment:MessageBox(_L(Error: init file not found!); /数字转字符串数字转字符串 TBuf16 buf;/ TInt iNum = 20; buf.Format( _L( %d ) , iNum ); 栈描述符栈描述符 栈类描

24、述符声明时必须指定描述符的最大长度,否则栈类描述符声明时必须指定描述符的最大长度,否则(fuz)无法声明和定义无法声明和定义 ,举例如下:,举例如下: / 直接从字符串中构造直接从字符串中构造 _LIT(Ktext, TestText); TBufC Buf (Ktext); / 或从字符串赋值或从字符串赋值 TBufC Buf2; Buf2 = Ktext; / 从已有的对象中生成新的从已有的对象中生成新的TBufC TBufC Buf3(Buf2);第19页/共77页第十九页,共77页。描述符的使用描述符的使用 栈描述符栈描述符 尽管这里的对象表示数据是不能被修改的(因为有个后缀尽管这里的

25、对象表示数据是不能被修改的(因为有个后缀C代表了常量的意思),但仍然有两种方式可以用来修改数据内容:这里的数据可以用赋值的方式替换掉;使用代表了常量的意思),但仍然有两种方式可以用来修改数据内容:这里的数据可以用赋值的方式替换掉;使用Des()函数构造出一个函数构造出一个TPtr对象,这样就可以用它来修改数据。对象,这样就可以用它来修改数据。 _LIT(Ktext , Test Text); _LIT(Ktext1 , Test Text”); _LIT(KXtraText , New:); TBufC Buf1 ( Ktext ); /Buf1长度为长度为9 内容内容 “Test Text”

26、TBufC Buf2 ( Ktext1 ); /Buf2长度为长度为10 内容内容 “Test1 Text”/ 通过赋值的方式改变数据通过赋值的方式改变数据Buf2 = Buf1; /Buf2长度变为长度变为9 内容内容 “Test Text”/通过使用通过使用Des()生成指针改变生成指针改变TBufC的数据的数据TPtr Pointer = Buf1.Des();/ 删除后四个字符删除后四个字符Pointer.Delete(Pointer.Length()-4, 4 ); /Buf1长度变为长度变为5 内容内容“Test ” / 增加新的数据增加新的数据Pointer.Append(KXt

27、raText); /Buf1长度为长度为9 内容为内容为“Test New:”/ 也可以使用下列也可以使用下列(xili)方式改变数据方式改变数据 TBufC Buf3(NewText);Pointer.Copy(Buf3);/Buf1长度为长度为4,内容为,内容为New1/ 或直接从字符串里获得数据或直接从字符串里获得数据Pointer.Copy(NewText1);/Buf1长度为长度为4,内容为,内容为New2第20页/共77页第二十页,共77页。描述符的使用描述符的使用 栈描述符栈描述符 可修改的描述符可修改的描述符TBuf, TBuf8就不用通过那么复杂的方法来实现修改,它直接可以用

28、就不用通过那么复杂的方法来实现修改,它直接可以用Copy、Delete等方法,但是无论可修改的还是不可修改的,一旦等方法,但是无论可修改的还是不可修改的,一旦(ydn)指定最大的数据长度后,最大长度就不能进行修改了修改的只是数据内容,而数据内容修改的受限条件是不能超过声明或定义时的最大长度。指定最大的数据长度后,最大长度就不能进行修改了修改的只是数据内容,而数据内容修改的受限条件是不能超过声明或定义时的最大长度。 堆描述符堆描述符 堆描述符堆描述符HBufC,HbufC8虽然都是不可修改类型的,但是它仍然具有构造和修改,与栈描述符不同的是:首先对内存需要显示释放,其次是堆描述符没有最大长度的限

29、制,任何时候都可以用虽然都是不可修改类型的,但是它仍然具有构造和修改,与栈描述符不同的是:首先对内存需要显示释放,其次是堆描述符没有最大长度的限制,任何时候都可以用ReAlloc()函数重新申请分配。有两种方式来生成一个堆描述符示例:()函数重新申请分配。有两种方式来生成一个堆描述符示例: /第一种方式用第一种方式用New(),NewL(),或或NewLC() HBufC * Buf = HBufC:NewL(15); /第二种方式是采用第二种方式是采用Alloc(),AllocL()或或AllcLC()来处理来处理 _LIT (KText , Test Text); TBufC CBuf =

30、 KText; HBufC * Buf1 = CBuf.AllocL(); CleanupStack:PushL(Buf1);堆描述符的修改方式:堆描述符的修改方式: /1.赋值方式改变其数据的方法赋值方式改变其数据的方法 _LIT ( KText1 , Text1); *Buf1 = KText1; 第21页/共77页第二十一页,共77页。描述符的使用描述符的使用堆描述符堆描述符堆描述符的修改方式:堆描述符的修改方式: / 2.通过可修改指针来改变数据的方式通过可修改指针来改变数据的方式 TPtr Pointer = Buf1-Des(); Pointer.Delete(Pointer.Le

31、ngth() - 2, 2); /删除数据删除数据 _LIT ( KNew, New:); Pointer.Append(KNew); /添加数据添加数据重新申请内存重新申请内存 Buf1 = Buf1-ReAllocL(KText().Length() + KNew().Length(); CleanupStack:PushL(Buf1);释放内存释放内存 delete Buf; Buf = NULL;指针描述符指针描述符不可修改的指针不可修改的指针TPtrC 可用可用TBuf和和TBufC构造出构造出TPtrC对象对象 _LIT(KText , Test Code); TBufC Buf

32、( KText ); /或者或者(huzh)为为 TBuf Buf ( KText ); TPtrC Ptr (Buf); /使用构造函数初始化使用构造函数初始化 TPtrC Ptr1; Ptr1.Set(Buf); /利用利用set函数初始化函数初始化 第22页/共77页第二十二页,共77页。描述符的使用描述符的使用指针描述符指针描述符不可修改的指针不可修改的指针TPtrC 用用TText*构造构造TPtrC const TText* text = _S(Hello Worldn); TPtrC ptr(text); / 或者或者 TPtrC Ptr2; Ptr2.Set(text); /如

33、果要存储如果要存储TText的一部分数据,我们使用下列方法的一部分数据,我们使用下列方法 TPtrC ptr4(text, 5); 从另一个从另一个TPtrC中构造中构造TPtrC const TText * text1 = _S(Hello Worldn); TPtrC Ptr3(text1); / 从一个从一个TPtrC中获得另一个中获得另一个TPtrC TPtrC p1(Ptr3); / 或或 TPtrC p2; p2.Set(Ptr3);可修改的可修改的TPtr 同不可修改的指针描述符构造方法基本类似,区别在于同不可修改的指针描述符构造方法基本类似,区别在于(ziy),不可修改的指针描

34、述符,不可修改的指针描述符TPtrC的函数始终是不可修改的,因此没有的函数始终是不可修改的,因此没有Insert,Delete等函数,并且没有等函数,并且没有Des()函数,但有函数,但有Alloc(),Compare(),Find(),Mid(),Size()等函数。等函数。第23页/共77页第二十三页,共77页。动态数组动态数组 在传统在传统c/c+中经常会使用数组来存储中经常会使用数组来存储(cn ch)序列,它是具有相同数据类型的数据元素的集合,通过数序列,它是具有相同数据类型的数据元素的集合,通过数组可以很方便的实现数据元素的访问等相关操作。动态数组是一个类的模板,可以接受各种各样组

35、可以很方便的实现数据元素的访问等相关操作。动态数组是一个类的模板,可以接受各种各样的数据类型,的数据类型,Symbian OS主要提供了主要提供了3类动态数组:类动态数组: RArray , RPointerArray, CArray活动对象活动对象 在在symbian os 中活动对象是一种非抢先式多任务处理的机制,是中活动对象是一种非抢先式多任务处理的机制,是symbian os 中一中一个十分重要的概念。可用于替代个十分重要的概念。可用于替代Symbian OS中的多线程中的多线程 。使用活动对象可获得的好处是:在同。使用活动对象可获得的好处是:在同一个线程中运行的活动对象之间进行切换的

36、代价要比线程上下文的切换代价低,这使得对于各种一个线程中运行的活动对象之间进行切换的代价要比线程上下文的切换代价低,这使得对于各种资源比较紧张的资源比较紧张的Symbian OS来说,使得活动对象更适合事件驱动多任务。来说,使得活动对象更适合事件驱动多任务。 概念:一个活动对象必须派生自基类概念:一个活动对象必须派生自基类CActive class CActive : public CBasepublic: enum Tpriority EPriorityIdle = -100; EPriorityLow = -20; EPriorityStandard = 0; EPriorityUserI

37、nput = 10; EPriorityHigh = 20;第24页/共77页第二十四页,共77页。活动对象活动对象 public: IMPORT_C CActive (); IMPORT_C void Cancel ();/删除未完成请求的函数删除未完成请求的函数 IMPORT_C void SetPriority (TInt aPriority); Inline TBool IsActive () const; protected: IMPORT_C CActive (TInt aPriority); IMPORT_C void SetActive (); virtual void DoC

38、ancel () = 0;/两个两个(lin )纯虚函数,继承类必须实现它们纯虚函数,继承类必须实现它们 virtual void RunL () = 0;/处理函数处理函数 IMPORT_C virtual TInt RunError (TInt aError);public: TrequestStatus iStatus;/代表请求状态代表请求状态 .private: TBool iActive; . 构造时也会有一个优先级值来决定它们如何被调度构造时也会有一个优先级值来决定它们如何被调度 Cancel 和和DoCancel用来取消发出的请求,用来取消发出的请求,Docancel是一个纯虚

39、函数,需要由派生类实现。是一个纯虚函数,需要由派生类实现。Cancel的功能就是调用的功能就是调用DoCancel,如果用户取消当前请求调用,如果用户取消当前请求调用Cancel而不是而不是DoCancel,但在代码中要实现,但在代码中要实现Docancel第25页/共77页第二十五页,共77页。活动对象活动对象IsActive确定活动对象是否处于活动状态确定活动对象是否处于活动状态SetActive 激活活动对象,一般在调用请求后紧接着调用它。激活活动对象,一般在调用请求后紧接着调用它。RunL 异步事件处理函数,当一个请求完成时,活动对象调度器会调用这个函数,进行下一步处理异步事件处理函数

40、,当一个请求完成时,活动对象调度器会调用这个函数,进行下一步处理RunError 当当RunL函数出现异常时会出现函数出现异常时会出现RunError函数,它也是纯虚函数,需要派生类实现。函数,它也是纯虚函数,需要派生类实现。 具体例子见文档。具体例子见文档。文件管理文件管理 symbian系统采用了系统采用了C/S(客户端客户端/服务器服务器)的架构。对于文件操作,系统有一个文件系统管理的服的架构。对于文件操作,系统有一个文件系统管理的服务器。程序通过联结这个文件管理服务器来进行文件务器。程序通过联结这个文件管理服务器来进行文件 。 在在symbian os 中,中,Flash(闪存)通常被

41、定义在(闪存)通常被定义在c盘,盘,symbian智能手机中还有一个智能手机中还有一个ROM存储器存储器通常被映射在通常被映射在z盘,用户的许多文件也存放在盘,用户的许多文件也存放在z盘。其他可移动存储(如存储卡)则映射在盘。其他可移动存储(如存储卡)则映射在d,e等等盘符。盘符。 symbian开发环境下各盘符对应的映射关系:开发环境下各盘符对应的映射关系: 客户机客户机c:盘盘 对应开发平台中对应开发平台中sdk的的 epoc32winsc目录目录 客户机客户机d:盘盘 对应开发平台中对应开发平台中sdk的的epoc32winsd目录目录 客户机客户机z:盘盘 对应开发平台中对应开发平台中

42、sdk的的epoc32releasewinsurelz目录或者目录或者 epoc32releasewinsurelz文件命名规则文件命名规则 一个完整的一个完整的symbian os 文件应该包含以下四个部分文件应该包含以下四个部分 1.驱动器名,即盘符驱动器名,即盘符 2. 路径,从根目录到或当前会话路径,从根目录到或当前会话(huhu)目录起到文件经过的所有目录路径目录起到文件经过的所有目录路径 3.文件名,遵循文件名,遵循c/c+命名规范命名规范 4.文件扩展名文件扩展名 例如:例如:c:myfiledata.txt就是合法的文件名,一个完整的文件名不能超过就是合法的文件名,一个完整的文

43、件名不能超过255个字符。个字符。第26页/共77页第二十六页,共77页。文件管理文件管理文件访问流程文件访问流程 1.应用程序要进行文件读写之前,必须建立应用程序与文件服务器的连接,这种连接也称会话(应用程序要进行文件读写之前,必须建立应用程序与文件服务器的连接,这种连接也称会话(session),),Sysmbian os中提供中提供RFs类来实现这个功能,该类提供了类来实现这个功能,该类提供了Connect()和和Close()函数来建立和关闭连接。函数来建立和关闭连接。 RFs fsSession; /建立建立RFs类的对象类的对象 User:LeaveIfError(fsSessio

44、n.Connect(); /建立连接,为防止出现异常放建立连接,为防止出现异常放 User:LeaveIfError中中 fsSession.Close(); /用完关闭连接用完关闭连接 2.文件服务器可以实现文件的读、写、删、建,文件服务器可以实现文件的读、写、删、建, 通过通过 RFile的的Open(RFs aFs, const TDesC& aName, TUnit aFileMode) 打开文件打开文件 。 通过通过Write( )和和Read( )可以实现文件的写和读。可以实现文件的写和读。 RFile的的Create( )用于建立新文件。用于建立新文件。 删除文件可以使用

45、删除文件可以使用RFs的的Delete( )。 3.另一种比较重要的文件读写方式另一种比较重要的文件读写方式 -流(流(Stream) 文件输出流文件输出流 RWriteStream 和文件输入流和文件输入流RReadStream 文件输出六主要使用文件输出六主要使用RWriteStream 的派生类的派生类RFileWriteStream 将数据外化为流,它需要先打开一个文件,打开文件的两种方式:将数据外化为流,它需要先打开一个文件,打开文件的两种方式: OpenL : 当文件不存在会产生异常,所以必须保证文件存在当文件不存在会产生异常,所以必须保证文件存在 Replace: 文件存在删除并

46、重建文件存在删除并重建(zhn jin)新的,不存在就创建,因每次都创建文件,会带来额外开销。新的,不存在就创建,因每次都创建文件,会带来额外开销。 例子:例子:RFileWriteStream writer;writer.PushL(); / writer on cleanup stackUser:LeaveIfError(writer.Replace(iCoeEnv-FsSession(), *iFileName, EFileWrite);writer SetTypeL(FileStore-Layout();TStreamId id = iDb.CreateL(FileStore);Fil

47、eStore-SetRootL(id);FileStore-CommitL();CleanupStack:PopAndDestroy( FileStore );iOpen = ETrue;iDb.Close(); 第29页/共77页第二十九页,共77页。数据库管理数据库管理(gunl) (3)创建表格:)创建表格:通过文件流存储打开数据库:通过文件流存储打开数据库:_LIT( KFileName, C:DataBase.db );CFileStore* FileStore = CPermanentFileStore:OpenLC( iFsSession, KFileName, EFileRea

48、d|EFileWrite);FileStore-SetTypeL(FileStore-Layout();iDb.OpenL( FileStore, FileStore-Root() );添加字段:添加字段:_LIT(KId, Id);_LIT(KText, Text);_LIT(KTableName, Table);TDbCol IdCol( KId, EDbColText );TDbCol TextCol( KText, EDbColText );CDbColSet* ColSet = CDbColSet:NewLC();ColSet-AddL(IdCol);ColSet-AddL(Text

49、Col);创建表格:创建表格:User:LeaveIfError( iDb.CreateTable( KTableName, *ColSet ) ); 释放不使用的内存:释放不使用的内存:CleanupStack:PopAndDestroy(ColSet);CleanupStack:PopAndDestroy( FileStore ); 第30页/共77页第三十页,共77页。数据库管理数据库管理 (4)创建索引:)创建索引:TDbKeyCol IdKey( KId );CDbKey* key=CDbKey:NewLC();key-AddL( IdKey );User:LeaveIfError(

50、 iDb.CreateIndex( KTableName, KTableName, *key);CleanupStack:PopAndDestroy(key);首首 先创建一个索引对象,将其添加到索引集合中,通过调用先创建一个索引对象,将其添加到索引集合中,通过调用RDbStoreDatabase:CreateIndex(const TDesC& aName,const TDesC& aTable,const CDbKey& aKey)创建表格,最后清除创建表格,最后清除(qngch)不使用的内存。不使用的内存。 (5)插入记录:)插入记录:_LIT(KIdText,

51、100001); 首先打开数据库。打开表:首先打开数据库。打开表:RDbTable table;CleanupClosePushL(table);User:LeaveIfError( table.Open(iDb, aTableName, table.EUpdatable ) ); 获取字段集合:获取字段集合:CDbColSet* ColSet = table.ColSetL();CleanupStack:PushL(ColSet);添加记录:添加记录:table.Reset();table.InsertL();table.SetColL( ColSet-ColNo(KId), KIdText

52、 );table.PutL();CleanupStack:PopAndDestroy(2); /清除清除(qngch)内存:内存: 注意:每插入一条记录,就必须调用注意:每插入一条记录,就必须调用table.InsertL(),设置完值后,必须调用,设置完值后,必须调用table.PutL()提交。提交。 第31页/共77页第三十一页,共77页。(6)查询记录:首先打开数据库和表。TPtrC ptrc;for( table.FirstL(); table.AtRow(); table.NextL()table.GetL();ptrc.Set( table.ColDes( colSet-ColN

53、o( KId ) ) );table.FirstL()将焦点设置为第一条记录,table.AtRow()验证下一条记录是否存在,table.NextL()将焦点移动到下一条记录。每查询一条记录,必须(bx)调用table.GetL();使用TPtrC:Set()将查询结果写进描述符。 (7)执行SQL语句:首先打开数据库。TBuf SQL;SQL.Append( _L(/Some SQL) );RDbUpdate DbUpdate;TInt incStat = DbUpdate.Execute(iDb, SQL, EDbCompareNormal);incStat = DbUpdate.Nex

54、t();while( incStat = 1 )incStat = DbUpdate.Next();DbUpdate.Close(); 第32页/共77页第三十二页,共77页。 60系列用户界面显示器规范如下:系列用户界面显示器规范如下: 分辨率:分辨率:176像素像素(宽宽)208像素(高)像素(高)正方形像素正方形像素 物理尺寸:约物理尺寸:约35mm(宽宽),41mm(高高), 对应对应(duyng)约约0.2mm的象素点距。的象素点距。 颜色数(颜色数(4096色或更多)色或更多) 第33页/共77页第三十三页,共77页。 第34页/共77页第三十四页,共77页。显示器按照一定的层次结

55、构进行布局。布局由被称为窗口(显示器按照一定的层次结构进行布局。布局由被称为窗口(windows)和窗格()和窗格(panes)的组件构建。)的组件构建。 屏幕(屏幕(Screen)是最顶层的显示组件,对应于物理屏幕的整个象素区域。)是最顶层的显示组件,对应于物理屏幕的整个象素区域。 窗口(窗口(Window)屏幕(屏幕(screen)是窗口的唯一父组件。一般情况下一个窗口会充满整个屏幕,但有时也存在一些小窗口(临时性的),它们只占据屏幕的一部分,环绕其周围的部分是可见的。)是窗口的唯一父组件。一般情况下一个窗口会充满整个屏幕,但有时也存在一些小窗口(临时性的),它们只占据屏幕的一部分,环绕其

56、周围的部分是可见的。 每个应用程序都在自己的窗口中运行。应用程序也可以调用其它的临时窗口。每个应用程序都在自己的窗口中运行。应用程序也可以调用其它的临时窗口。 窗格(窗格(Pane) 窗格是窗口窗格是窗口(window)的子组件。的子组件。 一个窗口可以包含多个窗格,而每个窗格又可以包含多个子窗格,如此等等。不含有子组件的底层组件被称为元素(一个窗口可以包含多个窗格,而每个窗格又可以包含多个子窗格,如此等等。不含有子组件的底层组件被称为元素(element)。)。 应用窗口应用窗口 应用窗口是覆盖应用窗口是覆盖(fgi)整个屏幕的主窗口。通常它并不直接用于显示,而是作为各种窗格的父组件。整个屏

57、幕的主窗口。通常它并不直接用于显示,而是作为各种窗格的父组件。 一个典型的应用窗口由下几种窗格组成:一个典型的应用窗口由下几种窗格组成: - 状态窗格状态窗格 - 主窗格主窗格 - 控制窗格控制窗格 第35页/共77页第三十五页,共77页。第36页/共77页第三十六页,共77页。Application负责启动(qdng)方面的工作Document负责(fz)永久保持的工作AppUI负责接受并处理用户的命令AppView负责图形显示的工作Model可选:负责处理数据第37页/共77页第三十七页,共77页。第38页/共77页第三十八页,共77页。第39页/共77页第三十九页,共77页。第40页/共

58、77页第四十页,共77页。第41页/共77页第四十一页,共77页。可以作为视图的基类传统的EIKON视图架构containerdialog负责应用程序视图区域(qy)的显示工作一个应用程序的界面分为三部分标题栏软键区域(qy)应用程序视图区域(qy)(右图的黑框部分)使用CGraphicsContext进行画图在UI平台能力范围内工作(如:60系列)系统提供的常用控件有按钮编辑器文本标签列表框可以内嵌其它控件(又称定制控件,或者复合控件)第42页/共77页第四十二页,共77页。n事件n键盘事件n鼠标事件第43页/共77页第四十三页,共77页。nDrawingn用户输入处理第44页/共77页第四

59、十四页,共77页。第45页/共77页第四十五页,共77页。第46页/共77页第四十六页,共77页。任何不是const的函数。n该函数不允许leave,因此你必须用TRAP封装可能leave的函数第47页/共77页第四十七页,共77页。 gc.DrawRect( aRect ); /gc.Clear() 第48页/共77页第四十八页,共77页。第49页/共77页第四十九页,共77页。建议(jiny)在程序中使用CWindowGc提供的接口第50页/共77页第五十页,共77页。一个窗口激活nvoid Activate(RDrawableWindow& aWindow)nvoid Deact

60、ivate()第51页/共77页第五十一页,共77页。第52页/共77页第五十二页,共77页。第53页/共77页第五十三页,共77页。第54页/共77页第五十四页,共77页。第55页/共77页第五十五页,共77页。n不要短时间内多次重绘某个区域n尽量避免大面积的重绘第56页/共77页第五十六页,共77页。第57页/共77页第五十七页,共77页。n控件按优先级被通告事件的发生n控件必须告知系统是否接收了该事件n如果没有任何控件宣称接收一个事件,则最后将由AppUi在它的CMyAppUi:HandleKeyEventL()中处理该事件第58页/共77页第五十八页,共77页。第59页/共77页第五十九页,共77页。第60页/共77页第六十页,共77页。第61页/共77页

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论