【PB案例學習筆記】-04文件瀏覽器

来源:https://www.cnblogs.com/xiezhr/p/18200440
-Advertisement-
Play Games

寫在前面 這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-proje ...


寫在前面

這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。

通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。

文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-project-example.git

gitee代碼倉庫

需要源代碼的小伙伴們可以自行下載查看,後續文章涉及到的案例代碼也都會提交到這個倉庫【pb-project-example

如果對小伙伴有所幫助,希望能給一個小星星⭐支持一下小凡。

一、小目標

學會使用MultiLineEdit控制項以及對文件操作函數的使用,最終實現一個如下圖所示文件瀏覽器功能。

文件瀏覽器

二、創建程式的基本框架

① 建立工作區

② 建立應用

③ 建立視窗

以上步驟忘記的小伙伴,請參照第一篇文章,創建應用、視窗與控制項

④ 建立控制項

在視窗中建立一個SingleLineEdit控制項、一個MultiLineEdit 控制項和CommandButton控制項,各個控制項的名稱

依次為sle_1mle_1cb_1

建立控制項

⑤ 保存視窗

將新建立的視窗保存為w_main

三、設置各個控制項的外觀及屬性

控制項名稱 主要屬性
w_main Title 文件瀏覽器
sle_1 Text (空)
cb_1 TextDefault 打開 | True
mle_1 TextVScrollBar (空)|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應用對象,在AppOpen 事件中添加如下代碼

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參數指定位置的新位置偏移量,以位元組為單位
  • originSeekType枚舉類型,指定從哪裡開始移動文件指針,即指針移動的基準。有效取值為:
    • 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

多行編輯器也提供了很多的函數,和單行編輯器的同名函數的用法及註意事項完全相同,需要註意的是兩個單行編輯器沒有的函數 LineCountLineLength。這兩個函數經常配合使用,對多行編輯器中的文本逐個字元處理

① LineCount 函數

獲取editname 中數據的實際行數,不管每行後面是否有回車或換行符號

返回值:Integer

  • 執行成功,返回正確行數
  • 執行錯誤返回-1
  • editname 為 Null,則返回 Null

② LineLength 函數

可以獲取 editname 中當前游標所在行,包括空格在內的字元數,

返回值:Integer

  • 正確執行,返回游標所在行字元數
  • 執行錯誤,返回-1
  • 當 editname 為 Null 時返回 Null

本期內容到這兒就結束了,希望對你有所幫助。

