• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

SCO UNIX环境下面向对象的程序设计 2

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 19次 | 进入软件测试论坛讨论

领测软件测试网
第二章 基于Object UNIX Class Library的应用程序基础
第一章已经介绍了Object UNIX Class Library类库,接下来便可以开始构造简单的Object UNIX Class Library程序了。在后面几章,将讲述UNIX环境下文本窗口、交互式UNIX程序、包括菜单、对话框和一个简单的帮助系统。与此同时,将讲述基于Object UNIX Class Library的UNIX交互式程序设计的一些主要原理,如消息处理等。

从第二章到第六章将分下述步骤讲述Object UNIX Class Library的编程方法:

l     主窗口类

l     在窗口中显示文本

l     主窗口中的菜单

l     增加对话框

l     帮助系统

如果未改变缺省的安装目录,您将可以在/lfr_ide/sample子目录下找到源代码。文件名分别为:main.cpp、user.cpp等等。

2.1 编制一个Object UNIX Class Library应用程序:预备知识
在开始编制Object UNIX Class Library应用程序之前,必须做好这样几件事情:第一、须规定正确的包含目录以使编译器能找到所有相关的文件;第二、须规定正确的库目录,以使连接器能找到应用程序所需要的库文件。

2.1.1 类库
Object UNIX Class Library依赖于lib子目录中的类库。所有Object UNIX Class Library的对象均以Object作为她们的基类。Object UNIX Class Library还可以用到类库中的其它类如TWindow类或者Tdialog类。读者可以在Object UNIX Class Library程序中随意使用各个类。

 

2.1.2 目录
除了应用程序可能用到的标准头文件(如stdio.h和curses.h等)之外,还需要告诉各种编译器工具,Object UNIX Class Library的头文件(如owl.hpp)存在何处。在编写Object UNIX Class Library程序时,必须包含owh.hpp文件。

所有的应用程序均须访问运行时间库,另外还有自己建立的库或者从别处购买的库。除此之外,一个Object UNIX Class Library应用程序还需要访问标准的Object UNIX Class Library类库。

下面列出安装程序所使用的缺省目录。如果告知了安装程序使用不同的目录,则需要修改所提供的make文件或者工程文件以适应实际的目录设置,在本系统提供的集成编译环境下,您可以通过选项菜单项来修改目录设置。

在UNIX环境的的目录结构下,Object UNIX Class Library存放在本系统安装后的系统目录下:/lfr_ide。

该目录下有几个子目录:./bin、./doc、./lib、./include。

./lib目录下存放着Object UNIX Class Library的系统类库libowl.a,通过链接本系统于用户的应用程序中,用户的应用程序将具有本系统提供的一系列交互式屏幕特征。

./bin目录下存放着集成编译系统程序以及一些UNIX下使用的工具如:dir、sdir、mdir、psvi等。

./include目录下存放着使用本Object UNIX Class Library类库系统的一些必要的头文件信息。

./doc目录下存放着C/C++集成编译系统以及Object UNIX Class Library的操作使用说明文档。

在用户编译他的应用程序时,请在make文件中指定包含头文件所在的目录:-I/lfr_ide/include以及库所在目录-L/lfr_ide/lib。

您还应该指定make的参数:-lowl。

 

2.2 建立Object UNIX Class Library应用程序
有两种建立Object UNIX Class Library应用程序的方法,第一种是利用本系统提供的集成编辑编译环境的项目管理程序IDE,第二种方法是使用UNIX系统提供的VI和make文件工具与命令行工具CC。

2.2.1 使用IDE建立Object UNIX Class Library应用程序
使用集成开发环境IDE建立Object UNIX Class Library应用程序时,需要使用工程项目文件。关于使用工程项目文件的详细步骤,请参阅IDE的使用说明。建立Object UNIX Class Library应用程序工程项目文件的一般步骤如下:

l     创建工程文件

    指定工程文件名,工程项目文件存放目录,工程执行文件名,选择是否连接Oracle数据库,将应用程序的源文件(带.cpp等扩展名)加到项目文件中。

l     打开工程文件

l     指定包含目录或库目录(参阅上节说明)

