第一篇: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