Java JDBC编程总结

时间:2019-05-15 10:03:38下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《Java JDBC编程总结》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《Java JDBC编程总结》。

第一篇:Java JDBC编程总结

Java JDBC编程总结

Hibernate、TopLink等OR Mapping操作数据库的技术都是建立JDBC技术之上的,实际来说,他们的性能和JDBC是有很大差距的,但反过来说,如果JDBC用不好,还不如hibernate呢。暂且不说这些孰优孰劣的话了,再次主要是对Java的基础技术做个总结,以加深认识。

一、JDBC的基本原理

JDBC是Java操作数据库的技术规范。他实际上定义了一组标准的操作数据库的接口。为了能让Java操作数据库,必须要有实现了JDBC这些接口的类,不同的数据库厂商为了让Java语言能操作自己的数据库,都提供了对JDBC接口的实现--这些实现了JDBC接口的类打成一个jar包,就是我们平时看到的数据库驱动。由于不同的数据库操作数据的机制不一样,因此JDBC的具体实现也就千差万别,但是你作为java程序员,你只和Java JDBC的接口打交到,才不用理会他们怎么实现的!呵呵,现在知道JDBC驱动是怎么回事了。当然,这些类可

以自己去写--如果你很牛!

二、JDBC编程的步骤

为了说明这个步骤,假设你要通过java程序执行一个sql查询,你需要按照如下的步骤去走:

1、创建指定数据库的URL 这个URL实际上还是统一资源定位器,里面包含了一些连接数据库的信息:数据库类型、端口、驱动类型、连接方式、数据库服务器的ip(或名字)、数据库名(有的是别名)等。其格

式如下:

jdbc:subProtocol:subName://DBserverIP:port/DatabaseName 例如mysql的一个url:jdbc:mysql://192.168.3.143:3306/zfvims

2、加载驱动类到JVM内存区域中

有两种方法:

一种是用Class.forName()方法加载指定的驱动程序。

一种是将驱动程序添加到java.lang.System的属性jdbc.drivers中。

最后说明一点,有时候添加到系统的CLASSPATH环境变量是不行的,原因是在使用JDBC接口

操作数据库前,JVM还没有加载上驱动。Class.forName(“com.mysql.jdbc.Driver”)

3、、通过DriverManager类管理驱动、创建数据库连接。

DriverManager类作用于程序员和JDBC驱动程序之间,提供注册管理驱动建立连接细节等方法,它所有成员均为静态的。通过其getConnection方法会创建一个JDBC Connection对象。

Connection conn=DriverManager.registerDriver(“jdbc:mysql://192.168.3.143:3306/zfvims”,“lava

soft”,“password”);

4、Connection类--数据库连接

这里所说的Connection类实际上是实现了JDBC的Connection接口的类,这个类一般都是jdbc驱动程序实现了。Connection类表示了数据库连接,通过其对象可以获取一个获取数据库和表等数据库对象的详细信息。但更多的是通过这个连接更进一步去向数据库发送SQL语

句去执行,下面会讲到。

数据库的连接的建立是很耗费资源和时间的,因此在不用连接的情况下要通过其close()方

法将连接关闭,以释放系统资源。

5、Statement类--发送并执行(静态)SQL语句

通过Connection对象的createStatement()方法可以创建一个Statement对象,通过该对象的方法可以(发送)并执行一个静态sql语句。如果要执行动态的sql(sql串中有参数),那么就用PreparedStatement类,用法和Statement类似。

Statement stmt=con.createStatement()

6、ResultSet类--结果集

当你执行一条sql查询后,就会产生一个查询结果。ResultSet就表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。ResultSet 对象具有指向其当前数据行的指针。通过ResultSet对象不但可以结果集数据,还可以获取结果集表的列名、数据类型等信息。

ResultSet rs=stmt.executeQuery(sql)

7、关闭数据库连接

当对sql操作完成后,应该关闭数据库连接,这样避免因为连接未关闭而耗费系统资源,如果每次都不关闭,多次操作将建立多个连接,最终数据库连接会达到最大限度,或者耗尽系统的资源,从而导致应用崩溃。因此要注意关闭资源,尤其是数据库连接。

三、JDBC编程最基本的实例

下面通过一个执行一条简单的MySQL查询来说名上面的JDBC编程的一般方法和步骤。