2.2.2 使用UNIX系统提供的make或者CC命令行工具
如果使用UNIX系统提供的make或者CC命令行工具编译和连接Object UNIX Class Library应用程序,用编辑配置文件的方式建立make文件来指定包含目录或库目录可能是最简单的方法。在make文件中,可以用-l和-L指示相应的目录.

可以使用类似如下所示的命令行来编译和连接应用程序:

CC –o test main.cpp –I/lfr_ide/include –L/lfr_ide/lib –lowl –ltinfo

该命令行首先编译main.cpp文件,然后再将它与libowl.a相连接。

 

2.3 第一步:一个简单的基于UNIX系统的交互式应用程序
Object UNIX Class Library应用程序开发可以从编写框架开始。与此相应的范例是/lfr_ide/sample/main.cpp。main.cpp的首要任务是生成应用程序主窗口。

2.3.1 应用程序要求
所有的基于Object UNIX Class Library系统的交互式应用程序都必须有一个主窗口。当程序启动时,主窗口便会出现。用户通过关闭主窗口的退出系统菜单而退出应用程序的。在Object UNIX Class Library应用程序中,主窗口通常是一个窗口对象(Windows Object)。这个对象是从属于应用程序对象(Application Object)的。应用程序对象生成并显示主窗口,处理用户键盘消息以及终止应用程序的执行。应用程序对象是应用程序的面向对象代理。Object UNIX Class Library以相同的方式提供了窗口、对话框和其它类,这些类隐藏了UNIX应用程序的编程细节。

每个Object UNIX Class Library程序都必须定义一个新的应用程序类,新的应用程序类必须是所提供的Tapplication类的派生类。在main(UNIX程序的入口点)中,构造这个派生类的事例(应用程序对象)。按造惯例,通常类型(类及类的事例)标识以字母T打头。在范例程序中,这个类称为TlfrApp。

此处的是范例程序的主函数:

int main(void)

{

    InitScreen();//初始化curses库

    TlfrApp LfrApp(“Sample Object UNIX Class Program”);

    LfrApp.Run();

    FreeScreen();//释放分配的curses库空间

}

在第二个语句中,main构造了范例程序的“应用程序对象”。字符串“Sample Object UNIX Class Program”给传递给构造函数,进而被赋值给数据成员AppName。它们最终是作为应用程序对象的数据成员存放。然后调用TlfrApp.Run来启动Object UNIX Class Library应用程序的执行。

 

l     定义应用程序类

应用程序必须从标准的Object UNIX Class Library类Tapplication(或者Tapplication派生的某个类)派生出新的类。这个新类至少应该重定义一个虚拟成员函数InitMainWindow。InitMainWindow在Object UNIX Class Library应用程序初始化期间构造一个主窗口对象。此处是类Tapplication的定义:

class TLfrApplication : public TApplication {

public:

    TlfrApplication(char *AppName)();

    Virtual void InitMainWindows(void);

};

这个主窗口对象存放在应用程序对象的MainWindow数据成员之中。应用程序对象拥有主窗口对象,但两者在层次上并不相关。这种拥属关系被称为事件链(instance linkage)。TlfrApp::InitMainWindow的定义如下所列:

void TlfrApp::InitMainWindow(void)

{

    MainWindow=new TWindow("Sample Object UNIX Class Program",

                          1,0,78,25,WHITE_BLUE,BLUE_BLUE);

}

TlfrApp的主窗口对象是作为TWindow的一个事例而构造的(如上所似)。其中第一个参数是窗口的标题,它是应用程序主窗口对象的Caption的数据成员,已被置为“Sample Object UNIX Class Program”。这样,主窗口对象将作为Object UNIX Class Library的派生类的一个事例。

下面给出第一个范例程序的完整列表:

#include “owl.hpp”

class TLfrApplication : public TApplication {

public:

    TlfrApplication(char *AppName)();

    Virtual void InitMainWindows(void);

};

int main(void)

{

    InitScreen();//初始化curses库

    TlfrApp LfrApp(“Sample Object UNIX Class Program”);

    LfrApp.Run();

    FreeScreen();//释放分配的curses库空间

    Return 0;

}