我們下期再見 ヾ(•ω•`)o (●'◡'●)

本文來自博客園,作者:xiezhr,轉載請註明原文鏈接:https://www.cnblogs.com/xiezhr/p/18200440


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章介紹瞭如何在Vue.js應用中利用Vue Router實現單頁面應用的路由管理,包括配置路由、導航守衛的使用、路由懶載入以優化性能以及動態路由的實現方法,旨在提升用戶體驗和應用載入效率 ...
  • Popover API 為開發者提供了一種聲明式的方式來創建各種類型的彈窗。目前已在所有三大瀏覽器引擎中可用,並正式成為 Baseline 2024 的一部分。 ...
  • 前言 眾所周知,vue3的template中使用ref變數無需使用.value。還可以在事件處理器中進行賦值操作時,無需使用.value就可以直接修改ref變數的值,比如:<button @click="msg = 'Hello Vue3'">change msg</button>。你猜vue是在編 ...
  • 政務雲參考技術架構行業優勢總體架構 政務雲平臺技術框架圖,由機房環境、基礎設施層、支撐軟體層及業務應用層組成,在運維、安全和運營體系的保障下,為政務雲使用單位提供統一服務支撐。功能架構標準雙區隔離 參照國家電子政務規範,打造符合標準的雙區隔離的政務雲平臺,互聯網區承載對公服務業務,政務外網區承載各單 ...
  • 介紹: 在當今數字化時代,網路上的信息量龐大,如何使自己的網站在搜索引擎中脫穎而出成為了每個網站管理員都面臨的挑戰。網頁的原創度不僅能提升用戶體驗,還有利於搜索引擎排名。本文將介紹如何利用Coz API來重寫課件PPT網的網頁標題和正文內容,以增加網頁的原創度。 Coz API簡介: Coz是位元組出 ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • Trick: \(x\) 與各位數之和模 \(9\) 同餘(CF10D) st表 和 線段樹 可以存 gcd(CF10D) 註意函數增減性(CF1632D) dp 時若下標太大,可以調換下標和存儲的數值(CF1974E) 貪心不成立時,可以用反悔貪心(CF1974G) 乘法一般比加法更優(CF187 ...
  • 1.概述 1.1 介紹 Qt:它是一套基於C++的跨平臺開發框架,包括GUI、字元串、多線程處理、文件IO、網路IO、3D渲染等 時間:它誕生於1991年,由Haavard Nord和Eirik Chambe-Eng共同締造 發展:歷經Qt Company、Nokia、Digia多個公司開發迭代 版 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 .NET許可權管理及快速開發框架、最好用的許可權工作流系統。 基於經典領域驅動設計的許可權管理及快速開發框架,源於Martin Fowler企業級應用開發思想及最新技術組合(SqlSugar、EF、Quartz、AutoFac、WebAPI、Swagger、Mock、NUnit、Vue2/3、Ele ...
  • 前言 在實際項目開發中,需求變更和項目迭代是常態。要求我們能夠迅速響應,對資料庫結構進行相應的調整,如添加新表、更新現有表結構或增加欄位等。 為了確保團隊成員之間的信息同步,實時更新和維護資料庫文檔變得至關重要。這不僅提升了資料庫的可讀性,也極大提高了開發效率和團隊協作的流暢性。 SmartSQL, ...
  • ...
  • 在C#中,集合是用於存儲和操作一組數據項的數據結構。這些集合通常位於 System.Collections 和 System.Collections.Generic 命名空間中。下麵我將概述C#中幾種常用的集合類型及其特點: 1. System.Collections 命名空間中的集合 這個命名空間 ...
  • 前言 在項目開發中,方法返回的結果(成功或失敗)對我們開發來說很重要。傳統方法,如通過異常來指示錯誤或使用特定的返回類型(如布爾值加輸出參數),雖然有效,但可能缺乏直觀性和靈活性。 FluentResults庫應運而生,它以一種既流暢又富有表達力的方式,極大地優化了這一過程。通過使用FluentRe ...
  • 經過2個月的詳細調研,**稀土目前缺少生產車間之間數據協同交互、缺少完整的生產工序數據協同監測和分析,無法及時瞭解生產過程和經營情況,更無法進行有效的生產過程優化。本項目推動**稀土生產環節的數字化、信息化和智能化改造,從行業、戰略、技術和市場等方案全面提升**稀土的競爭力,打造**稀土焙燒、水浸、... ...
  • 最近遇到一個項目,由於客戶指定了印表機型號:HP LaserJet Pro M501n ,本來想著參考網上的代碼,使用System.Management來實現對印表機狀態的查詢,測試過程中發現無論是缺紙、空閑,獲取到的統統都是空閑狀態,咨詢售後也是說無法獲取狀態,也不提供SDK;後面在社區看見可以通 ...
  • 前言​ 推薦一個基於.NET 8 實現的通用許可權開發框架Admin.NET,前端使用Vue3/Element-plus開發。 基於.NET 8(Furion)/SqlSugar實現的通用管理平臺。整合最新技術,模塊插件式開發,前後端分離,開箱即用。 集成多租戶、緩存、數據校驗、鑒權、事件匯流排、動態A ...
  • 目錄Blazor 的關鍵概念項目模板Razor 語法依賴註入註入配置HeadOutlet 組件@code 分離Blazor 調試CSS 隔離調用JavaScript 最近在學習 Blazor ,在B站上找了一個國外的課程邊看邊學習。嗯,原價¥1503的課程,大概200多美元,課程鏈接如下: B站(大 ...
  • 在.Net中,資源回收主要是指記憶體管理和非托管資源的釋放。分別提供了兩種主要的方式進行處理: 垃圾回收(GC) 確認性資源釋放(DRD) 官網相關文檔的鏈接:https://learn.microsoft.com/zh-cn/dotnet/standard/managed-code 垃圾回收(Gar ...