public

class TestJDBC(){

1.public

static Connection getConnectionByJDBC(){ Connection conn =

null;2.try { //装载驱动类

3.Class.forName(“com.mysql.jdbc.Driver”);} catch

(ClassNotFoundException e){ 4.System.out.println(“装载驱动异

常!”);e.printStackTrace();

5.}

try { 6.//建立JDBC连接

conn = DriverManager.getConnection(“"jdbc:mysql://192.168.3.143:3306/zfvims

”,“lavasoft”,“password”);

7.} catch(SQLException e){ System.out.println(“

链接数据库异常!”);8.e.printStackTrace();}

9.return conn;}

10.public

static String test(){ 11.String sqlx = “select t.code,t.name from province t order by

t.code asc”;

try { 12.//创建一个JDBC声明

Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

13.//执行查询

ResultSet = stmt.executeQuery(sqlx);

14.while(rs.next()){ String code =

rs.getString(“code”);

15.String name = rs.getString(“name”);System.out.println(code+name)

;16.} } catch(SQLException e){ 17.System.out.println(e.getMessage());e.print

StackTrace();

18.} finally { //预防性关闭连接(避免异常发生时在try语句块关闭连接没有执行)

19.try {

if(conn!= null)conn.close();20.} catch(SQLException e){ System.out.println(e.getMessage());21.e.printStackTrace();}

22.} }

23.public static

void main(String args[]){ new TestJDBC().test();

24.}

25.}

四、JDBC编程的陷阱

1、conn一定要在finally语句块进行关闭。

2、Statement、ResultSet尽可能缩小其变量作用域。

3、Statement可以使用多次,定义多个。一个Statement对象只和一个ResultSet对象关联,并且是最后一次查询。

4、ResultSet在Connection、ResultSet关闭后自动关闭。

还有很多需要写的,以后再慢慢总结。

第二篇:编程题总结

大家必须掌握每种类型的1-3题。

题号考点要求

48、将两个两位数的整数合并成一个整数

65、两个正整数合并成一个整数

71、两个正整数合并成一个整数

77、两个正整数合并成一个整数

81、两个正整数合并成一个整数

84、两个正整数合并成一个整数

87、两个正整数合并成一个整数

91、两个正整数合并成一个整数

8、s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+.....+n)

9、p=m!/(n!*(m-n)!)

26、连加

68、s=1+1/1!+1/2!+1/3!+........70、s=1/(1*2)+1/(2*3)+...+1/(n*(n+1))

