【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
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...