寫在前面 這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-proje ...
寫在前面
這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。
通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。
文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-project-example.git
需要源代碼的小伙伴們可以自行下載查看,後續文章涉及到的案例代碼也都會提交到這個倉庫【pb-project-example】
如果對小伙伴有所幫助,希望能給一個小星星⭐支持一下小凡。
一、小目標
學會使用MultiLineEdit
控制項以及對文件操作函數的使用,最終實現一個如下圖所示文件瀏覽器功能。
二、創建程式的基本框架
① 建立工作區
② 建立應用
③ 建立視窗
以上步驟忘記的小伙伴,請參照第一篇文章,創建應用、視窗與控制項
④ 建立控制項
在視窗中建立一個SingleLineEdit
控制項、一個MultiLineEdit
控制項和CommandButton
控制項,各個控制項的名稱
依次為sle_1
、mle_1
和cb_1
⑤ 保存視窗
將新建立的視窗保存為w_main
三、設置各個控制項的外觀及屬性
控制項名稱 | 主要屬性 | 值 |
---|---|---|
w_main |
Title |
文件瀏覽器 |
sle_1 |
Text |
(空) |
cb_1 |
Text 和Default |
打開 | True |
mle_1 |
Text 和 VScrollBar |
(空)|True |
四、編寫代碼
① 在按鈕cb_1
控制項的Clicked
事件中添加如下代碼
integer li_filenum,li_loops,li_i
long ll_flen,ll_bytes_read,ll_new_pos
string ls_part,ls_total,ls_filename
ls_filename = sle_1.text
if ls_filename = '' or isnull(ls_filename) then
messagebox('提示信息','請輸入文件名')
return
end if
SetPointer(HourGlass!)
ll_flen = FileLength(ls_filename)
if ll_flen<=0 then
messagebox('提示信息','無法打開文件')
return
end if
li_filenum = FileOpen(ls_filename,StreamMode!,Read!,LockRead!)
if ll_flen >32765 then
if mod(ll_flen,32765) = 0 then
li_loops =ll_flen/32765
else
li_loops = (ll_flen/32765) +1
end if
else
li_loops =1
end if
ll_new_pos =1
for li_i =1 to li_loops
ll_bytes_read = FileRead(li_filenum,ls_part)
ls_total +=ls_part
next
FileClose(li_filenum)
mle_1.text = ls_total
②在開發界面左邊雙擊App
應用對象,在App
的Open
事件中添加如下代碼
open(w_main)
五、運行程式
我們在E:\workspace\2-PB\pbl\pb-project-example\04FileBrowser\dirtest
目錄下新建xiezhr.txt 文件
運行程式,然後輸入xiezhr.txt全路徑,點擊【打開】按鈕便可讀出xiezhr.txt文件內容
六、文件操作函數
2.1 函數列表
函數名稱 | 描述 |
---|---|
CreateDirectory |
創建一個目錄 |
ChangeDirectory |
改變當前目錄 |
DirectoryExists |
判斷目錄是否存在 |
GetCurrentDirectory |
獲取當前目錄名 |
GetFileOpenName |
獲取打開文件名 |
GetFileSaveName |
獲取保存文件名 |
RemoveDirectory |
刪除目錄 |
FileExists |
判斷文件是否存在 |
FileLength |
獲取文件長度 |
FileOpen |
打開文件 |
FileClose |
關閉文件 |
FileDelete |
刪除文件 |
FileCopy |
複製文件 |
FileMove |
移動文件 |
FileSeek |
移動文件指針 |
FileRead |
讀取文件 |
FileWrite |
寫文件 |
2.2 函數詳細說明
2.2.1 CreateDirectory 函數
① 語法
CreateDirectory (目錄名稱)
參數:
- 目錄名稱,可以是絕對路徑,如果是絕對路徑,如果是絕對路徑,則在該路徑下創建,否則在項目空間下創建
返回值:Integer
- 1 函數執行成功
- -1 函數執行錯誤。例如:目錄已存在,再調用該函數會返回-1
② 功能
創建目錄
註: 如果目錄存在會報錯,所以在創建目錄前一般會判斷該目錄是否存在,不存在再創建
2.2.2 ChangeDirectory 函數
① 語法
ChangeDirectory (目錄名稱)
返回值:Integer
- 1 函數執行成功
- -1 函數執行錯誤
② 功能
改變當前目錄
2.2.3 DirectoryExists 函數
① 語法
DirectoryExists(目錄名稱)
返回值:boolean
- 如果目錄存在,則返回true
- 如果目錄不存在,則返回false
- 參數不符合規範,則返回false
② 功能
判斷某個目錄是否存在
2.2.4 GetCurrentDirectory 函數
① 語法
GetCurrentDirectory ()
返回值:string
- 當前目錄字元串
② 功能
獲取當前目錄名
2.2.5 GetFileOpenName 函數
① 語法
GetFileOpenName(title,pathname,filename{,extension{,filter}})
參數:
title
:string類型,指定對話框的標題pathname
:string類型變數,用於保存該對話框返回的文件路徑及文件名filename
:string類型變數,用於保存該對話框返回的文件名extension
:string類型,可選項,使用1到3個字元指定預設的擴展文件名filter
:string類型,可選項,其值為文件名掩碼,指定顯示在該對話框的列表框中供用戶選擇的文件名滿
足的條件(比如.,.TXT,.EXE等)
返回值:Integer
- 執行成功時返回1
- 當用戶單擊了對話框上的“Cancel”按鈕時函數返回0
- 發生錯誤時返回-1
- 如果任何參數的值為NULL ,返回null
② 功能
顯示打開文件對話框,讓用戶選擇要打開的文件
③ 例子
li_Value = GetFileOpenName("打開文件", ls_DocName, ls_Named, "rtf", &
"Text Files (*.TXT),*.TXT,"&
+"Doc Files (*.DOC),*.DOC," &
+"rtf files (*.rtf),*.rtf," &
+"all files (*.*),*.*")
If li_Value = -1 Then //打開文件錯誤
Beep(2) //響鈴兩聲
MessageBox("提示","文件打開錯誤!",Exclamation!) //提示錯誤
Return //返回
Elseif li_Value = 0 Then //用戶取消
Return //直接返回
End If
2.2.6 GetFileSaveName 函數
① 語法
GetFileSaveName(title,pathname,filename{,extension{,filter}})
參數:
title
:string類型,指定對話框的標題pathname
:string類型變數,用於保存該對話框返回的文件路徑及文件名filename
:string類型變數,用於保存該對話框返回的文件名extension
:string類型,可選項,使用1到3個字元指定預設的擴展文件名filter
:string類型,可選項,其值為文件名掩碼,指定顯示在該對話框的列表框中供用戶選擇的文件名滿
足的條件(比如.,.TXT,.EXE等)
返回值:Integer
- 執行成功時返回1
- 單擊了對話框上的“Cancel”按鈕時函數返回0
- 發生錯誤時返回-1
- 如果任何參數的值為NULL,那麼
GetFileSaveName()
函數返回NULL
② 功能
顯示保存文件對話框,讓用戶選擇要保存到的文件。
③ 例子
value = GetFileSaveName("保存文件", docname, named, "txt",&
"Text Files (*.TXT),*.TXT,")
If value <> 1 Then //要保存的文件名沒有正確設定,
Beep(2)
MessageBox("錯誤","設置文件名"+docname+"錯誤!")
return
End If
2.2.7 RemoveDirectory 函數
① 語法
RemoveDirectory(directoryname)
參數:string
directoryname
: 要刪除的目錄名
返回值:Integer
- 1 函數執行成功
- -1 函數執行錯誤
② 功能
刪除目錄
2.2.8 FileExists 函數
① 語法
FileExists ( filename )
參數:string
filename
:指定要檢查存在性的文件的文件名,其中可以包含路徑
返回值:Boolean
- 指定文件存在時返回TRUE
- 指定文件不存在時返回FALSE
- 執行失敗時,返回FALSE
- 參數為null,返回null
② 功能
判斷指定的文件是否存在。
2.2.9 FileLength 函數
① 語法
FileLength ( filename )
參數:string
filename
:指定要得到其長度的文件的文件名,其中可以包含路徑
返回值:Long
- 函數執行成功時返回指定文件的長度(以位元組為單位)。
- 如果指定的文件不存在,函數返回-1。
- 參數為null,則返回null
2.2.10 FileOpen 函數
① 語法
FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,
{creator,filetype}}}}})
-
filename:string類型,指定要打開文件的名稱,其中可以包含路徑
-
filemode:FileMode枚舉類型,可選項,指定文件打開方式。有效取值為:(LineMode! - 預設值,行
模式)(StreamMode! - 流模式) -
fileaccess:FileAccess枚舉類型,可選項,指定文件訪問方式。有效取值為:(Read! - 預設值,只
讀方式,這樣打開的文件只能進行讀操作;)(Write! - 只寫方式,這樣打開的文件只能進行寫操作) -
filelock:FileLock枚舉類型,可選項,指定文件加鎖方式。有效取值為:
-
n LockReadWrite! - 預設值,只有打開該文件的用戶能夠訪問該文件,其它用 戶對該文件的訪問均被拒
絕; -
n LockRead! - 只有打開該文件的用戶能夠讀該文件,但其它任何用戶均可寫該文件;
-
n LockWrite! - 只有打開該文件的用戶能夠寫該文件,但其它任何用戶均可讀該文件
-
n Shared! - 所有用戶均可讀寫該文件
-
-
writemode:WriteMode枚舉類型,可選項,當fileaccess參數指定為Write!時,該參數指定在指定文件
已經存在時數據的添加方式。
有效取值為:- Append! - 預設值,將數據添加到原文件尾部;
- Replace! - 覆蓋原有數據
- creator:可選項,用於Macintosh機,使用四個字元的字元串指定文件的創建者。指定該參數後,必須同時
指定filetype參數 - filetype:可選項,用於Macintosh機,使用四個字元的字元串指定文件類型
返回值:Integer
- 執行成功時,返回1
- 執行失敗時,返回-1
- 參數為null時,返回null
② 功能
以指定的讀寫方式打開指定的文件,同時返回該文件的句柄。
2.2.11 FileClose 函數
① 語法
FileClose ( fileno )
參數:integer
fileno
:指定要關閉文件的文件句柄,該句柄使用FileOpen()函數打開文件時得到
返回值:Integer
- 函數執行成功時返回打開文件的句柄 文件操作函數利用該句柄完成對文件的操作
- 發生錯誤時返回-1
- 如果fileno參數的值為NULL,那麼FileClose()函數返回NULL
② 功能
關閉先前用FileOpen()函數打開的文件。
2.2.12 FileDelete 函數
① 語法
FileDelete ( filename )
參數:string
filename
:指定要得到其長度的文件的文件名,其中可以包含路徑
返回值:Boolean
- 函數執行成功時返回TRUE
- 發生錯誤時返回FALSE
- 如果filename參數的值為NULL,那麼FileDelete()函數返回NULL。
② 功能
刪除指定的文件
2.2.13 FileCopy 函數
① 語法
FileCopy ( Sourcefile, Targetfile{, replace } )
參數:
Sourcefile
:要複製的文件的名稱的字元串Targetfile
: 複製到的文件的名稱的字元串replace
:指定是否替換目標文件的布爾值(true),為true時替換目標文件,為false時不替換(預設值為false)
返回值:Integer
- 執行成功返回1
- 打開源文件出錯-1
- 寫入目標文件出錯 -2
註:如果沒有為 源文件 或 目標文件 指定完全限定的路徑,則該函數將相對於當前目錄工作。如果沒有指定replace參數,則FileCopy函數不會替換目標目錄中與在targetfile參數中指定的名稱相同的文件(這相當於將replace值設置為false)。
② 功能
複製文件
③ 例子
將文件從當前目錄複製到另一個目錄,並將返回值保存在一個變數中
integer li_FileNum
li_FileNum = FileCopy ("jazz.gif" , &
"C:\emusic\jazz.gif", FALSE)
2.2.14 FileMove 函數
① 語法
FileMove ( Sourcefile,Targetfile)
參數:
Sourcefile
:要移動的文件的名稱的字元串Targetfile
:要移動文件的位置的名稱的字元串
返回值:
- 執行成功 1
- 打開源文件出錯 -1
- 寫入目標文件出錯 -2
註:如果目標目錄中已經存在同名文件,則無法寫入目標文件。如果要複製目標文件,可以使用FileCopy並將replace參數設置為true。
② 功能
將當前文件移動到另一目錄
③ 例子
將文件從當前目錄移動到另一個目錄,並將返回值保存在li_FileNum變數中
integer li_FileNum
li_FileNum = FileMove ("xiezhr.csv", &
"D:/project/xiezhr2024.csv" )
2.2.15 FileSeek函數
① 語法
FileSeek ( fileno, position, origin )
參數:
fileno
:integer類型,指定文件句柄(由FileOpen()函數得到)position
:long類型,指定相對於origin參數指定位置的新位置偏移量,以位元組為單位origin
:SeekType
枚舉類型,指定從哪裡開始移動文件指針,即指針移動的基準。有效取值為:FromBeginning!
- 預設值,從文件開頭移動指針;FromCurrent!
- 從當前位置移動文件指針;FromEnd!
- 從文件結尾處移動文件指針
返回值:Long
- 函數執行成功時返回指針移動後的指針位置
- 參數為null,則返回null
② 功能
將文件指針移動到指定位置。讀寫文件時相應函數會自動移動文件指針。
2.2.16 FileRead 函數
① 語法
FileRead ( fileno, variable )
參數:
fileno
:integer類型,指定文件句柄(由FileOpen()函數得到)variable
:string或blob類型的變數,用於保存讀取的數據
返回值:Integer
- 函數執行成功時返回讀取的字元數或位元組數
- 如果在讀取任何字元前讀到了文件結束符(EOF),則FileRead()函數返回-100
- 指定文件以行模式打開時,如果在讀取任何字元之前遇到了回車(CR)或換行(LF)字元,則FileRead()
函數返回0 - 執行錯誤,函數返回-1
② 功能
從指定文件中讀取數據
2.2.17 FileWrite 函數
① 語法
FileWrite (fileno , variable )
參數:
fileno
:integer類型,指定文件句柄(由FileOpen()
函數得到)variable
:string或blob類型,其值將寫入fileno
參數指定的文件
返回值:Integer
- 執行成功時返回寫入文件的字元或位元組數
- 發生錯誤時返回-1
- 任何參數的值為NULL 函數返回NULL
② 功能
向指定文件中寫數據。
七、MultiLineEdit 控制項
3.1 常用屬性
屬性 | 描述 |
---|---|
Visible |
預設為 True。當為 False 時,該控制項在視窗上隱藏 |
Enabled |
預設為 True。當為 False 時,該控制項不能獲得焦點,用戶不能進行編輯和選 中;控制項背景為灰色 |
DisplayOnly |
預設為 False。當為 True 時,該控制項中的文字不能被修改,並且也不能 輸入,但可以選中、複製 |
AutoHScroll |
預設為 True,表示當用戶輸入的內容顯示不下時,可以自動橫向滾動 游標,但是不顯示滾動條 |
HideSelection |
預設為 True,表示只有當單行編輯器獲得焦點時,才高亮顯示選中文 本。建議使用預設值,因為將該屬性設置為 False,沒有獲得焦點時,選中的內容就高亮顯示, 這容易讓用戶造成錯誤 |
RightToLeft |
|
Border |
是否顯示邊框,預設為 True |
Case |
有三個選項, upper 表示用戶輸入的內容中的字母都自動轉換成大寫, down 表示都自動轉換成小寫, any 表示不做轉換 |
Limit |
預設是 0,表示沒有長度限制。可以輸入其他一個數字,表示該單行編輯框中 最多接受用戶輸入的字元個數,最大數字是 32 767 |
HscrollBar |
是否顯示橫向滾動條,預設為 False。當該屬性為 True 時,顯示橫向滾 動條, 某行文字的寬度大於控制項的寬度, 則滾動條可用, 否則灰色顯示不可用。 當屬性為 False 時,輸入的文字大於控制項寬度,則自動換行 |
VscrollBar |
是否顯示縱向滾動條,預設為 False。當該屬性為 True 時,顯示縱向滾 動條, 如果文字的高度大於控制項的高度, 則滾動條可用, 否則灰色顯示不可用。 當屬性為 False 時,輸入的文字大於控制項高度時,就不允許再增加新的數據行 |
AutoVScroll |
是否在需要時自動顯示縱向滾動條,預設為 False。如果設置為 True, 在當前內容顯示滿控制項時,增加新的數據行將會出現縱向滾動條 |
IgnoreDefaultButton |
是否忽略 Enter 鍵,預設為 False。如果屬性為 True 並且當前焦 點在多行編輯器中, 這時使用 Enter 鍵則會在多行編輯器中增加一個新行; 如果屬性為 False, 則會觸發視窗上“ Default”按鈕的 Clicked 事件 |
Alignment |
文本的對齊方式,是一個枚舉型取值,有 Center!、 Justify!、 Left!、 Right!4 個取值,預設為 Left!。 |
3.2 事件和腳本
多行編輯器提供了 12 個預設事件,觸發時機和單行編輯器的 12 個事件完全相同 (忘記的小伙伴可以翻一翻前面文章的內容)經常
使用的事件也是 Modified
多行編輯器也提供了很多的函數,和單行編輯器的同名函數的用法及註意事項完全相同,需要註意的是兩個單行編輯器沒有的函數 LineCount
和 LineLength
。這兩個函數經常配合使用,對多行編輯器中的文本逐個字元處理
① LineCount 函數
獲取editname 中數據的實際行數,不管每行後面是否有回車或換行符號
返回值:Integer
- 執行成功,返回正確行數
- 執行錯誤返回-1
editname
為 Null,則返回 Null
② LineLength 函數
可以獲取 editname 中當前游標所在行,包括空格在內的字元數,
返回值:Integer
- 正確執行,返回游標所在行字元數
- 執行錯誤,返回-1
- 當 editname 為 Null 時返回 Null
本期內容到這兒就結束了,希望對你有所幫助。
我們下期再見 ヾ(•ω•`)o (●'◡'●)
本文來自博客園,作者:xiezhr,轉載請註明原文鏈接:https://www.cnblogs.com/xiezhr/p/18200440