76、s=1+0.5*x+(0.5*(0.5-1)*x*x/2!+......86、连加

90、连加

92、连加

93、连加

97、连加

100、连加

(2、)

类似素数或者闰年算法

2、求出1到1000之间能被7或11整除、但不能同时被7和11整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数。

58、求n以内同时能被3与7整除的所有自然数之和的平方根s3、求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。

27、求出1到m之间能被7或11整除的整数,放在数组中,通过n返回这些数的个数

63、求n的所有因子(不包括1与自身)

98、计算n以内能被5或9整除的所有自然数的倒数之和

15、w是大于10的无符号整数,若w是n(n>=2)位的整数,则函数求出w的后n-1位的数作为函数值返回。

24、将数字字符串转化为一个整数

16、对变量中的值保留两位小数,对第三位四舍五入

(3、)

1、一维数组中,将低于平均分的人数作为函数值返回,低于平均分的分数放在below所指的数组中。

82、计算一维数组中n门课程的平均分

96、一维数组中每相邻元素之平均值的平方根之和

28、找出一维数组中最大的值和它所在的下标,两者通过形参返回

7、求出数组的最大元素在数组中下标并存放在k所指的存贮单元中。

43、从num个字符串中找出最长的一个字符串,并通过形参指针传回

39、移动数组中的内容,前p个数移动到数组后面

40、移动数组中的内容,前m个字符移动到后面

5、将大于整数m且紧靠m的k个素数存入xx所指的数组中。

20、求出小于变量m的所有素数并放在一个数组中

51、将大于1小于m的非素数存入xx所指数组中,个数通过形参返回

99、计算3到n之间所有素数的平方根之和

29、将字符串中下标为奇数位置上的字母转化为大写

47、字符串中所有下标为奇数的字母转为大写

31、将字符串中除了下标为偶数、同时ASCII码也为偶数的字符外,其余的全都删除;串中剩余字符放在t字符串中

32、除了下标为奇数、同时ASCII码也为奇数的字符外,其余的全都删除;串中剩余字符放在t字符串中

49、将字符串中下标为偶数且ASCII码为奇数的字符删除

19、从字符串中删除指定字符

64、将字符串中ASCII值为奇数的字符删除,剩余字符放在t所指字符串中

72、将字符串中下标为偶数的字符删除

78、字符串中ASCII为偶数的字符删除

35、删除字符串中所有空格

6、删除一个字符串中指定下标的字符。

60、删去一维有序数组中所有相同的数,使之只剩一个

33、删除字符串中尾部*号,使不超过n个

36、把字符串中的前导*号全部移到字符串尾部

45、删除字符串中前导和尾部的*号

56、字符串中,除了尾部*号外,字符串中其余*号全部删除

73、删除字符串中除了前导和尾部*号外的所有*号

83、字符串中尾部*号删除

88、字符串中除了前导*外,删除其余*号

94、字符串中,前导*号全部删除

95、字符串中前导*号不得多于n个

66、删除字符串中所有*号

(4、)

17、字符串内容逆置

23、判断字符串是否为回文

25、比较两个字符串的长度(不能用strlen)

52、实现两个字符串连接

59、将字符串数组中的字符串依次合并到一个字符串中

21、字符串中字符按降序排列(选择法排序)

4、统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。

38、求出字符串中指定字符的个数

44、统计长度为2的字符串在另一个字符串出现的次数

62、统计一行字符串中单词个数

11、二维数组构成矩阵,使数组左下半三角元素中的值全部置成042、二维数组,将右上半角元素中的值乘以m80、二维数组中左下半三角中元素中的值乘以312、求出数组周边元素的平均值

14、求出二维数组周边元素之和

18、矩阵行列互换

53、矩阵B=A+A130、求出二维数组中最大元素的值,此值返回给调用函数

55、M行N列的二维数组中的数据,按行的顺序依次放到一维数组中

41、将二维数组中的字符,按列的顺序依次放到一个字符串中

75、二维数组中数按列的顺序放到一维数组中

13、求出二维数组每列中最小元素,并依次放在pp所指一维数组中

37、结构体数组(学号、8门成绩、平均成绩),求出每个学生的平均成绩

34、把结构体数组(学号、成绩)中分数最高的学生放到h数组中,函数返回人数

74、把结构体数组(学号、成绩)中分数最低的学生数据放在h所指数组中

50、结构体数组(学号、成绩),找出成绩最高的学生记录,通过形参返回

54、结构体数组(学号、成绩),低于平均分的学生数据放在b所指数组中

89、结构体数组(学号、成绩),高于等于平均分的学生人数通过形参返回

57、结构体数组(学号、姓名),把指定范围内的学生数据放在所指数组中

67、结构体数组(学号、成绩)返回指定学号的学生数据(查找)

46、结构体数组(学号、成绩),按分数降序排列(选择法排序)

22、链表结构中,找出数值最大的结点,并由函数值返回

85、链表中,求出平均成绩

10、迭代法求方程的实根

61、统计各年龄段人数(建议采用if else)

69、递归函数

第三篇:plc编程学习总结

1:PLC编程语言有5种,即顺序功能图(SFC),梯形图(STL),功能块图,指令表,和结构文本。其中顺序功能图(SFC)是最容易理解的,按照时间的先后顺序执行。然后转换成梯形图,因为梯形图是PLC普遍采用的编程语言。不过SFC转换梯形图是很简单的。

2:就好比是开关在合上时两触点接触的一瞬间继电器就有动作了,这叫上升沿。

下降沿就好比开关两触点始终保持接触时,继电器没有动作,只有开关两点断开时的瞬间继电器才动作。

第四篇:一点Duilib编程总结

一点Duilib编程总结

1.duilib简介

duilib是一个开源的DirectUI界面库,简洁但是功能强大。而且还是BSD的license,所以即便是在商业上,大家也可以安心使用。

现在大家可以从这个网站获取到他们所有的源码:/p/duilib/ 为了让我们能更简单的了解其机制,我们按照如下顺序一步一步的来对他进行观察:

工具库:用于支撑整个项目的基础

控件库:这是dui最关键的部分之一,相信也是大家最关注的部分之一,另外这里也来看看它是如何管理这些控件的

消息流转:有了控件库,我们需要将Windows窗口的原生消息流转给这些控件,另外在这里也来看看Focus,Capture等等的实现

资源组织和皮肤加载:有了上面所有的这些,我们再来看看它是如何自动创建皮肤的

简单使用:最后,来看看到底要如何使用它

以下是duilib工程带的一副总体设计图,在看代码之前看看这幅图,对看代码会很有帮助。

duilib: 2.工具库

由于duilib没有对外部的任何库进行依赖,所以在其内部实现了很多用于支撑项目的基础类,这些类分布在Util文件夹中:

UI相关:CPoint/CSize/CDuiRect 简单容器:CStdPtrArray/CStdValArray/CStdString/CStdStringPtrMap 上面这些类看名字就基本能够理解其具体的含义了,当然除了基本的基础库,还有一些和窗口使用相关的工具的封装:

窗口工具:WindowImplBase,这个工具我们在这里不详述,后面会再次提到。3.控件库

控件库在duilib的实现中被分为了两块:Core和Control:

Core中包含的是所有控件公用的部分,里面主要是一些基类和绘制的封装。Control中包含的就是各个不同的控件的行为了。Core部分和控件相关的类图非常简单: duilib-core: 3.1.控件基类:CControlUI CControlUI在整个控件体系中非常重要,它是所有控件的基类,也是组成控件树的基本元素,控件树中所有的节点都是一个CControlUI。

他基本包括了所有控件公共的属性,如:位置,大小,颜色,是否有焦点,是否被启用,等等等等。当然这个类中还提供了非常多的基础函数,用于重载来实现子控件,如获取控件名称和ClassName,是否显示,等等等等。

另外为了方便从XML中直接解析出控件的各个属性,这个类中还在提供了一个SetAttribute的方法,传入字符串的属性名称和值对特定的属性进行设置,内部其实就是挨个比较字符串去完成的,所以平时使用的时候就还是不要使用的比较好了,因为每个属性实际上都有特定的方法来获取和设置。

另外每个控件中还有几个事件管理的对象——CEventSource,这些对象会在特定的时机被触发,如OnInit,调用其中保存的各个回调函数。3.1.1.控件类型转换

这里我们就碰到一个问题,控件树中的每一个节点都是CControlUI,但是其实这些节点可能是文字,可能是图像,也有可能是列表,那么他怎么在这些控件指针之间进行转换呢?

强制转型不是一个好的选择,duilib中使用的是CControlUI::GetInterface,传入一个字符串,传出指向控件的指针。类似于COM的QueryInterface。

LPVOIDCControlUI::GetInterface(LPCTSTRpstrName){ if(_tcscmp(pstrName,_T(“Control”))==0)returnthis;returnNULL;} 3.2.容器基类:CContainerUI 有了基本的控件基类之后,我们就需要容器来将他管理起来,这个容器就是CContainerUI,其内部用一个数组来保存所有的CControlUI的对象,后续的所有工作,就都是基于这个对象来进行的了。

这样在CContainerUI里面,主要实现了一下几个功能: 子控件的查找:CContainerUI::FindControl 子控件的生命周期管理:是否销毁(在Remove的时候自动销毁)/是否延迟销毁(交给CPaintMangerUI去一起销毁)。

滚动条:所有的容器都支持滚动条,在其内部会对键盘和鼠标滚轮事件进行处理(CContainerUI::DoEvent),对其内部所有的元素调整位置,最后在绘制的时候实现滚动的效果

绘制:由于容器中有很多元素,所以为了加快容器的绘制,绘制的时候会获取其真正需要绘制的区域,如果子控件不在此区域中,那么就不予绘制了

3.3.控件实现

有了普通的基类和容器的基类之后,我们就可以在其之上搭建控件了。其类图大致如下:

duilib-control: 3.3.1.基本控件

duilib实现了非常多的基本控件,他们分布在Control文件夹下,每一个头文件就是一个控件,主要有:

CLabelUI/CTextUI/CEditUI/CRichEditUI CButtonUI/CCheckBoxUI/COptionUI(RadioButton)CScrollBarUI/CProgressUI/CSliderUI CListUI CDateTimeUI/CActiveXUI/CWebBrowserUI 3.3.2.Layout 除了基本控件之外,duilib为了辅助大家对界面元素进行布局,还在中间实现了专门用于Layout的元素:

CChildLayoutUI CHorizontalLayoutUI/CVerticalLayoutUI/CTileLayoutUI:纵向排列,横向排列格子排列

CTabLayoutUI:Tab 3.3.3.控件绘制

绘制控件实际上有很多代码都是可以抽取出来的,比如:九宫格拉伸图片,平铺图片等等工作,我们实际上都不需要每次都去重写。所以这部分代码被抽取出来,形成了CRenderEngine,这个类在Core/UIRender下。在这个里面,我们可以看到很多的用于绘制方法。

classUILIB_APICRenderEngine { public: //......staticvoidDrawLine(HDChDC,constRECT&rc,intnSize,DWORDdwPenColor);staticvoidDrawRect(HDChDC,constRECT&rc,intnSize,DWORDdwPenColor);staticvoidDrawRoundRect(HDChDC,constRECT&rc,intwidth,intheight,intnSize,DWORDdwPenColor);staticvoidDrawText(HDChDC,CPaintManagerUI*pManager,RECT&rc,LPCTSTRpstrText, DWORDdwTextColor,intiFont,UINTuStyle);staticvoidDrawHtmlText(HDChDC,CPaintManagerUI*pManager,RECT&rc,LPCTSTRpstrText, DWORDdwTextColor,RECT*pLinks,CDuiString*sLinks,int&nLinkRects,UINTuStyle);//......};3.4.控件管理:CPaintManagerUI 当所有这些基本的控件都准备好了之后,我们就只要将这些控件管理起来,这样一个基本的控件库就完成了,而这个管理就是CPaintManagerUI来负责的。

在duilib中,一个Windows的原生窗口和一个CPaintManagerUI一一对应。其主要负责如下几个内容,后面会分开来细说,现在先了解一个概念就行:

控件管理 资源管理

转化并分发Windows原生的窗口消息 为了实现上面这些功能,其中有几个用于管理控件和资源的关键的数据结构: m_pRoot:保存根控件的节点

m_mNameHash:保存控件名称Hash和控件对象指针的关系

m_mOptionGroup:保存控件相关的Group,这个Group并不是TabOrder,他用于实现Option控件

m_aCustomFonts:用来管理字体资源 m_mImageHash:用来管理图片资源

这些结构基本都可以看作是一堆列表和Map,这样可以用其来实现控件和资源的管理了。

4.消息流转 有了控件,现在我们的问题是,如何将原生的窗口消息分发给界面中所有的控件,使其行为和原生的一样呢?

4.1.窗口基础类:CWindowWnd 在duilib中,用来表示窗口的最基础的类是CWindowWnd,在这个类中实现了如下基本的内容:

原生窗口的创建(CWindowWnd::Create)Subclass(CWindowWnd::Subclass)

最基本的消息处理函数(CWindowWnd::__WndProc)和消息分发(CWindowWnd::HandleMessage)

模态窗口(CWindowWnd::ShowModal)

duilib通过这个类,将原生窗口的消息分发给其派生类,最后传给整个控件体系。另外在duilib中,需要进行消息处理的基本控件,都是从这个类继承出来的。

4.2.消息分发

一旦我们使用CWindowWnd类创建了窗口之后,消息就会通过CWindowWnd::HandleMessage进行分发,我们可以和WTL等其他的库一样,在此对原始的窗口消息进行处理。

LRESULTCWindowWnd::HandleMessage(UINTuMsg,WPARAMwParam,LPARAMlParam){ return�0�2::CallWindowProc(m_OldWndProc,m_hWnd,uMsg,wParam,lParam);} 当然如果我们觉得这样麻烦,我们也可以使用CPaintManagerUI来对其进行默认处理。我们上面提到CPaintManagerUI还会对所有的控件进行管理,这样,消息就传递给了窗口内部特定的控件了。

这些默认处理集中在CPaintManagerUI::MessageHandler()中,其内部会对很多窗口消息进行处理,并将其分发到对应的控件上去,比如对WM_LBUTTONDOWN的处理。

caseWM_LBUTTONDOWN: { //......POINTpt={GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)};m_ptLastMousePos=pt;CControlUI*pControl=FindControl(pt);//......TEventUIevent={0};event.Type=UIEVENT_BUTTONDOWN;//......pControl->Event(event);} break;4.2.1.Focus&Capture 通过上面这个最简单的例子,我们基本可以猜到duilib对Focus和Capture的处理方法了:用一个成员变量保存对应的控件,在消息到达时直接转发消息。

在CPaintMainagerUI中,大家可以找到一个成员变量:m_pFocus,这个就是用来保存焦点控件的。在WM_KEYDOWN等键盘消息发生时,duilib就会模拟Windows行为,将消息直接转给当前Focus的控件。caseWM_KEYDOWN: { if(m_pFocus==NULL)break;TEventUIevent={0};event.Type=UIEVENT_KEYDOWN;//...m_pFocus->Event(event);//...} break;但是很奇怪的是,duilib里面并没有对Capture做处理,分发鼠标消息到对应的子控件上,可能是还没有完善的原因。

4.2.2.其他消息分发方式 除了Event以外,CPaintManagerUI还提供了其他几种用于处理消息的方法: Notifier:在窗口上处理一些控件的逻辑,可以将其看成和WM_NOTIFY差不多的功能

PreMessageFilter:消息预处理,这个大家肯定不陌生了。PostPaint:绘制后的回调

TranslateAccelerator:快捷键的处理

这里需要注意的是:PreMessageFilter和TranslateAccelerator是通过全局数组来实现的,这并不符合多线程的窗口编程要求,所以duilib对多线程的支持并不是很好!

4.3.WindowImplBase 为了简化duilib的使用,库中提供了一个非常方便的工具:WindowImplBase。这个类将常用的功能封装在其内部,比如Notifier和PreMessageFilter,并在其中提供了各种默认的虚回调函数,供派生类重载。通过这个类,我们可以非常方便的来实现一个简单的界面。

classUILIB_APIWindowImplBase :publicCWindowWnd ,publicCNotifyPump ,publicINotifyUI ,publicIMessageFilterUI ,publicIDialogBuilderCallback { //......virtualUINTGetClassStyle()const;//......virtualLRESULTOnClose(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&bHandled);virtualLRESULTOnDestroy(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&bHandled);//......5.资源组织和皮肤加载

好了,现在我们已经有了控件管理和控件库,现在我们需要让UI框架来帮忙组织这些资源,并且自动的来帮我们创建皮肤,减少我们的开发量。

duilib中的皮肤文件主要有几个部分组成: xml描述文件:描述窗口中控件的布局和样式 各种资源如图片

我们把这些资源放在一个文件夹中,这样就形成了基础的皮肤包。当然我们还可以将其组合成一个zip包,从而加快IO访问,但是修改起来就会相对麻烦。所以我们可以在debug中使用前者,而在release中使用后者。

我们可以在binskin下面找到duilib中自带demo的所有的皮肤包。皮肤中,最关键的部分就是这个xml描述文件了,一个xml描述文件对应着一个窗口的信息,如:控件的类型和样式等等。为了有一个直观的印象,我截取了duilib中ListDemo的xml描述文件的一部分放在这里:

......

... 为了通过配置文件自动创建皮肤,duilib提供了一个类:CDialogBuilder(DuiLibCoreUIDlgBuilder.h)。

这个类提供了从皮肤包(文件夹和zip格式)中的xml中创建皮肤的方法:CDialogBuilder::Create。内部实际上就是一个xml的解析,依次创建各式控件。除了创建控件,这个类还将一些可以复用的资源提取出来放入CPaintManagerUI中统一管理,如字体和图片等等。

6.简单使用

由于项目里面实在是带了太多太多的demo,而且在duilib的工程中,还有一个doc的目录,里面也非常详细的描述了要如何使用duilib来创建一个简单的工程。

所以关于duilib的简单使用,这里就不再详述了,这里就只列出GameDemo的main函数,这个函数非常的简单,但是已经基本可以表达了。

intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCE/*hPrevInstance*/,LPSTR/*lpCmdLine*/,intnCmdShow){ CPaintManagerUI::SetInstance(hInstance);CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()+_T(“skin”));CPaintManagerUI::SetResourceZip(_T(“GameRes.zip”));HRESULTHr=�0�2::CoInitialize(NULL);if(FAILED(Hr))return0;CGameFrameWnd*pFrame=newCGameFrameWnd();if(pFrame==NULL)return0;pFrame->Create(NULL,_T(""),UI_WNDSTYLE_FRAME,0L,0,0,1024,738);pFrame->CenterWindow();�0�2::ShowWindow(*pFrame,SW_SHOWMAXIMIZED);CPaintManagerUI::MessageLoop();�0�2::CoUninitialize();return0;} 7.总结

总的来说,duilib还是一个很小巧好用的皮肤引擎的,但是他仍然有其不好的地方:对多线程的支持不好,不支持动画。但是无论如何,它还是不错的,所以如果你已经看到了这里,那么接下来跑到vs里面建一个工程,玩一把才是正经事~

第五篇:描述性编程总结(范文)

一、描述性编程

1、QTP的运行原理

封装被测对象(TO)到对象仓库

对比对象仓库里的对象属性(TO)和运行时的真实被测对象的属性(RO)对比一致后,找得到相应的对象(RO),按照脚本驱动对象

2、RO & TO

TO:Test object 仓库对象

Ro:Runtime object 运行时对象

TO包含RO

Cancel button

text:TO:Cancel|取消

text:RO:Cancelor取消

3、GetTOProperty获取TO的属性值

属性值=GetTOProperty(“属性名”)

4、GetROProperty 获得RO的属性值

属性值=GetROProperty(“属性名”)

5、GetTOProperties 返回值是对象的集合(Set)

Set pops=GetTOProperties

For i=0 to pops.count-1

Pops(i).name获得属性名

Pops(i).value获得属性值

Next

.Count获得组合的总数

6、SetToProperty设置TO属性值

SetTOProperty “属性名”,”属性值”(runtime)

二、描述性编程

1、初级描述性编程(直描)

Object.(“属性名:=属性值”,” 属性名:=属性值”…)

Object:被测对象(类型)

Index2、代码简化

A.赋值给变量(set)

B.With…End With

With object

.statements

End With3、高级描述性编程(description)

Set mydes=description.create()

Mydes(“属性名”).value=”属性值”

Mydes(“属性名”).value=”属性值”

Dialog(“Login”).WinButton(mydes).Click4、ChildObjects

Set ChildO=ChildObjects(mydes)

Set ChilO=Dialog(“Login”).ChildObjects(mydes).count

For i=0 to ChildO.count-1

ChildO(i).click

next

下载Java JDBC编程总结word格式文档
下载Java JDBC编程总结.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    MATLAB 编程题总结

    MATLAB 编程题总结LY 1.输出x,y两个中值较大的一个值。 x=input('x='); y=input('y='); if x>y x else y end 2.输入x,计算y的值。计算函数的值yx1,x0 2x1,x0x=input('x=');......

    《C专家编程》总结

    《C专家编程》总结 开始读《C专家编程》之前,有一个很担心的问题:94年出的讲语言的书,在现在(2012)还有多少是适用的。因此,一边读,一边用VS2010做实验。最后发现大部分内容都还......

    NAND FLASH 编程总结

    NAND FLASH操作总结 目前NAND FLASH主要是SAMSUNG、TOSHIBA两家公司生产。本文我们主要讨论这两家的产品型号。另外我们还会讨论Hitachi的AND Flash, 为了内容条理起见,我们将......

    VC编程资料总结

    CString类的完美总结 2012-05-04 15:50:50 我来说两句 收藏 我要投稿 ①、CString 类对象的初始化: CString str; CString str1(_T("abc")); CString str2 = _T("defg"); TC......

    C++编程知识总结

    1.数组 1.1数组定义时的注意点 1在C++中不提供可变化大小的数组,○即数组定义中的常量表达式不能包含变量。(来源:C++书6.1.1) int n; cin>>n; float t[n]; 上例在定义数组t时,......

    数据库编程总结(推荐)

    数据库编程总结 当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS A......

    多线程编程知识总结

    多线程编程 一、 问题的提出 1.1问题的引出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_S......

    网络编程常见问题总结

    网络编程常见问题总结 网络编程常见问题总结 串讲(一) 网络编程常见问题总结 在网络程序中遇到的一些问题进行了总结, 这里主要针对的是我们常用的TCP socket相关的总结,......