2.4 第二步:主窗口类
第一个程序有两个对象组成:应用程序对象和窗口对象。应用程序对象LfrApp是TlfrApp类的一个实例,它是从类Tapplication派生而来的。保存在MainWindows之中的窗口对象指针指向TWindows的一个实例,这是一个一般性的Object UNIX Class Library窗口。可以按正常方式为主窗口定义自己的窗口类。包括组合进去应用程序特有的操作,此处,通过定义一个特殊的窗口类(从Twindow类派生的)而使主窗口产生活力。

2.4.1 何谓主窗口
在第一个步骤中,读者可以看到应用程序对象封装了基于UNIX文本环境下curses库的交互式应用程序的标准操作,包括构造主窗口。类Tapplication为Object UNIX Class Library的应用程序提供了基本的操作。类似地,窗口对象也封装了窗口的必要操作,包括:

l     窗口自身的显示

l     支持菜单操作

l     事件响应

    Object UNIX Class Library窗口类提供了这些操作。

为使程序有趣且有用,必须依据Object UNIX Class Library类生成新的窗口类。新的类不仅可以继承父类的成员函数和数据成员,而且还能增添其自己的成员函数和数据成员。总之,面向对象方法避免了从头构造窗口的必要性。

2.4.2 生成主窗口对象
既然已经有了主窗口对象构成的概念,边可以定义新的主窗口。新的窗口类是有Twindow派生的,将用于构造应用程序的主窗口。首先,说明新类的TlfrWindow:

class TlfrWindow:public Twindow {

public:

    TLfrWindow(char *caption,int left,int top,int width,

    int height,int ftcolor,int bkcolor) : 

    TWindow(caption,left,top,width,height,ftcolor,bkcolor){}

};  

注意,新的派生类的构造函数不定义新的行为,而只是调用基类(TWindow)的构造函数。

其次,更改TlfrApp::InitMainWindow使其构造一个TlfrWindow对象,而不是Twindow对象。

Void TlfrApp::InitMainWindow(void)

{

        MainWindow = new TlfrWindow("Sample Object UNIX Class

                    Program",1,0,78,25,WHITE_BLUE,BLUE_BLUE);

}

说明新类和在InitMainWindow成员函数中对其作初始化是为主窗口的新类需要,应用程序对象调用窗口对象的成员函数生成窗口界面元素并将探们显示在屏幕上。

然而,TLfrWindow除了从TWindow和TObject继承属性之外,并没有定义新的饿属性。换句话说,并没有给应用程序增添新的内容。下一节,将增加某些新的属性。

2.4.3 响应事件
使一个窗口对象生效的最快捷的方法是教它如何响应消息。由于在UNIX环境下的curses很少采用鼠标操作,所以本系统采用对键盘操作事件的捕获来响应用户的击键事件。

在主窗口中,最常用的是对主窗口菜单事件的处理。为了解释和响应菜单选择事件,必须在主窗口类中为每个菜单项定义一个类成员函数,这些成员函数统称为消息响应函数。当用户在选择某个菜单项的时候,通过对消息响应函数的内部判别来执行用户的按键选择事件。

此处的详细说明,请参阅下一章的增加菜单。

2.4.4 终止应用程序
当用户选择主窗口的退出系统菜单项时,程序便被关闭。这包括关闭窗口显示和终止程序执行。这种关闭操作似乎没有什么问题,但对于其它情形,恐怕则不然。

例如,在退出应用程序时是否保存自己的工作?一个好的应用程序在用户工作未被保存时,总要询问用户是否要包寻结果。可以很容易地增加这种属性到Object UNIX Class Library应用程序中。可以在示范程序中增加双重检查用户退出请求的功能。

当用户试图关闭Object UNIX Class Library应用程序时,应用程序的虚拟成员函数CanClose被调用。CanClose是一个BOOL函数,它判断是否关闭应用程序。在缺省情况下,调用主窗口对象的类成员函数CanClose来决定是否能够关闭应用程序的。

主窗口类TlfrWindow从TWindow继承CanClose成员函数调用,如果用户需要修改一个程序的关闭行为,将需要重定义主窗口类的CanClose成员函数。

Int TLfrWindow::CanClose(void)

{

return MsgDialog(“退出系统”, “确认退出系统吗?”);

}

此处,当用户试图关闭示范应用程序时,就会显示一个消息框,询问“确认退出系统吗?”当用户按下回车键,则退出应用程序,按下ESC键,则阻止应用程序的关闭。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网