寫在前面
這是PB案例學習筆記系列文章的第二篇,該系列文章適合具有一定PB基礎的讀者,
透過一個個由淺入深的程式設計實戰案例學習,提高程式設計技巧,以保證小夥伴們能應付公司的各種開發需求。
文章中設計到的原始碼,小凡都上傳到了gitee程式碼倉庫https://gitee.com/xiezhr/pb-project-example.git
需要原始碼的小夥伴們可以自行下載檢視,後續文章涉及到的案例程式碼也都會提交到這個倉庫【pb-project-example】
如果對小夥伴有所幫助,希望能給一個小星星⭐支援一下小凡。
一、小目標
掌握pb
應用程式的建立、執行、中止等最基本操作。學會使用DropDownListBox
控制元件、ListBox
控制元件,以及
DirList
、SelectItem
、DirSelect
、SetRedraw
等函式和SetPointer
系統函式使用。最終實現如下效果
二、 DropDownListBox
控制元件
2.1 常用屬性
屬性 | 描述 |
---|---|
AllowEdit |
設定是否允許使用者輸入新的專案,預設為不允許 |
AutoHScroll |
設定當錄入新專案或者刪除資料時是否允許自動滾動編輯框,預設不允許 .下拉 列表框的寬度大於 Limit 規定的數值, 則沒有必要設定該屬性; 否則就應該設定該屬性為 True |
Enabled |
設定是否允許進行選擇,預設值是 True |
Limit |
用來規定使用者可以輸入的字元的最大寬度, 0 表示沒有限制,最大是 32 766 個, 預設是 0。 |
ShowList |
規定是否總顯示下拉選單,當該屬性為 True 時, PowerBuilder 自動將 AllowEdit 屬性置為 True,並且此時列表框總顯示,向下的小箭頭取消。該屬性預設為 False,通常情 況下不將該屬性置為 True |
Sorted |
定義各個專案是否自動排序顯示,預設為 False |
HScrollBar |
在需要時,是否顯示水平捲軸 |
VScrollBar |
在需要時,是否顯示垂直捲軸 |
2.2 常用事件
事件 | 觸發時機 |
---|---|
SelectionChanged |
預設事件,在重新選擇了下拉選單中的專案時觸發,引數 index 可以直接引用,是當前選中專案的索引號 |
Modified |
在輸入了新的專案後按下 Enter 或者 Tab 鍵而使下拉選單框失去焦點時 觸發 |
2.3 常用函式
提供了 37 個函式,圖形下拉選單框除此之外又增加了 3 個使用者圖形處理的函式
2.3.1、AddItem
函式
①語法
listbox.AddItem(String)
②功能
在列表框最後新增一個專案, 如果列表框的 Sorted 屬性為 True, 新增的專案重新排序
2.3.2、DeleteItem
函式
①語法
Lb.DeleteItem(index)
返回值:
- -1 表示刪除失敗
- Null 表示引數為 Null
- 正數,表示刪除後列表框中的專案數
② 功能
刪除指定索引號的專案
2.3.3、DirList
函式
① 語法
Lb.Dirlist(filespec,filetype,{statictext})
引數:
-
filespec
為要顯示檔案的路徑及字尾 -
filetype
表示檔案的型別 -
statictext
為視窗上的要顯示路徑的statictext
控制元件名稱
其中檔案型別取值如下
檔案型別-filetype | 描述 |
---|---|
0 | 可讀寫檔案 |
1 | 只讀檔案 |
2 | 隱含檔案 |
4 | 系統檔案 |
16 | 子目錄 |
32 | 歸檔檔案 |
16 384 | 驅動器 |
32 768 | 可讀寫檔案以外的 |
注:同時顯示多種型別的檔案,可以使用加號連線。例如同時要顯示可讀寫、子目錄、驅動器, 引數 filetype 可以使用表示式 0+16+16384
返回值:
Null
表示至少有一個引數為Null
True
表示操作正確完成False
表示列表框不能正確顯示指定檔案 (ilespec
不是一個目錄 )
②功能
在列表框中顯示指定型別的檔案
③ 例子
在 lb_1 列表框中顯示目錄“ c:\dos”下的字尾為txt 的所有可讀寫檔名稱,並將路徑名稱“ c:\dos”顯示在 statictext 控制元件 st_1 中
lb_1.DirList("c:\dos\*.txt",0,st_1)
2.3.4、DirSelect
函式
①語法
Listboxname.DirSelect ( selection )
返回值:
Null
表示至少有一個引數是Null
True
表示使用者選擇的是目錄、驅動器False
表示使用者選擇的是檔案
② 功能
如果目前列表框中的內容是使用函式 Dirlist
獲得的,該函式會將使用者在列表框Listboxname
中選擇的專案的內容儲存在 String 型別變數 Selection
中;如果目前列表框中的內容不是使用 DirSelect
獲得的,該函式返回的值不能正確反映實際的內容
③ 例子
String ls_pathname
String ls_pattern
Ls_pattern = '*.txt'
If lb_1.DirSelect(ls_pathname) Then //使用者選擇的是目錄或驅動器
lb_1.DirList(ls_pathname + ls_pattern,0) //顯示使用者選擇的目錄或驅動器下的檔案
Else
//使用者選擇的是檔案,進行其他相關處理
End If
2.3.5、FindItem
函式
① 語法
listboxname.FindItem ( text, index )
返回:
- -1 表示沒有找到或者發生錯誤
- 有引數為 Null 時返回 Null
- 正確執行並找到了匹配的專案則返回與之匹配的第一個專案的索引號
②功能
在 listboxname
列表框中從索引號為index+1
的專案開始搜尋, 看是否有內容為text
的專案。
③ 例子
在 sle_1(單行文字輸入框) 的 Modified 事件中,在 lb_1 查詢所有和使用者輸入字元匹配的專案的索引號和內容
Int li_pos,li_pri
li_pos = lb_1.FindItem(this.text,0)
li_pri = li_pos
Do
MessageBox(String(li_pos),lb_1.text(li_pos))
li_pri = li_pos
li_pos = lb_1.FindItem(this.text,li_pos)
Loop Until li_pos <= li_pri
2.3.6、InsertItem
函式
① 語法
Lb_1.InsertItem(str,index)
引數:
- str 表示要插入的內容
- index表示索引號
返回值:
- -1 表示插入失敗
- Null 表示有引數為 Null
- 正整數表示插入專案在列表框中最後的實際位置
② 功能
在指定索引號前插入內容為 Item 的專案
③ 例子
Lb_1.InsertItem("倒數第二",lb_1.TotalItems())
Lb_1.InsertItem("倒數第二",lb_1.TotalItems())
2.3.7、Reset
函式
① 語法
listbox.Reset()
返回值:
- 1 表示執行成功
- -1 表示執行失敗
② 功能
用來清除列表框中的所有專案
2.3.8、SelectItem
函式
① 語法
listboxname.SelectItem ( item, index )
返回值:
- 如果正確執行並找到了匹配的專案,則返回匹配專案的索引號
- 如果沒有匹配的專案,則返回 0
- 如果發生了錯誤則返回-1
- 如果有引數為 Null,則返回 Null
②功能
在不允許多選的 listboxname
列表框的索引號為 index
之後查詢內容為 item
的專案,如果找到則選中該專案
注: 該查詢也是前面部分匹配,同函式 FindItem
的匹配相同。當列表框允許多選時,該函式不起作用,這時應該使用 FindItem
和 SetState
來實現該功能。函式 SetState
不影響已經選中行的狀態。
③ 例子
在 lb_1 列表框中選中內容為“ beautiful”的專案,能否正確執行都顯示提示資訊
If lb_1.SelectItem("beautiful",0) > 0 Then
MessageBox("提示", "正確選中了 beautiful")
Else
MessageBox("提示","沒有找到指定的專案")
End If
2.3.9、Text
函式
①語法
listbox.Text(index)
返回值:
index
索引對應的item專案值
②功能
用來讀取指定索引號的專案的內容
2.3.10、TotalItems
函式
① 語法
listbox.TotalItems()
返回值:
返回一個整型數值,表示列表框中總共有多少個專案
注: 列表框的第一個專案的索引號是1,最後一個的索引號等於 listbox.TotalItems()
②功能
該函式可以讀取列表框中總共有多少個專案
2.3.11、SelectedLength
函式
①語法
editname.SelectedLength ( )
返回值:
- -1 表示執行過程中發生了錯誤
- 0 表示沒有選中的專案
- Null 表示 editname 為Null
- 其他正整數表示選中專案的字元數目
② 功能
獲取在 editname 中選中專案的字元數目,包括空格。
注:,該函式只有在下拉選單框選中專案並且沒有失去焦點時,才能正確獲得所選專案的字元數目,所以在很多的事件或控制元件中程式設計使用該函式都返回 0,因為這些事件觸發時,下拉選單框失去了焦點,所以一般在下拉選單框的 SelectionChanged
事件中使用該函式。
另外,下拉選單框的 AllowEdit
屬性必須為 True
,才能正確執行該函式,否則該函式執行錯誤
③ 例子
取消下拉選單框中選中的專案,可以在向下拉選單框新增初始資料時增加一個空值(“”),
選擇空值即可表示取消選中專案。所以,在讀取選中專案的內容時,首先判斷選中字元的長度,如果不為 0 則繼續處理,
否則表示取消選中,這時不做任何處理
If this.SelectedLength() > 0 Then
//繼續處理
End If
2.3.12、SelectedText
函式
① 語法
editname.SelectedText ( )
返回值:
- 當有錯誤發生或者沒有選中專案時返回空值(“”)
- 當 editname 為 Null 返回 Null
- 正確執行時返回選中專案的內容
② 功能
返回 editname 中選中專案的內容。該函式在下拉選單框選中專案並且沒有失去焦點時,可以正確返回選中專案的內容
③ 例子
首先判斷是否有選中專案,如果有就獲取選中專案的內容並儲存在變數中
String ls_selected
If ddlb_1.SelectedLength() > 0 Then
ls_selected = ddlb_1.SelectedText()
End If
2.3.13、SelectText
函式
① 語法
editname.SelectText ( start, length )
返回值:
- 返回選中的字元個數
- 發生了錯誤則返回-1
- 有引數為 Null 則返回Null
② 功能
在 editname
的編輯框中,從第 start 字元開始選中 length 個字元。
2.3.14、ReplaceText
函式啊
① 語法
editname.ReplaceText (string )
返回值:
- 返回 string 字串的長度
- 發生錯誤則返回-1
- 有引數為 Null 則返回Null
② 功能
在 editname
中用指定的字串 string 來替換選中的字元
③ 例子
本首先選中列表框 ddlb_1 中當前專案的第一個字元,然後替換成“ X”
If ddlb_1.SelectText(1,1) > 0 Then
ddlb_1.ReplaceText("X")
End If
三、 ListBox 控制元件
ListBox我們叫做列表框,可以逐條陳列出多條資訊,當資訊比較多時,可以使用捲軸
3.1 常用屬性
ListBox 屬性有35個,一般經常需要修改的有5個
屬性 | 描述 |
---|---|
Sorted |
指定列表框的內容是否排序,不管是數字還是字元都按字元處理,按照ASCII大小進行排序 |
VscrollBar |
縱向捲軸 |
HscrollBar |
橫向捲軸 |
MultiSelect |
表示是否可以選擇多項 |
ExtendedSelect |
多項進行同時選擇,需要配合Ctrl或Shift鍵使用 |
3.2 常用事件
這裡只列舉出該控制元件特有的事件,其他事件與上一篇文章介紹的【命令按鈕】事件相同
事件 | 觸發時機 |
---|---|
SelectionChanged |
重新選擇專案時,觸發 |
DoubleClicked |
雙擊專案時觸發 |
3.3 常用函式
該控制元件總共有35個函式,常用的有14個
3.3.1 Reset 函式
① 語法
listbox.Reset()
返回值:
- 1表示執行成功
- -1表示執行失敗
② 功能
清除列表框中的所有專案
3.3.2 AddItem 函式
① 語法
listbox.AddItem(String)
② 功能
列表框最後新增一個專案, 如果列表框的 Sorted 屬性為 True, 則新增的專案重新排序
注:Item[]是一個記錄列表框專案的陣列,透過指定索引號可以獲取專案的內容,但使用 AddItem 函式不能修改該屬性。
3.3.3 TotalItems 函式
① 語法
listbox.TotalItems()
返回值:
一個整型數值,表示列表框中總共有多少個專案
② 功能
讀取列表框中總共有多少個專案
注:列表框的第一個專案的索引號是1,最後一個的索引號等於listbox.TotalItems()
3.3.4 State 函式
① 語法
listbox.State(index)
返回值:
- 1 表示指定索引號的專案是選中狀態
- 0 表示指定索引號的專案沒有被選中
② 功能
用來判斷指定索引號的專案是否選中
3.3.5 Text 函式
① 語法
listbox.Text(index)
返回值:
返回一個String 型別的專案值
② 功能
用來讀取指定索引號的專案的內容
3.3.6 DeleteItem 函式
①語法
Lb.DeleteItem(index)
返回值:
- -1 表示刪除失敗
- Null 表示引數為 Null
- 其他正數值表示刪除後列表框中的專案數。
② 功能
刪除指定索引號的專案
3.3.7 InsertItem 函式
① 語法
Lb_1.InsertItem(str,index)
str
表示要插入的內容index
表示插入專案的索引
返回值:
- -1 表示插入失敗
- Null 表示有引數為 Null
- 其他正整數表示插入專案在列表框中最後的實際位置
② 功能
在指定索引號前插入內容為 Item 的專案
③ 例子
在 lb_1 列表框的倒數第二的位置插入一個內容為“倒數第二”的專案
Lb_1.InsertItem("倒數第二",lb_1.TotalItems())
3.3.8 Dirlist 函式
① 語法
Lb.Dirlist(filespec,filetype,{statictext})
filespec
為要顯示檔案的路徑及字尾statictext
為視窗上的要顯示路徑的statictext
控制元件名稱filetype
表示檔案的型別 ,取值如下
檔案型別 | 描述 |
---|---|
0 | 可讀寫檔案 |
1 | 只讀檔案 |
2 | 隱藏檔案 |
4 | 系統檔案 |
16 | 子目錄 |
32 | 歸檔檔案 |
16 384 | 驅動器 |
32 768 | 可讀寫檔案以外的 |
注:同時顯示多種型別的檔案,可以使用加號連線。例如同時要顯示可讀寫、子目錄、驅動器, 引數 filetype 可以使用表示式 0+16+16384
返回值:
- Null 表示至少有一個引數為 Null
- True 表示操作正確完成
- False 表示列表框不能正確顯示指定檔案 (當
filespec
不是一個目錄 )
③ 例子
在 lb_1 列表框中顯示目錄“ c:\dos”下的字尾為txt 的所有可讀寫檔名稱,並將路徑名稱“ c:\dos”顯示在 statictext 控制元件 st_1 中
lb_1.DirList("c:\dos\*.txt",0,st_1)
//同時還顯示驅動器和“ c:\dos”下的子目錄
Lb_1.DirList("c:\dos\*.txt",0+16+16384,st_1)
3.3.9 DirSelect 函式
① 語法
Listboxname.DirSelect ( selection )
返回值:
- Null 表示至少有一個引數是 Null
- True 表示使用者選擇的是目錄、驅動器
- False表示使用者選擇的是檔案
② 功能
如果目前列表框中的內容是使用函式 Dirlist
獲得的,該函式會將使用者在列表框Listboxname
中選擇的專案的內容儲存在 String 型別變數 Selection
中;
如果目前列表框中的內容不是使用 DirSelect
獲得的,該函式返回的值不能正確反映實際的內容
③ 例子
String ls_pathname
String ls_pattern
Ls_pattern = '*.txt'
If lb_1.DirSelect(ls_pathname) Then //使用者選擇的是目錄或驅動器
lb_1.DirList(ls_pathname + ls_pattern,0) //顯示使用者選擇的目錄或驅動器下的檔案
Else
//使用者選擇的是檔案,進行其他相關處理
End If
3.3.10 FindItem 函式
① 語法
listboxname.FindItem ( text, index )
- 沒有找到或者發生錯誤則返回-1
- 有引數為 Null 時返回 Null
- 正確執行並找到了匹配的專案則返回與之匹配的第一個專案的索引號
② 功能
在 listboxname
列表框中從索引號為 index+1 的專案開始搜尋, 看是否有內容為 text的專案
③ 例子
在 sle_1 的 Modified 事件中,在 lb_1 查詢所有和使用者輸入字元匹配的專案的索引號和內容。
Int li_pos,li_pri
li_pos = lb_1.FindItem(this.text,0)
li_pri = li_pos
Do
MessageBox(String(li_pos),lb_1.text(li_pos))
li_pri = li_pos
li_pos = lb_1.FindItem(this.text,li_pos)
Loop Until li_pos <= li_pri
3.3.11 SelectedIndex 函式
① 語法
listcontrolname.SelectedIndex ( )
返回值:
- 如果找到選中專案,則返回該第一個選中專案的索引號
- 如果 listcontrolname為 Null 則返回 Null
- 如果沒有找到選中專案或者查詢過程中發生了錯誤則返回-1
② 功能
在 listcontrolname 列表框中查詢第一個選中的專案
③ 例子
如果列表框中有選中專案,則顯示第一個選中專案的內容
If lb_1.SelectedIndex() > 0 Then //看是否有選中專案
MessageBox(“提示”,lb_1.Text(lb_1.SelectedIndex())) //顯示選中專案的內容
End If
3.3.12 SelectedItem 函式
① 語法
listboxname.SelectedItem ( )
返回值:
- 如果有選中專案,則返回選中專案的內容
- 如果沒有選中專案則返回空值""
- 如果 listboxname 為 Null,則返回 Null
② 功能
獲取列表框 listboxname
中選中專案的內容。通常在列表框不允許同時選中多行時
使用,當允許多行同時選中時,經常使用 state 和 text 函式來獲取選中專案的內容
③ 例子
下面程式在某按鈕的單擊事件中判斷列表框 lb_1 中是否有選中專案,如果有,則
顯示選中專案的內容,否則顯示提示資訊
If Len(lb_1.SelectedItem()) > 0 Then
MessageBox("提示",lb_1.SelectedItem())
Else
Beep(2)
MessageBox("提示","請首先選擇! ")
End If
3.3.13 SelectItem 函式
① 語法
listboxname.SelectItem ( item, index )
返回值:
- 如果正確執行並找到了匹配的專案,則返回匹配專案的索引號
- 如果沒有匹配的專案,則返回 0
- 如果發生了錯誤則返回-1
- 如果有引數為 Null,則返回 Null
②功能
在不允許多選的 listboxname
列表框的索引號為 index 之後查詢內容為 item
的專案,
如果找到則選中該專案。注意,該查詢也是前面部分匹配,同函式 FindItem
的匹配相同。當
列表框允許多選時,該函式不起作用,這時應該使用 FindItem
和 SetState
來實現該功能。函
數 SetState
不影響已經選中行的狀態
③ 例子
在 lb_1 列表框中選中內容為“ beautiful”的專案,能否正確執行都顯示提示資訊
If lb_1.SelectItem("beautiful",0) > 0 Then
MessageBox("提示", "正確選中了 beautiful")
Else
MessageBox("提示","沒有找到指定的專案")
End If
3.3.14 TotalSelected 函式
① 語法
listcontrolname.TotalSelected ( )
返回值:
- 正確執行時返回列表框中選中的專案數
- 沒有選中專案時返回 0
- 執行錯誤時返回-1
listcontrolname
為Null
,則返回Null
② 功能
獲取在 listcontrolname 列表框中選中的專案數。該函式只在列表框允許多選時起
作用,在不允許多選列表框中,即使有選中,專案也返回-1
③ 例子
在某按鈕的 Clicked 事件中,用來判斷列表框是否允許多選,如果允許則使用函式 TotalSelected 顯示選中的專案數,
如果不允許多選,則使用其他函式顯示是否有選中專案
If lb_1.MultiSelect or lb_1.ExtendedSelect Then
If lb_1.TotalSelected() > 0 Then
Messagebox("提示","該列表框允許同時選中多行,現有"&
+ String(lb_1.TotalSelected()) + "條資料選中!")
Else
Messagebox("提示","該列表框允許同時選中多行,沒有選中的資料!")
End If
Else
If lb_1.SelectedIndex() > 0 Then
MessageBox("提示","該列表框最多隻允許選中一條,現有一條選中!")
Else
MessageBox("提示","該列表框最多隻允許選中一條,現沒有選中的資料!")
End If
End If
四、搭建程式基本框架_
① 建立工作區
② 建立應用
③ 建立視窗
以上步驟忘記的小夥伴,可以參照第一篇文章建立
④ 新增控制元件
在視窗中建立一個DropDownListBox
控制元件,兩個ListBox
控制元件以及一個CommandButton
控制元件。佈局如下圖所示
各個控制元件名稱為ddlb_disk
、lb_filders
和lb_files
⑤ 儲存視窗,將視窗命名為w_main
五、設定各個控制元件的外觀屬性
設定DropDownListBox
控制元件和ListBox
控制元件外觀屬性。勾選如下屬性
Visible
、Sorted
、VScrollBar
和Border
四個屬性
六、編寫事件程式碼
這裡只列舉出常用函式的使用,如果想了解更多,可以參照上面小節函式多寫程式碼實踐
①在w_main
視窗的open
事件中編寫如下程式碼
SetPointer(HourGlass!)
ddlb_disk.DirList("c:\*.*", 16384)
ddlb_disk.SelectItem("c", 0)
lb_folders.Dirlist("C:\*.*", 32768 + 16)
lb_files.Dirlist("C:\*.*", 39)
②在ddlb_disk控制元件的SelectionChanged事件中新增如下程式碼
string ls_disk
this.dirselect( ls_disk)
IF ls_disk <>""THEN
SetPointer(HourGlass!)
lb_folders.setredraw(false)
lb_folders.dirlist(ls_disk,32768)
lb_folders.DirList("*.*",32768 +16)
lb_files.DirList("*.*",39)
end if
③ 在lb_folders控制元件的SelectionChanged事件中新增如下程式碼
String ls_dir
if this.DirSelect(ls_dir) then
SetPointer(HourGlass!)
this.DirList(ls_dir,32768+16)
lb_files.dirlist("*.*",39)
end if
七、執行程式
本期內容到這兒就結束了,希望對你有所幫助。我們下期再見 ヾ(•ω•`)o (●'◡'●)