PB從入坑到放棄(四)常用函數

2023-07-17 09:01:05

寫在前面

這一期呢,來整理下PB 常用的函數,包括系統的和一些自己封裝好的函數

一、字串相關

1.1 Len函數

獲取字串長度

① 語法

Len(string)

②引數

string-->string 型別變數

③ 返回值

  • 返回值:Long
  • 函數執行成功時返回字串長度,發生錯誤返回-1
  • 函數執行成功時返回字串長度,發生錯誤返回-1

1.2 Mid 函數

擷取字串

① 語法

Mid(string,start,length)

② 引數

  • string-->string型別,指定要從中要擷取的字串
  • start-->long型別,指定字串第一個字元在string中的位置,第一個位置1
  • length-->long型別,可選項,指定字串長度

③ 返回值

  • 返回值:String
  • 成功時返回string字串中從start位置開始、長度為length的子串
  • 如果start引數的值大於string中字元個數,那麼Mid()函數返回空字串
  • 如果省略了length引數或length引數的值大於從start開始、string字串中餘下字元的長度,函數返回所有餘下的字元
  • 如果任何引數的值為NULL,函數返回NULL

1.3 Pos函數

在一個字串中查詢所包含的另一個字串的起始位置

①語法

Pos ( string1, string2, start )

② 引數

  • string1-->string型別,目標字串
  • string2-->string型別,指定要在string1中查詢的字串
  • start-->long型別,可選項,指定從string1的第幾個字元開始查詢 預設值為1

③ 返回值

  • 返回值:Long
  • 成功時返回在start位置後string2string1中第一次出現的起始位置。
  • 如果在string1中按指定要求未找到string2、或start的值超過了string1的長度,那麼Pos()函數返回0。
  • 如果任何引數的值為NULL,函數返回NULL
  • 用法Pos()函數在字串查詢時區分大小寫,因此,xiezhr不匹配XIEZHR

1.4 Left函數

得到字串左部指定個數的字元

①語法

Left ( string, n )

② 引數

  • string-->string型別,指定要提取子串的字串
  • n-->long型別,指定子串長度

③ 返回值

  • 返回值 :String
  • 成功時返回string字串左邊n個字元,發生錯誤時返回空字串""
  • 如果任何引數的值為NULLLeft()函數返回NULL
  • 如果n的值大於string字串的長度,函數返回整個string字串,但並不增加其它字元

1.5 Right 函數

從字串右端取指定個數位符

① 語法

Right ( string, n )

② 引數

  • string-->string型別,指定要提取子串的字串
  • n-->long型別,指定子串長度

③ 返回值

  • 返回值:String
  • 成功時返回string字串右邊n個字元,發生錯誤時返回空字串""
  • 如果任何引數的值為NULLRight()函數返回NULL
  • 如果n的值大於string字串的長度,函數返回整個string字串,並且不增加其它字元

1.6 Trim 函數

刪除字串首部和尾部的空格

① 語法

Trim ( string )

② 引數

string-->string型別,要刪除空格的目標字串

③返回值

  • 返回值:String
  • 成功時返回刪除了串首部和尾部空格的字串,發生錯誤時返回空字串("")
  • 如果任何引數的值為NULL,函數返回NULL

1.7 Match 函數

字串中是否包含指定模式的字元

① 語法

Match ( string, textpattern )

② 引數

  • string-->string型別,要檢查是否匹配指定模式的目標字串
  • textpattern-->string型別,指定文字匹配模式

③ 返回

  • 返回值 Boolean
  • 如果字串string與模式textpattern相匹配,則函數返回true,否則返回false
  • 如果指定的匹配模式無效或上述兩個引數中的任何一個未曾賦值,那麼Match()函數返回false
  • 如果任何引數的值為NULL,函數返回NULL

1.8 Fill 函數

生成一個由指定字串填充的指定長度的新字串

① 語法

Fill ( string, n )

② 引數

  • string--> string型別,指定用於重複填充的字串
  • n-->long型別,指定由該函數返回的字串的長度

③ 返回

  • 返回值:String
  • 成功時返回n個字元的字串,該字串以引數string中的字串重複填充而成
  • 如果引數string中的字元個數多於n個,那麼使用string字串的前n個字元填充函數返回的字串
  • 如果引數string中的字元個數少於n個,那麼使用string字串反覆填充,直到返回的字串長度達到n為止
  • 如果任何引數的值為NULL,函數返回NULL

1.9 Lower 函數

將字串中的大寫字母轉換為小寫字母

① 語法

Lower ( string )

② 引數

string-->需要轉換的目標字串

③ 返回

  • 返回值:String
  • 函數執行成功時返回將大寫字母轉換為小寫字母后的字串,發生錯誤時返回空字串""
  • 如果string引數的值為NULL,函數返回NULL

1.10 Upper 函數

將字串中的小寫字母轉換為大寫字母

① 語法

Upper( string )

② 引數

string--> 需要轉換的目標字串

③ 返回

  • 返回值:String
  • 成功時返回將小寫字母轉換為大寫字母后的字串,發生錯誤時返回空字串""
  • 如果string引數的值為NULL,函數返回NULL

1.11 Replace 函數

將一個字串中指定個數的字串替換為另一個字串

① 語法

Replace ( string1, start, n, string2 )

② 引數

  • string1--> string型別,指定要使用string2替換其中一部分內容的字串
  • start--> long型別,指定要從哪個字元位置開始替換字串,字串中第一個字元的位置為1
  • n--> long型別,指定要替換多少個字元
  • string2-->string型別,指定用哪個字串替換string1的部分字元

③ 返回

  • 返回值:String
  • 成功時返回替換後的字串,發生錯誤時返回空字串""
  • 如果start引數指定的位置超過了string1的長度,函數把將string2拼接到string1的後
    面形成的字串返回
  • 如果n的值為0,函數把string2插入到string1指定位置後形成的字串返回
  • 如果任何引數的值為NULL,函數返回NULL

1.12 Space 函數

生成一個由空格組成的指定字元個數的字串

① 語法

Space ( n )

② 引數

n-->long型別,指定要填充的空格個數,即填充後返回的字串的長度

③ 返回

  • 返回值:String
  • 成功時返回由n個空格組成的字串,發生錯誤時返回空字串""
  • 如果引數n的值為NULL,函數返回NULL

1.13 LeftTrim 函數

刪除字串左邊空格

① 語法

LeftTrim ( string )

② 引數

string-->string型別,需要處理的字串

③ 返回

  • 返回值:String
  • 成功時返回刪除了左部空格的字串,發生錯誤時返回空字串""
  • 如果任何引數的值為NULL,函數返回NULL

1.14 RightTrim 函數

刪除字串右邊空格

① 語法

RightTrim ( string )

② 引數

string-->string型別,需要處理的字串

③ 返回

  • 返回值:String
  • 成功時返回刪除了string字串右部空格的字串,發生錯誤時返回空字串""
  • 如果任何引數的值為NULL,函數返回NULL

二、日期時間相關

2.1 Year 函數

獲取日期中的年份

① 語法

Year(date)

② 引數

date--> date型別的值

③ 返回

  • 返回值:Integer
  • 成功時得到date引數中的年份(四位數位),發生錯誤時返回1900
  • 如果date引數的值為NULL,則函數返回null
  • PB能夠處理的年份從1000到3000之

2.2 Month 函數

獲取日期中的月份

① 語法

Month ( date )

② 引數

date--> date型別的值

③ 返回

  • 返回值:Integer
  • 成功時得到date引數中的月份(1到12之間)
  • 如果date引數的值為NULL,函數返回NULL

2.3 Day 函數

獲取日期中的號數(1到31之間的整數值)

① 語法

Day (date)

② 引數

date--> date型別的值

③ 返回

  • 返回值:Integer
  • 成功時返回號數(1到31之間的整數值)
  • 如果date引數的值為NULL,函數返回NULL

2.4 Hour 函數

獲取時間值中的小時,採用24小時制

① 語法

Hour (time)

② 引數

time-->time型別的值

③ 返回

  • 返回值:Integer
  • 成功時得到time引數中的小時(00到23之間)
  • 如果time引數的值為NULL,函數返回NULL

2.5 Minute 函數

獲取時間值中的分鐘,00~59之間

① 語法

Minute (time)

② 引數

time-->time型別的值

③ 返回

  • 返回值:Integer
  • 成功時得到time引數中的分鐘(00到59之間)
  • 如果time引數的值為NULL,函數返回NULL

2.6 Second 函數

獲取時間值中的秒,在00~59之間

① 語法

Second (time)

② 引數

time-->time型別的值

③ 返回

  • 返回值:Integer
  • 成功時得到time引數中的秒(00到59之間)
  • 如果time引數的值為NULL,函數返回NULL

2.7 Today 函數

獲取當前系統日期,在某些情況下,同時得到當前系統時間

① 語法

Today()

② 引數

③ 返回

  • 返回值:Date 當前系統日期
  • 單獨呼叫Today()函數時,返回當前系統日期
  • 用做某些函數的引數、而該引數要求DateTime型別的值時,函數能夠在返回當前系統日期的同時返回當前系統時間

2.8 Now 函數

獲取客戶機的當前系統時間

① 語法

Now()

② 引數

③ 返回

  • 返回值:Time 客戶機的當前系統時間

2.9 RelativeDate 函數

獲取指定日期前多少天或後多少天的日期

① 語法

RelativeDate(date,n)

② 引數

  • date-->Date型別,指定基準日期
  • n-->integer型別,指定天數

③ 返回

  • 返回值:Date
  • n>0時返回指定日期後第n天的日期;
  • n<0 時返回指定日期前第n天的日期。
  • 如果任何引數的值為NULL,函數返回NULL

2.10 RelativeTime 函數

獲取指定時間前多少秒或後多少秒的時間,採用24小時制

① 語法

RelativeTime (time, n)

② 引數

  • time--> time型別,指定基準時間
  • n--> long型別,指定秒數

③ 返回

  • 返回值:Time
  • n>0時返回指定時間後第n秒的時間;
  • n<0時返回指定時間前第n秒的時間。
  • 如果任何引數的值為NULL,函數返回NULL

2.11 DaysAfter 函數

獲取兩個日期間的天數

① 語法

DaysAfter ( date1, date2 )

② 引數

  • date1-->date型別,指定開始日期
  • date2-->date型別,指定截止日期

③ 返回

  • 返回值:Long
  • 成功時得到兩個日期之間的天數
  • 如果date2的日期在date1的前面,函數返回負值。
  • 如果任何引數的值為NULL,函數返回NULL

2.12 DayName 函數

獲取指定日期是一週中的星期幾(例如,Sunday, Monday...)

① 語法

DayName ( date )

② 引數

date--> date型別值或變數

③ 返回

  • 返回值:String
  • 成功時返回指定日期的星期表示(例如,Sunday, Monday...)
  • 如果date引數的值為NULL,函數返回NULL

2.13 DayNumber

獲取指定日期是一星期中的第幾天(用1到7之間的整數表示,星期天為1,星期一為2,...)。

① 語法

DayNumber ( date )

② 引數

date-->date型別值或變數

③ 返回

  • 返回值:Integer
  • 成功時返回指定日期是一星期中的第幾天(用1~7表示,星期天為1,星期一為2,...)
  • 如果date引數的值為NULL,函數返回NULL

三、組態檔讀取

組態檔xiezhr.ini 內容如下

[transaction]
DBMS =O84 Oracle8/8i (8.x.4+)
username =xiezhr
password =xiezhr
servername =127.0.0.1:1521/orcl

3.1 ProfileString函數

獲取組態檔中指定節點內容

① 語法

ProfileString(filename,nodename,default_value)

② 引數

  • filename--> 組態檔名稱
  • nodename--> 組態檔中的節點名稱
  • default_value--> 未找到指定的節或鍵,則返回的預設值

③ 返回

  • 返回值:string
  • 如果找到指定的節和鍵,則返回對應的值
  • 如果未找到指定的節或鍵,則返回預設值default_value

④ 舉個栗子

我們來獲取專案根目錄下xiezhr.in組態檔中的資料庫使用者名稱、密碼、連線資訊

ls_username = ProfileString("xiezhr.ini","transaction","username","scott")
ls_password = ProfileString("xiezhr.ini","transaction","password","tiger")
ls_servername = ProfileString("xiezhr.ini","transaction","servername","127.0.0.1:1521/orcl")

3.2 SetProfileString 函數

設定組態檔中指定節點內容

① 語法

SetProfileString(filename,nodename,sourcename,value)

② 引數

  • filename--> 組態檔名稱
  • nodename-->節點名稱
  • sourcename-->節點下目標位置名稱
  • value--> 需要設定的值

③ 返回

  • 返回值:Integer
  • 如果成功寫入值,則返回0
  • 如果寫入失敗,則返回-1

④ 舉個栗子

我們修改專案更目錄下xiezhr.ini組態檔內容,將username值設定成xiezhr

SetProfileString('xiezhr.ini','transaction','username',xiezhr')

四、陣列相關

string ls_arr[]

4.1 upperbound 函數

獲取陣列長度

① 語法

upperbound(array)

② 引數

array-->陣列名 ls_arr

③ 返回

  • 返回值:long
  • 成功返回:array陣列長度
  • 失敗返回:-1

4.2 lowerbound 函數

獲取指定陣列陣列的下界

① 語法

lowerbound(array)

② 引數

array-->陣列名 ls_arr

③ 返回

  • 返回值:long
  • 成功返回:array陣列長度
  • 失敗返回:-1

小技巧

怎麼將陣列置空?

string ls_arr[],ls_null[]
int i
for i=1 to 10
	ls_arr[i]=string(i)
next
messagebox('陣列長度',UpperBound(ls_arr))
ls_arr = ls_null 
messagebox('陣列長度',UpperBound(ls_arr))

五、資料型別轉換

5.1 String 函數

按照指定格式將資料轉換成字串

① 語法

String(data,{format})

② 引數

data--> 指定需要轉換的資料,據型別可以是DateDateTime、數值型別、Time

format--> 可選項,指定轉換的資料格式

資料格式說明如下

需要轉換的資料data 為數值

語法格式為:正數格式;負數格式;零的顯示格式

  • # 代表0~9之間的任意數位
  • 0 代表每個零都要顯示
  • $或¥ 代表貨幣符號
  • % 百分號
  • . 小數點
  • , 逗號

注意:除小數點(.)、逗號(,)能夠出現在格式字元#和0之間外,其它字元只能放置在格式串的前面或後面

如果顯示格式有多個部分,各部分之間的分號(;)不能省略

需要轉換的資料data 為字串

語法格式為:正常字串格式

  • @代表字串中的任意字元
  • @除外任何字元照原樣顯示

舉個栗子

string("0166767593",(@@)@@@@-@@@@)
//顯示為(01)6676-7593

需要轉換的資料data為日期

1)年份

  • yy兩位數位表示的年份(如92

  • yyyy四位數位表示的年份(如1992

    2)月份

  • m開頭不帶0的月份(如9

  • mm開頭帶0的月份(如09

  • mmm月份的英文縮寫(如Feb

  • mmmm月份的英文全稱(如February

    3)日

  • d開頭不帶0的日數(如9

  • dd開頭帶0的日數(如09

  • ddd星期的英文縮寫(如Mon

  • dddd星期的英文全稱(如Monday

  1. windows系統定義的格式
  • [General] Windows系統中定義的短日期格式
  • [LongDate] Windows系統中定義的長日期格式
  • [ShortDate] Windows系統中定義的短日期格式

需要轉換的資料data為時間

1) 小時

  • h開頭不帶0的小時(比如6)

  • hh開頭帶0的小時(比如06)

    2) 分鐘

  • h開頭不帶0的小時(比如6)

  • hh開頭帶0的小時(比如06)

    3) 秒

  • s開頭不帶0的秒(比如6)

  • ss開頭帶0的秒(比如06)

4)上午下午

  • AM/PM 顯示上、下午時間
  • am/pm顯示上、下午時間
  • A/P顯示上、下午時間
  • a/p顯示上、下午時間

5.2 Time 函數

把其他型別資料轉換成Time型別的值

① 語法

Ⅰ 將DateTime型別或第一個值是DateTime或Time的Blob值轉換成Time型別的值
Time ( datetime )
Ⅱ 將其值是個有效時間的字串轉換成Time型別的值
Time ( string )
Ⅲ 將表示時、分、秒、以及微秒的整陣列合成一個時間值
Time(hour, minute, second {, microsecond })  

② 引數

  • datetime --> DateTime型別的值或第一個值是DateTimeTimeBlob型別的值

  • string --> string型別,其值包括一個有效的以字串形式表示的時間(比如9am10:25

  • hour, minute, second {, microsecond }

③ 返回

datetime 轉換

  • 返回值:Time

  • 成功時返回相應的Time型別值

  • 如果datetime引數中的值不是有效時間或資料型別不相容,函數返回00:00:00.000000

  • 如果datetime引數的值為NULL,函數返回NULL

    Ⅱ 字串轉換

  • 返回值:Time

  • 成功時返回相應的Time型別值

  • string引數中的值不是有效格式時間,函數返回00:00:00.000000

  • 如果string引數的值為NULL,函數返回NULL

    Ⅲ 時分秒毫秒合成時間

  • 返回值:Time

  • 成功時返回由hour、minute、second、microsecond 四個引數確定的時間

  • 如果這四個引數中任何一個引數使用了無效值,函數返回NULL

5.3 Date 函數

將其它型別的資料轉換為Date型別的資料

① 語法

Ⅰ將DateTime型別或第一個值是DateTime或Date的Blob值轉換成Date型別的值
Date ( datetime )
Ⅱ 將有效日期的字串轉換成Date型別的值
Date ( string )
Ⅲ 將年、月、日合成一個日期
Date ( year, month, day )

② 引數

  • datetime --> DateTime型別的值或第一個值是DateTimeTimeBlob型別的值

  • string --> string型別,有效字串形式的日期(比如1992-09-23)

  • year, month, day

③ 返回

datetime 轉換日期

  • 返回值:Date
  • 成功時返回相應的Date型別值
  • 如果datetime引數中的值不是有效日期或資料型別不相容,函數返回1900-01-01
  • 如果datetime引數的值為NULL,函數返回NULL

Ⅱ 字串轉換日期

  • 返回值:Date
  • 函數執行成功時返回相應的Date型別值。
  • 如果string引數中的值不是有效日期或資料型別不相容,函數返回1900-01-01
  • 如果string引數的值為NULL,函數返回NULL

Ⅲ 年月日合成日期

  • 返回值:Date
  • 函數執行成功時返回由yearmonth、day三個引數確定的日期
  • 如果這三個引數中任何一個引數使用了無效值(比如月份指定為15),函數返回1900-01-01
  • 如果任何引數的值為NULL,函數返回NULL

5.4 DateTime 函數

將其它型別的資料轉換為DateTime型別的資料

① 語法

Ⅰ 把日期和時間值組合成DateTime型別的值
DateTime ( date {, time } )
Ⅱ 將Blob型別的值轉換成DateTime型別的值
DateTime ( blob )

② 引數

Ⅰ日期和時間值組合成DateTime型別的值

  • date-->Date型別的日期值
  • time-->可選引數,Time型別的時間值,省略時,時間預設是00:00:00.000000

Blob型別的值轉換成DateTime型別的值

  • blob -->Blob型別變數 把該變數第一個值轉換為DateTime型別的值 ,blob引數也可以是包含blob型別資料的Any型別變數

③ 返回

Ⅰ 日期和時間值組合成DateTime型別的值

  • 返回值:DateTime
  • 成功時返回日期和時間組合而成的DateTime型別的值
  • 如果任何引數的值為NULL,函數返回NULL

Ⅱ 將Blob型別的值轉換成DateTime型別的值

  • 返回值:DateTime
  • 成功時返回相應的DateTime型別值
  • 如果blob引數的值為NULL,函數返回NULL

5.5 Asc 函數

獲取字串第一個字元的ASCII碼整數值

① 語法

Asc ( string )

② 引數

string-->目標字串

③ 返回

  • 返回值:integer
  • 行成功時返回string引數第一個字元的ascii
  • 如果string引數的值為null,函數返回null

5.6 Char 函數

將字串的第一個字元、Blob變數的第一個值、或一個整數轉換成字元

① 語法

Char ( any )

② 引數

any-->字串、Blob變數或整數,也可以是包含上述型別資料的Any型別變數

③ 返回

  • 返回值:Char
  • 返回引數any的第一個字元
  • 如果any引數的值為NULL,函數返回NULL

5.7 Dec 函數

將字串或Blob值轉換成Decimal型別的值

① 語法

Dec ( strorblob )

② 引數

strorblob-->string型別變數或Blob型別變數

③ 返回

  • 返回值:Decimal
  • 成功時返回相應的Decimal型別值
  • 如果strorblob引數中的值不是有效數位或資料型別不相容,函數返回0
  • 如果strorblob引數的值為NULL,函數返回NULL

5.8 Double 函數

字串或Blob值轉換成Double型別的值

① 語法

Double(strorblob)

② 引數

strorblob-->string型別變數或Blob型別變數

③ 返回

  • 返回值:Double
  • 成功時返回相應的Double型別值
  • 如果strorblob引數中的值不是有效數位或資料型別不相容,函數返回0
  • 如果strorblob引數的值為NULL,函數返回NULL

5.9 Integer 函數

將字串或Blob值轉換成Integer型別的值

① 語法

Integer ( strorblob )

② 引數

strorblob-->string型別變數或Blob型別變數

③ 返回

  • 返回值:Integer
  • 成功時返回相應的Integer型別值
  • 如果strorblob引數中的值不是有效數位或資料型別不相容,函數返回0
  • 如果strorblob引數的值為NULL,函數返回NULL

5.10 Long 函數

將其它型別的資料轉換為Long型別的值

① 語法

Ⅰ 將兩個無符號整陣列合成一個長整數值
Long ( lowword, highword )
Ⅱ 字串或Blob值轉換成Long型別的值
Long ( strorblob )

② 引數

Ⅰ 將兩個無符號整陣列合成一個長整數值

  • lowword -->UnsignedInteger型別,指定長整數中的低位值
  • highword -->UnsignedInteger型別,指定長整數中的高位值

Ⅱ 字串或Blob值轉換成Long型別的值

strorblob-->string型別變數或Blob型別變數

③ 返回

Ⅰ 將兩個無符號整陣列合成一個長整數值

  • 返回值:Long
  • 成功時返回由低位值和高位值組合後的長整數值
  • 發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

Ⅱ 字串或Blob值轉換成Long型別的值

  • 返回值:Long
  • 成功時返回由低位值和高位值組合後的長整數值
  • 發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

5.11 Real 函數

將字串或Blob值轉換成Real型別的值

① 語法

Real ( strorblob )

② 引數

strorblob-->string型別變數或Blob型別變數

③ 返回

  • 返回值:Real
  • 成功時返回相應的Real型別值
  • 如果strorblob引數中的值不是有效數位或資料型別不相容,函數返回0
  • 如果stringorblob引數的值為NULL,函數返回NULL

5.12 IsDate 函數

判斷指定的字串是否包含有效的日期

① 語法

IsDate ( strvalue )

② 引數

strvalue-->string型別,指定要判斷的字串

③ 返回

  • 返回值:Boolean
  • 如果strvalue包含了有效的日期,函數返回TRUE,否則返回FALSE
  • 如果strvalue引數的值為NULL,函數返回NULL

5.13 IsNumber 函數

判斷字串是否是有效的數值

① 語法

IsNumber ( strvalue )

② 引數

strvalue-->string型別,指定要判斷的字串

③ 返回

  • 返回值:Boolean
  • 如果strvalue的值為有效數位,函數返回TRUE,否則返回FALSE
  • 如果strvalue引數的值為NULL,函數返回NULL

5.14 IsTime 函數

判斷字串的值是否是有效的時間

① 語法

IsTime ( strvalue )

② 引數

strvalue-->string型別,指定要判斷的字串

③ 返回

  • 返回值:Boolean
  • 如果strvalue的值為有效的時間,函數返回TRUE,否則返回FALSE
  • 如果strvalue引數的值為NULL,函數返回NULL

5.15 IsNull 函數

判斷值是否是NULL

① 語法

IsNull(any)

② 引數

any:任何變數或表示式

③ 返回

  • 返回值:Boolean
  • 如果any的值為NULL,函數返回TRUE,否則返回FALSE

5.16 IsValid 函數

判斷物件變數是否已經範例化

① 語法

IsValid ( objectname )

② 引數

objectname-->要檢測的物件名

③ 返回

  • 返回值:Boolean
  • 如果指定物件已經建立了物件範例,函數返回TRUE,否則返回FALSE
  • 如果引數objectname的值為NULL,函數返回NULL

5.17 SetNull 函數

將指定變數的值設定為NULL。這裡的變數可以是除陣列、結構、自動範例化物件之外的任何資料型別

① 語法

SetNull ( anyvariable )

② 引數

anyvariable-->要將其值設定為NULL的變數

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果引數的值為NULL,函數返回NULL

六、數值計算

6.1 Abs 函數

計算絕對值

① 語法

Abs ( n )

② 引數

n-->要求絕對值的數值型變數 或 返回值為數值的表示式

③ 返回

  • 成功時返回n的絕對值
  • 如果引數n的值為NULL,返回NULL

6.2 Ceiling 函數

返回大於n的最小整數

① 語法

Ceiling ( n )

② 引數

n-->數值型變數 或 返回值為數值的表示式

③ 返回

  • 成功時返回大於n的最小整數。
  • 如果引數n的值為NULL,函數返回NULL

6.3 Cos 函數

計算餘弦

① 語法

Cos ( n )

② 引數

n-->數值型變數 或 返回值為數值的表示式

③ 返回

  • 成功時返回n的餘弦
  • 如果引數n的值為NULL,返回NULL

6.4 Exp 函數

計算e的n次方

① 語法

Exp ( n )

② 引數

n-->指定冪值

③ 返回

  • 返回值:Double
  • 成功時返回e(約等於2.71828)的n次方。
  • 如果引數n的值為NULL,返回NULL

6.5 Fact 函數

計算n的階乘

① 語法

Fact ( n )

② 引數

n-->數值型變數 或 返回值為數值的表示式

③ 返回

  • 返回值:Double
  • 成功時返回n的階乘。
  • 如果引數n的值為NULL,返回NULL

6.6 Int 函數

得到小於等於n的最大整數

① 語法

Int ( n )

② 引數

n-->數值型變數 或 返回值為數值的表示式

③ 返回

  • 返回值:Integer
  • 成功時返回小於等於n的最大整數
  • 如果n的值太小或太大,超過了整數的表示範圍,則函數返回0。
  • 如果引數n的值為NULL,返回NULL

6.7 Log 函數

計算n的自然對數

① 語法

Log ( n )

② 引數

n-->數值型變數 或 返回值為數值的表示式值必須大於0

③ 返回

  • 返回值:Double
  • 成功時返回n的自然對數
  • 如果n小於等於0,將導致執行錯誤
  • 如果引數n的值為NULL,返回NULL

6.8 LogTen 函數

計算n的常用對數(以10為底)

① 語法

LogTen ( n )

② 引數

n-->數值型變數 或 返回值為數值的表示式值必須大於0

③ 返回

  • 返回值:Double
  • 成功時返回n的常用對數
  • 如果n小於等於0,將導致執行錯誤
  • 如果引數n的值為NULL,函數返回NULL

6.9 Max 函數

求兩個數中最大值

① 語法

Max ( x, y )

② 引數

  • x-->數值型變數或表示式,參加比較的第一個數
  • y -->數值型變數或表示式,參加比較的第二個數

③ 返回

  • 成功時返回引數比較的兩個數中更大者。
  • 如果任何引數的值為NULL,返回NULL

6.10 Min 函數

兩個數中的最小值

① 語法

Min( x, y )

② 引數

x-->數值型變數或表示式,參加比較的第一個數
y -->數值型變數或表示式,參加比較的第二個數

③ 返回

  • 成功時返回引數比較的兩個數中較小者
  • 如果任何引數的值為NULL,返回NULL

6.11 Mod 函數

求餘數

① 語法

Mod ( x, y )

② 引數

x-->數值型變數或表示式,被除數
y -->數值型變數或表示式,除數

③ 返回

  • 成功時返回x除以y所得的餘數
  • 如果任何引數的值為NULL,數返回NULL

6.12 Pi 函數

計算n與Pi(3.14159265358979323...)的乘積

① 語法

Pi ( n )

② 引數

n-->數值型變數或表示式

③ 返回

  • 返回值:Double
  • 函數執行成功時返回n與Pi(3.14159265358979323...)的乘積
  • 發生錯誤時返回-1
  • 如果引數n的值為NULL,返回NULL

6.13 Rand 函數

得到1與n之間的一個偽亂數

① 語法

Rand ( n )

② 引數

n:數值型變數或表示式 產生亂數的最大值 1到32,767之間

③ 返回

  • 成功時返回1與n之間的一個偽亂數,包括1和n在內
  • 如果引數n的值為NULL,函數返回NULL

6.14 Randomize 函數

初始化偽亂數發生器,這樣讓應用程式每次使用不同的偽亂數序列

① 語法

Randomize ( n )

② 引數

n-->數值型變數或表示式,指定偽亂數生成器使用的起始值,不同的起始值可以生成不同的偽亂數序列

注:n的值在0到32,767之間

③ 返回

  • 返回值:Integer
  • 當n的值為0時,該函數把系統時鐘作為偽亂數生成器的起始值,這樣可以生成不可重複的偽亂數序列
  • 當n的值不為0時,可以產生不同的偽亂數序列,但是,如果兩次使用相同的偽亂數生成器起始值,那麼兩
    次生成的偽亂數序列相同

6.15 Round 函數

將x四捨五入到n位

① 語法

Round ( x, n )

② 引數

  • x-->要四捨五入的數值型資料

  • n-->整數型別,指定從哪個小數位上四捨五入x。

    注:有效值在0到18之間

③ 返回

  • 返回值:Decimal
  • 成功時返回將x四捨五入到小數點後第n位的數值,
  • 如果函數執行失敗或任何引數的值為NULL,函數返回NULL

6.16 Sign 函數

確定n是整數、負數還是零

① 語法

Sign ( n )

② 引數

n-->數值型變數或表示式

③ 返回

  • 返回值Integer
  • 當n大於0時返回1
  • 當n小於0時返回-1
  • 當n等於0時返回0
  • 如果引數n的值為NULL,函數返回NULL

6.17 Sin 函數

計算正弦,其中引數以弧度為單位

① 語法

Sin( n )

② 引數

n-->數值型變數或表示式

③ 返回

  • 返回值:Double
  • 成功時返回n的正弦
  • 如果引數n的值為NULL,返回NULL

6.18 Sqrt 函數

計算平方根

① 語法

Sqrt ( n )

② 引數

n-->數值型變數或表示式 n的值大於0

③ 返回

  • 返回值:Double
  • 函數執行成功時返回n的平方根。
  • 如果n是負數,則執行該函數時引發執行錯誤。
  • 如果引數n的值為NULL,返回NULL

6.19 Tan 函數

計算正切,其中引數以弧度為單位

① 語法

Tan( n )  

② 引數

n-->數值型變數或表示式

③ 返回

  • 返回值:Double
  • 成功時返回n的正切值
  • 如果引數n的值為NULL,返回NULL

6.20 Truncate 函數

截斷數值到指定的小數位 , 所謂截斷就是捨棄指定位之後的數值

① 語法

Truncate ( x, n )

② 引數

  • x-->要截斷的數值型資料
  • n-->整數型別,指定從哪個小數位上截斷x

注:有效值在0到18之間

③ 返回

  • 返回值:Decimal
  • 成功時返回將x截斷到小數點後第n位的數值
  • 失敗或任何引數的值為NULL,返回NULL

七、定時相關

7.1 CPU 函數

到自當前應用程式啟動後開始CPU所消耗的時間,以毫秒為單位

① 語法

CPU()

② 引數

③ 返回

  • 返回值:Long
  • 返回自當前應用程式啟動後開始CPU所消耗的時間,以毫秒為單位

7.2 Timer 函數

在指定的時間間隔內反覆觸發指定視窗的定時器事件

① 語法

Timer ( interval {, windowname } )

② 引數

  • interval-->指定兩次觸發Timer事件之間的時間間隔,有效值在0到65之間
  • windowname-->視窗名,指定時間間隔到時要觸發哪個視窗的Timer事件。省略該引數時,觸發當前視窗的Timer事件

注:

引數的值指定為0,那麼關閉定時器,不再觸發指定視窗的Timer事件

7.3 Idle 函數

該函數在使用者每次活動(例如,按鍵盤、移動滑鼠等)後重置定時器,n秒後觸發應用物件的Idle事件

① 語法

Idle ( n )

② 引數

n-->指定空閒時間間隔,以秒為單位

引數的值設定為0時,停止空閒檢測,不再觸發應用物件的Idle事件

③ 返回

  • 返回值:Integer
  • 成功時返回1,此時啟動定時器
  • 如果不能啟動定時器或定時器未啟動而n的值指定為0時,函數返回-1
  • 如果任何引數的值為NULL,返回NULL

八、登入檔相關

8.1 RegistrySet 函數

在系統註冊庫中設定或建立指定鍵

① 語法

RegistrySet ( key, valuename, valuetype, value )

② 引數

  • key-->string型別,指定鍵名
  • valuename-->string型別,指定要存取值的名稱
    • 每個鍵可以有一個未命名的值和多個命名的值
    • 要存取未命名的值,把該引數指定為空字串("")
    • 如果註冊庫中不存在指定值名,該函數將建立新的值名
  • valuetype-->RegistryValueType列舉型別,指定值的資料型別。有效取值請參看用法
  • value-->要設定的值,其資料型別應該與valuetype引數指定的型別相匹配

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果valuevariable的資料型別與valuetype引數指定的型別不匹配,將引發執行錯誤

④ 舉個栗子

//利用登入檔修改ODBC設定資訊
RegistrySet( 'HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources','localdb',REGSTRING!,'Driver do Microsoft Access (*.mdb)')

8.2 RegistryGet 函數

從系統註冊庫中得到指定鍵的值

① 語法

RegistryGet ( key, valuename, valuetype, valuevariable )

② 引數

  • key-->string型別,指定鍵名
  • valuename-->string型別,指定要存取值的名稱。每個鍵可以有一個未命名的值和多個命名的值。要存取未
    命名的值,把該引數指定為空字串""
  • valuetype-->RegistryValueType列舉型別,指定值的資料型別。有效取值請參看用法
  • valuevariable-->用於儲存鍵值的變數,其資料型別應該與valuetype引數指定的型別相匹配

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果valuevariable的資料型別與valuetype引數指定的型別不匹配,將引發執行錯誤

④ 舉個栗子

//取得印表機驅動程式名稱	RegistryGet("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers\"+str_printername,"Printer Driver", RegString!,str_driver)

8.3 RegistryDelete 函數

刪除Windows系統註冊庫中的一個鍵或鍵的某個值

① 語法

RegistryDelete ( key, valuename )

② 引數

  • key-->string型別,指定鍵名,將刪除該鍵或刪除該鍵的某個值

  • valuename-->string型別,指定要刪除的值的名稱

    注:如果想刪除鍵、鍵的值、以及其下的所有子鍵,那麼將該引數指定為空字串

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1

④ 舉個栗子

event clicked;Registrydelete( "HKEY_LOCAL_MACHINE\Software\NEUHIS", "")

8.4 RegistryKeys 函數

從系統註冊庫中得到指定鍵的有效子鍵

① 語法

RegistryKeys ( key, subkeys )

② 引數

  • key-->string型別,指定鍵名
  • subkeys-->字串陣列變數,用於儲存各子鍵

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1

④ 舉個栗子

string str_printer[]  //定義一個字串型陣列
int_return = RegistryKeys("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers", str_printer)

8.5 RegistryValues 函數

得到與指定鍵相關的一組值名

① 語法

RegistryValues ( key, valuename )

② 引數

  • key-->string型別,指定鍵名
  • valuename-->字串陣列變數,用於儲存值名

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1

九 、檔案操作相關

9.1 FileOpen 函數

以指定的讀寫方式開啟指定的檔案,同時返回該檔案的控制程式碼

① 語法

FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,{creator,filetype}}}}})

② 引數

  • filename-->string型別,指定要開啟檔案的名稱,其中可以包含路徑

  • filemode-->FileMode列舉型別,可選項,指定檔案開啟方式

  • fileaccess-->FileAccess列舉型別,可選項,指定檔案存取方式。

  • filelock-->FileLock列舉型別,可選項,指定檔案加鎖方式

  • writemode-->WriteMode列舉型別,可選項

  • creator-->可選項,用於Macintosh機,使用四個字元的字串指定檔案的建立者。指定該引數後,必須同時
    指定filetype引數

  • filetype-->可選項,用於Macintosh機,使用四個字元的字串指定檔案型別

③ 返回

  • 返回值:Integer
  • 成功時返回開啟檔案的控制程式碼,隨後的檔案操作函數利用該控制程式碼完成對檔案的操作
  • 發生錯誤時函數返回-1
  • 如果任何引數的值為NULL,函數返回NULL

④ 舉個栗子

int li_file_no
string ls_getpath_data
ls_getpath_data = "F:\xiezhr.txt"
li_file_no = FileOpen(ls_getpath_data,LineMode!,Write!,Shared!,Append!)

9.2 FileWrite 函數

向指定檔案中寫資料

① 語法

FileWrite (fileno , variable )

② 引數

fileno-->integer型別,指定檔案控制程式碼(由FileOpen()函數得到)
variable-->stringblob型別,其值將寫入fileno引數指定的檔案

③ 返回

  • 返回值:Integer
  • 成功時返回寫入檔案的字元或位元組數,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

④ 舉個栗子

int li_file_no
string ls_getpath_data
string ls_writed
string ls_err
ls_writed = "個人公眾號:XiezhrSpace"

ls_getpath_data =  "F:\xiezhr.txt"
li_file_no = FileOpen(ls_getpath_data,LineMode!,Write!,Shared!,Append!)

if li_file_no = 0 then
   ls_err ="不能開啟檔案!" 
	FileClose(li_file_no)
	return -1
else
	if FileWrite(li_file_no, ls_writed) < 0 then		  		 
		  ls_err = "寫檔案出錯!"
		  FileClose(li_file_no)
		  return -1
	 end if
end if

9.3 FileRead 函數

從指定檔案中讀取資料

① 語法

FileRead ( fileno, variable )

② 引數

fileno-->integer型別,指定檔案控制程式碼(由FileOpen()函數得到)
variable-->stringblob型別的變數,用於儲存讀取的資料

③ 返回

  • 返回值:Integer
  • 成功時返回讀取的字元數或位元組數;
  • 如果在讀取任何字元前讀到了檔案結束符(EOF),函數返回-100
  • 當指定檔案以行模式開啟時,如果在讀取任何字元之前遇到了回車(CR)或換行(LF)字元,函數返回0
  • 如果發生其它錯誤,返回-1
  • 如果任何引數的值為NULL,函數返回NULL

④ 舉個栗子

將xiezhr.txt 檔案中的內容讀取出來放到變數ls_Input 中

int li_FileNum
string ls_path
string ls_Input
ls_path =  "F:\xiezhr.txt"
li_FileNum = FileOpen(ls_path, LineMode!)
FileRead(li_FileNum, ls_Input)

9.4 FileClose 函數

關閉先前用FileOpen()函數開啟的檔案

① 語法

FileClose ( fileno )

② 引數

fileno-->integer,指定要關閉檔案的檔案控制程式碼,該控制程式碼使用FileOpen()函數開啟檔案時得到

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果fileno引數的值為NULL,函數返回NULL

9.5 FileExists 函數

檢查指定的檔案是否存在

① 語法

FileExists ( filename )

② 引數

filename-->string型別,指定要檢查存在性的檔案的檔名,其中可以包含路徑

③ 返回

  • 返回值:Boolean
  • 如果指定檔案存在時返回TRUE,不存在時返回FALSE
  • 如果filename引數的值為NULL,函數返回NULL

9.6 FileDelete 函數

刪除指定的檔案

① 語法

FileDelete ( filename )

② 引數

filename-->string型別,指定要刪除檔案的檔名,其中可以包含路徑

③ 返回

  • 返回值:Boolean
  • 成功時返回TRUE,發生錯誤時返回FALSE
  • 如果filename引數的值為NULL,函數返回NULL

9.7 FileLength 函數

得到指定檔案的長度(以位元組為單位)

① 語法

FileLength ( filename )

② 引數

filename-->string型別,指定要得到其長度的檔案的檔名,其中可以包含路徑

③ 返回

  • 返回值:Long
  • 成功時返回指定檔案的長度(以位元組為單位)
  • 如果指定的檔案不存在,函數返回-1
  • 如果filename引數的值為NULL,函數返回NULL

9.8 FileSeek 函數

將檔案指標移動到指定位置。讀寫檔案時相應函數會自動移動檔案指標

① 語法

FileSeek ( fileno, position, origin )

② 引數

  • fileno-->integer型別,指定檔案控制程式碼(由FileOpen()函數得到)
  • position-->long型別,指定相對於origin引數指定位置的新位置偏移量,以位元組為單位
  • origin-->eekType列舉型別,指定從哪裡開始移動檔案指標,即指標移動的基準

9.9 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

9.10 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,函數返回NULL

十、列印相關

10.1 PrintOpen 函數

啟動列印作業並返回作業號

① 語法

PrintOpen ( { jobname } )

② 引數

jobname-->string型別,可選項,指定要開啟列印作業的名稱,該名稱將顯示在列印管理器視窗中

③ 返回

  • 返回值:Long
  • 成功時返回列印作業號,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

注:

  • 應用程式執行PrintOpen()函數後,啟動新的列印作業並走紙到下一頁,同時將印表機預設字型設定為該列印
    作業的字型
  • 列印遊標的位置位於列印區的左上角
  • 使用PrintOpen()函數開啟列印作業、使用同組的其它函數完成列印任務後,必須使用
    PrintClose()關閉列印作業,或根據需要使用PrintCancel()函數取消列印作業

10.2 PrintClose 函數

關閉列印作業並把列印頁面傳送到印表機上

① 語法

PrintClose ( printjobnumber )

② 引數

printjobnumber-->要關閉的列印作業的作業號

③ 返回

  • 返回值:Integer
  • 函數執行成功時返回1,發生錯誤時返回-1
  • 如果引數printjobnumber的值為NULL,函數返回NULL

注意:應用程式使用PrintOpen()函數啟動列印作業後,必須使用PrintClose()在完成列印任務後關閉列印作
業,或根據需要使用PrintCancel()函數取消列印作業

10.3 PrintCancel 函數

取消用PrintOpen()函數啟動的列印作業

① 語法

PrintCancel ( printjobnumber )

② 引數

printjobnumber-->要取消的列印作業的作業號

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1。
  • 如果引數printjobnumber的值為NULL,函數返回NULL

10.4 Print 函數

以當前字型在開啟的列印作業中列印一行或多行文字

① 語法

Print(printjobnumber,{tab1,}string{,tab2})

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • tab1-->Integer型別,可選項,指定文字開始列印的位置,在開始列印字串之前將列印遊標移動到該位置,
    從列印區的左邊界開始計算,以千分之一英寸為單位。
    如果列印遊標已經位於指定位置、或列印遊標已經超過了指定位置、或省略了該引數,那麼,Print()函數從
    列印遊標的當前位置開始列印
  • string-->string型別,指定要列印的字串。如果字串中包括回車換行字元(rn),那麼該字串將被
    分成多行輸出,但是,除第一行之外,其它行忽略tab1引數指定的起始列印位置
  • tab2-->Integer型別,可選項,指定字串列印結束後列印遊標移動到的位置,從列印區的左邊界開始計算,
    以千分之一英寸為單位。
    如果列印遊標已經超過了指定位置,那麼Print()函數忽略該引數,列印遊標位於已列印字串的尾部。如果
    省略了該引數,Print()函數把列印遊標移動到下一行的起始位置

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

④ 具體說明

  • 在列印作業中,PB使用列印遊標來跟蹤列印位置。列印遊標儲存了即將列印區域左上角的座標。
  • 使用Print()函數列印文字後,PowerBuilder自動更新列印遊標
  • PB使用行距來決定列印出的兩行文字之間的距離,行距與字元的高度成比例,預設的行距是字元
    高度的1.2倍
  • 使用PrintSetSpacing()函數可以改變行距
  • 當Print()函數在下一行列印輸出時,它把列印遊標的x座標設定為0、y座標增加當前行距指示的數值。
    由於每列印一行時Print()函數都自動調整列印遊標的y座標位置,因此,該函數會自動處理分頁,因此,應
    用程式沒有必要呼叫PrintPage()函數進行分頁

10.5 PrintBitmap 函數

在列印區域的指定位置列印點陣圖

① 語法

PrintBitmap ( printjobnumber, bitmap, x, y, width, height )

② 引數

printjobnumber-->用PrintOpen()函數開啟的列印作業號
bitmap-->string型別,指定要列印的點陣圖檔案的檔名
x-->integer型別,指定點陣圖起始列印位置的x座標,以千分之一英寸為單位
y-->integer型別,指定點陣圖起始列印位置的y座標,以千分之一英寸為單位
width-->integer型別,指定點陣圖的列印寬度,以千分之一英寸為單位。如果該引數的值指定為0,那麼按圖
像的原始寬度列印
height-->integer型別,指定點陣圖的列印高度,以千分之一英寸為單位。如果該引數的值指定為0,那麼按圖
像的原始高度列印

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.6 PrintDataWindow 函數

列印資料視窗控制元件的內容,用該函數可以在一個列印作業中列印多個資料視窗控制元件的內容,每個都從新的一頁開始列印

① 語法

PrintDataWindow ( printjobnumber, dwcontrol )

② 引數

printjobnumber-->用PrintOpen()函數開啟的列印作業號
dwcontrol-->要列印其內容的資料視窗控制元件名或子資料視窗控制元件名

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果引數printjobnumber的值為NULL,函數返回NULL

10.7 PrintDefineFont 函數

定義列印作業使用的字型,對每個列印作業PB支援八種字型。

① 語法

PrintDefineFont(printjobnumber,fontnumber,facename,height,weight,fontpitch,fontf
amily, italic,underline)

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號

  • fontnumber-->指定賦給當前定義字型的編號,有效值在1到8之間

  • facename-->string型別,指定字型名稱,該字型應該是你的印表機支援的字型,比如「宋體」

  • height-->Integer型別,使用正值指定字型的高度,以千分之一英寸為單位;使用負值指定字型點數,比
    如,-18代表18點。一般來說,使用點數更精確些

  • weight:指定字型的磅數,正常字型為400磅,粗體為700磅

  • fontpitchFontPitch列舉型別,指定字型標準

  • fontfamily:FontFamily列舉型別,指定字型系列

  • italicboolean型別,指定是否使用斜體樣式。有效取值為:

underline-->boolean型別,指定是否加下劃線。

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.8 PrintLine 函數

在當前列印頁上繪出指定厚度的一條線

① 語法

PrintLine ( printjobnumber, x1, y1, x2, y2, thickness )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • x1-->integer型別,指定直線起點的x座標,以千分之一英寸為單位
  • y1-->integer型別,指定直線起點的y座標,以千分之一英寸為單位
  • x2-->integer型別,指定直線終點的x座標,以千分之一英寸為單位
  • y2-->integer型別,指定直線終點的y座標,以千分之一英寸為單位
  • thickness-->integer型別,指定直線的厚度,以千分之一英寸為單位

③ 返回

  • 返回值:Integer。
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.9 PrintOval 函數

在指定位置以指定線寬繪製橢圓或圓

① 語法

PrintOval ( printjobnumber, x, y, width, height, thickness )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • x1-->integer型別,指定直線起點的x座標,以千分之一英寸為單位
  • y1-->integer型別,指定直線起點的y座標,以千分之一英寸為單位
  • x2-->integer型別,指定直線終點的x座標,以千分之一英寸為單位
  • y2-->integer型別,指定直線終點的y座標,以千分之一英寸為單位
  • thickness-->integer型別,指定直線的厚度,以千分之一英寸為單位

③ 返回

  • 返回值:Integer。
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.10 PrintPage 函數

將當前頁傳送給印表機或列印池並在當前列印作業中啟動一個新的列印頁

① 語法

PrintPage ( printjobnumber )

② 引數

printjobnumber-->用PrintOpen()函數開啟的列印作業號

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.11 PrintRect 函數

在指定位置以指定線寬列印矩形

① 語法

PrintRect ( printjobnumber, x, y, width, height, thickness )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • x1-->integer型別,指定直線起點的x座標,以千分之一英寸為單位
  • y1-->integer型別,指定直線起點的y座標,以千分之一英寸為單位
  • x2-->integer型別,指定直線終點的x座標,以千分之一英寸為單位
  • y2-->integer型別,指定直線終點的y座標,以千分之一英寸為單位
  • thickness-->integer型別,指定直線的厚度,以千分之一英寸為單位

③ 返回

  • 返回值:Integer。
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.12 PrintRoundRect 函數

在指定位置以指定線寬列印圓角矩形

① 語法

PrintRoundRect(printjobnumber,x,y,width,height,xradius,yradius,thickness)

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • x-->integer型別,指定圓角矩形左上角的x座標,以千分之一英寸為單位
  • y-->integer型別,指定圓角矩形左上角的y座標,以千分之一英寸為單位
  • width-->integer型別,指定圓角矩形的寬度,以千分之一英寸為單位
  • height-->integer型別,指定圓角矩形的高度,以千分之一英寸為單位
  • xradius-->integer型別,指定圓角矩形圓角部分的x半徑,以千分之一英寸為單位
  • yradius-->integer型別,指定圓角矩形圓角部分的y半徑,以千分之一英寸為單位
  • thickness-->integer型別,指定圓角矩形邊線的厚度,以千分之一英寸為單位

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.13 PrintScreen 函數

在列印作業中列印螢幕影象

① 語法

PrintScreen ( printjobnumber, x, y {, width, height } )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • x-->integer型別,指定要列印螢幕影象左上角在列印頁上的x座標,以千分之一英寸為單位
  • y-->integer型別,指定要列印螢幕影象左上角在列印頁上的y座標,以千分之一英寸為單位
  • width-->integer型別,可選項,指定螢幕影象的列印寬度,以千分之一英寸為單位。如果省略了該引數,那
    麼PB按螢幕的原始寬度列印螢幕影象。如果指定了該引數,必須同時指定height引數
  • height-->integer型別,可選項,指定螢幕影象的列印高度,以千分之一英寸為單位。如果省略了該引數,
    那麼PB按螢幕的原始高度列印螢幕影象

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.14 PrintSend 函數

直接向印表機傳送任意字串,通常用於傳送印表機的控制程式碼

① 語法

PrintSend ( printjobnumber, string {, zerochar } )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • string-->string型別,指定傳送到印表機的字串。在該字串中,使用非列印字元的ASCII碼值表示非打
    印字元
  • zerochar-->integer型別,可選項,指定在string引數中用於表示數值0的ASCII碼值。有效取值在1到255
    之間

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.15 PrintSetFont 函數

設定當前列印作業使用的字型

① 語法

PrintSetFont ( printjobnumber, fontnumber )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • fontnumber-->指定該列印作業使用字型的字型編號,該編號與PrintDefineFont()函數中定義的編號應該
    對應,字型編號的有效取值在1到8之間,0表示使用印表機的預設字型

③ 返回

  • 返回值:Integer
  • 成功時返回當前字型的高度,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.16 PrintSetSpacing 函數

設定行間距因子,列印函數將使用該因子來決定行間距

① 語法

PrintSetSpacing ( printjobnumber, spacingfactor )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • spacingfactor-->指定行間距因子,用字元高度的倍數表示,預設值為1.2

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1。
  • 如果任何引數的值為NULL,函數返回NULL

10.17 PrintSetup 函數

開啟印表機設定對話方塊

① 語法

PrintSetup ( )

② 引數

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.18 PrintText

在指定位置列印一行文字

① 語法

PrintText ( printjobnumber, string, x, y {, fontnumber } )

② 引數

  • printjobnumber-->PrintOpen()函數開啟的列印作業號
  • string-->string型別,指定要列印的文字
  • x-->integer型別,指定文字開始列印位置的x座標,以千分之一英寸為單位
  • y-->integer型別,指定文字開始列印位置的y座標,以千分之一英寸為單位
  • fontnumber-->可選引數,指定列印文字使用的字型號,該編號由PrintDefineFont()函數確定。省略該參
    數時,以列印作業的當前字型列印文字

③ 返回

  • 返回值:Integer
  • 成功時返回文字列印後列印遊標的x位置,即引數x的值加上列印文字的寬度
  • 發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

10.19 PrintWidth

確定一個字串在指定列印作業中按當前字型所佔的寬度,以千分之一英寸為單位

① 語法

PrintWidth ( printjobnumber, string )

② 引數

  • printjobnumber-->用PrintOpen()函數開啟的列印作業號
  • string-->string型別,指定要決定其列印寬度的字串

③ 返回

  • 返回值:Integer
  • 成功時返回按當前字型計算的字串列印寬度,以千分之一英寸為單位,發生錯誤時返回-1。
  • 如果任何引數的值為NULL,函數返回NULL

10.20 PrintX 函數

返回列印遊標的x座標位置

① 語法

PrintX ( printjobnumber )

② 引數

printjobnumber-->用PrintOpen()函數開啟的列印作業號

③ 返回

  • 返回值:Integer
  • 成功時返回列印遊標的x座標位置,以千分之一英寸為單位,發生錯誤時返回-1。
  • 如果任何引數的值為NULL,函數返回NULL

10.21 PrintY 函數

返回列印遊標的y座標位置

① 語法

PrintY ( printjobnumber )

② 引數

printjobnumber-->用PrintOpen()函數開啟的列印作業號

③ 返回

  • 返回值:Integer
  • 成功時返回列印遊標的y座標位置,以千分之一英寸為單位,發生錯誤時返回-1。
  • 如果任何引數的值為NULL,函數返回NULL

十一、系統與環境相關

11.1 Yield 函數

功能將控制權轉移給其它圖形物件,包括非PB物件。該函數檢測訊息佇列,如果有訊息,就把消
息取出。利用該函數可以在執行耗時較長的操作時把控制權轉讓給其它應用。

① 語法

Yield()

② 引數

③ 返回

  • 返回值:Boolean
  • 如果在訊息佇列中提取到了訊息,那麼函數返回TRUE,否則返回FALSE

④ 使用說明

正常情況下,PowerBuilder應用程式在執行一段程式碼(比如函數或事件處理程式)的過程中不響應使用者的操
作。
對耗時短暫的程式碼段來說,這種處理方式沒有什麼不妥的地方
但是,如果某個程式碼段的執行耗時較長,應用程式又希望為使用者提供更多的控制權,那麼需要在這段程式碼中插
入Yield()函數,讓使用者能夠進行其它操作,特別在迴圈執行的程式碼中更應該如此。
應用程式執行Yield()函數後,如果發現訊息佇列中存在訊息,它將允許物件處理這些訊息,處理之後,繼續
Yield()函數後面程式碼的執行。
因此,程式碼中插入Yield()函數將降低應用程式的執行效率

11.2 Clipboard 函數

提取或替換Windows系統剪貼簿的文字內容。

① 語法

Clipboard ( { string } )

② 引數

string-->string型別,可選項,指定要複製到系統剪貼簿上的文字。
如果剪貼簿上已有內容的話,該文字將取代剪貼簿的當前內容

③ 返回

  • 返回值:String
  • 行成功時,如果剪貼簿上包含文字資料,那麼函數返回剪貼簿的當前內容
  • 如果剪貼簿上包含非文字資料(比如點陣圖)或不包含任何資料,那麼函數返回空字串""
  • 如果string引數的值為NULL,返回NULL
  • 用法無論是否指定string引數,將返回剪貼簿的當前內容
  • 當指定string引數時,剪貼簿的原有內容被string引數的值取代;
  • 省略string引數時,僅僅得到剪貼簿的內容

11.3 CommandParm 函數

得到應用程式執行時指定的命令引數

① 語法

CommandParm()

② 引數

③ 返回

  • 返回值:String
  • 成功時返回應用程式執行時的命令列引數,
  • 函數執行錯誤或沒有命令列引數時函數返回空字串""

11.4 DoScript 函數

執行AppleScript程式段,該函數只在Macintosh平臺上有效

① 語法

DoScript ( script, result )

② 引數

  • script-->string型別,指定要執行的程式段(script)
  • result-->string型別,由AppleScript程式段返回的結果資訊或出錯資訊

③ 返回

  • 返回值:Integer
  • 返回由AppleScript返回的結果程式碼。
  • 如果任何引數的值為NULL,函數返回NULL

11.5 GetApplication 函數

得到當前應用物件的控制程式碼,這樣你可以查詢或設定應用物件的屬性(通常用於編寫通用程式碼)

① 語法

GetApplication ( )

② 引數

③ 返回

  • 返回值:Application
  • 返回當前應用物件的控制程式碼

11.6 GetEnvironment 函數

得到作業系統、處理器、螢幕顯示等與系統相關的資訊

① 語法

GetEnvironment ( environmentinfo )

② 引數

environmentinfo-->Environment物件名,用於儲存系統環境資訊

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果引數environmentinfo的值為NULL,函數返回NULL

11.7 GetFocus 函數

確定當前焦點位於哪個控制元件上

① 語法

GetFocus ( )

② 引數

③ 返回

  • 返回值:GraphicObject
  • 成功時返回當前得到焦點控制元件的參照,發生錯誤時返回無效參照

11.8 Post 函數

將指定訊息加入到某個視窗的訊息佇列中,這個視窗既可以是PowerBuilder應用的視窗,也可以是其它應用
的視窗

① 語法

Post( handle, messageno, word, long )  

② 引數

  • handle-->long型別,指定視窗的系統控制程式碼,將向該視窗郵寄訊息
  • messageno-->UnsignedInteger型別,指定要郵寄的訊息號
  • word-->long型別,指定與訊息一起郵寄的word類引數值。如果messageno引數指定的訊息不使用該引數,那
    麼將這個引數的值設定為0
  • long-->long型別或string,指定與訊息一起郵寄的long型引數值或字串

③ 返回

  • 返回值:Boolean
  • 如果任何引數的值為NULL,函數返回NULL

11.9 Restart 函數

停止所有程式段的執行、關閉所有視窗、提交事務、斷開與資料庫的連線,然後重新啟動應用程式

① 語法

Restart()

② 引數

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1

11.10 Run 函數

執行指定的應用程式

① 語法

Run ( string {, windowstate } )

② 引數

  • string-->string型別,指定要執行的應用程式的名稱,其中可以包括路徑以及相應的引數,就像在命令列中
    鍵入的那樣
  • windowstate-->WindowState列舉型別,可選項,指定程式執行時的視窗狀態

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1
  • 如果任何引數的值為NULL,返回NULL

④ 使用說明

  • 用Run()函數,應用程式能夠啟動作業系統中的任何程式。
  • 當在Run()引數中指定了要啟動應用程式的引數時,引數的意義、格式、個數等由具體的應用程式確定。
  • 如果在Run()函數的string引數中指定了檔名但沒有給出擴充套件名時,PowerBuilder認為該檔案的擴充套件名
    為.EXE。
  • 要執行擴充套件名不是.EXE的應用程式(比如.BAT, .COM, 或.PIF),必須在Run()函數的引數中指定檔案的
    擴充套件名

11.11 Send 函數

向視窗傳送指定的訊息並立即執行相應的事件處理程式

① 語法

Send( handle, messageno, word, long )

② 引數

  • handlelong型別,指定視窗的系統控制程式碼,將向該視窗傳送訊息
  • messagenoUnsignedInteger型別,指定要傳送的訊息號
  • wordlong型別,指定與訊息一起傳送的word類引數值。如果messageno引數指定的訊息不使用該引數,那
    麼將這個引數的值設定為0
  • longlong型別或string,指定與訊息一起傳送的long型引數值或字串

③ 返回

  • 返回值:Long
  • 成功時返回Windows系統呼叫SendMessage()的返回值,發生錯誤時返回-1
  • 如果任何引數的值為NULL,函數返回NULL

④ 使用說明

Send()函數用於向視窗傳送非PB預定義事件的訊息,這個視窗可以是PB應用的視窗,也可以是其它應用的視窗

Send()函數直接觸發指定視窗相應的事件,執行事件處理程式後返回到呼叫應用中,這一點與Post()函數不
同,Post()函數把傳送的訊息放置在指定視窗訊息佇列的尾部,然後返回到應用程式中,它並不等待相應事件
事件處理程式的執行。

因此,我們說Post()函數採用的是非同步方式,Send()函數採用的是同步方式。
Send()函數的引數handle指定接收訊息的視窗控制程式碼,對PowerBuilder視窗來說,使用Handle()函數可以得到該控制程式碼。

對其它應用程式的視窗來說,可以呼叫系統API函數查詢視窗並得到相應視窗的控制程式碼。

實際上,Send()函數把它的各個引數直接傳送給Windows的系統呼叫SendMessage()。

在各種C++開發工具的WINDOWS.H檔案中可以查到各訊息編號。

如果應用程式要傳送PowerBuilder定義事件(包括預定義事件和使用者定義事件),那麼使用TriggerEvent()函數既簡單有方便。

當應用程式在long引數位置指定一個字串時,Send()函數複製一個該字串的副本,然後將副本的地址傳
送給指定視窗

11.12 ShowHelp 函數

顯示應用程式幫助,該幫助使用Microsoft Windows幫助系統進行操作

① 語法

ShowHelp ( helpfile, helpcommand {, typeid } )

② 引數

  • helpfile-->string型別,指定幫助檔案的名稱
  • helpcommand-->HelpCommand列舉型別,指定顯示幫助的格式
  • typeid引數

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1。
  • 如果任何引數的值為NULL,函數返回NULL

11.13 SignalError 函數

觸發應用物件的SystemError事件,通常用於程式碼偵錯

① 語法

SignalError ( { number }, { text } )

② 引數

  • number-->integer型別,可選項,其值將儲存到Error物件的number屬性中
  • text-->string型別,可選項,其值將儲存到Error物件的text屬性中

③ 返回

  • 返回值:Integer
  • 成功時返回1,發生錯誤時返回-1

十二、通用功能函數封裝

12.1 根據SQL建立DataStore

①定義函數

/*
\>====================================================================
\> function:gf_createDataStore
\>--------------------------------------------------------------------
\> 描述: 根據SQL建立DataStore
\>--------------------------------------------------------------------
\> 引數:
\> String 型別  sql語句
\>--------------------------------------------------------------------
\> 返回: 
\>  DataStore型別 (函數執行成功返回DataStore)
\>  Integer 型別  (函數執行成功資料的總行數)
\>  String 型別  (函數執行失敗時返回錯誤資訊)
\>====================================================================
*/
String ls_DwSyntax     //建立資料儲存的語法
String ls_Errors       //錯誤資訊
String ls_FunName      //函數名稱

ls_FunName = '~r~nCreateDataStore()-'	 

//建立資料儲存語法
ls_DwSyntax = SQLCA.SyntaxFromSQL(as_SqlSelect, 'Style(Type=Grid)',ls_Errors)
If Len(ls_Errors) > 0 Then
	as_ErrInfo = ls_FunName + '不能返回資料窗語法,錯誤資訊:'   + ls_Errors
	Return -1
End If

ads_DataStore.Create(ls_DwSyntax,ls_Errors)
If Len(ls_Errors) > 0 Then
	as_ErrInfo = ls_FunName + '不能建立資料儲存物件,錯誤資訊:' + ls_Errors
	Return -1
End If

//檢索資料
ads_DataStore.SetTransObject(SQLCA)
ai_RowCount = ads_DataStore.Retrieve()

If ai_RowCount < 0 Then
	as_ErrInfo = ls_FunName + '資料儲存檢索錯誤!'
	Return -1
End If

as_ErrInfo = ''
Return 1

② 呼叫函數

int li_count
string ls_sql
string ls_err
DataStore lds_Info

ls_sql = "select empno, ename, job, mgr, hiredate, sal, comm, deptno from emp where empno = '7369' "
lds_Info = Create DataStore
If gf_createDataStore(lds_RecipeInfo,ls_sql,li_count,ls_err) = -1 Then
	goto Err
End If
return
Err:
messagebox('提示資訊',ls_err)

12.2 獲取exe名稱

① 參照動態庫,定義外部函數

FUNCTION ulong GetModuleFileName(ulong hModule,ref string lpFileName,ulong
nSize) LIBRARY "kernel32.dll" ALIAS FOR "GetModuleFileNameA"

② 定義函數

/*
\>====================================================================
\> function:gf_file_getexe
\>--------------------------------------------------------------------
\> 描述: 獲取exe名稱
\>--------------------------------------------------------------------
\> 引數:
\> showexesuffix:integer型別 (0、不顯示exe字尾,1、顯示exe字尾)
\>--------------------------------------------------------------------
\> 返回: string型別 (函數執行成功返回exe的名稱)
\>====================================================================
*/
string str_temp,separator
string str_list[]
integer i = 1,ll_pos,ll_max
string ls_fileName
GetModuleFileName(handle(this),ls_fileName,100)
separator = '\'
ll_pos = pos(ls_fileName,separator,1)
do
	if ll_pos = 0 then
		str_list[i] = ls_fileName
	else
		str_list[i] = left(ls_fileName,ll_pos - 1)
		i ++
		ls_fileName = mid(ls_fileName,ll_pos + len(separator))
		ll_pos = pos(ls_fileName,separator,1)
		if ll_pos = 0 then str_list[i] = ls_fileName
	end if
loop while ll_pos <> 0
	ll_max = upperbound(str_list)
	if showexesuffix = 1 then
		return mid(str_list[ll_max],1,pos(str_list[ll_max],'.') - 1)
	else
		return str_list[ll_max]
	end if

③ 呼叫函數

string ls_exe
ls_exe = gf_get_exe(0) //不顯示exe字尾
ls_exe = gf_get_exe(1) //顯示exe字尾

12.3 檔案寫入

① 定義函數

/*
\>==================================================================
\> Function: gf_file_write
\>--------------------------------------------------------------------
\> 描述: 檔案寫入
\>--------------------------------------------------------------------
\> 引數:
\> string fileway (開啟檔案的方式)
\> string filepath (要寫入的檔案路徑和檔名稱)
\> string filecontent (要寫入的內容)
\>--------------------------------------------------------------------
\> 返回: integer (0:成功,-1:失敗。)
====================================================================
*/
long ll_file,ll_FLength,ll_i,ll_count
string ls_content
choose case fileway
	case 'w'
		//流模式、寫入、所有使用者均可讀寫該檔案、覆蓋
		ll_file = fileopen(filepath,streamMode!,Write!,Shared!,Replace!)
	case 'w+'
		//流模式、寫入、所有使用者均可讀寫該檔案、追加
		ll_file = fileopen(filepath,streamMode!,Write!,Shared!,append!)
	case 'wl'
		//行模式、寫入、所有使用者均可讀寫該檔案、覆蓋
		ll_file = fileopen(filepath,LineMode!,Write!,Shared!,Replace!)
	case 'wl+'
		//行模式、寫入、所有使用者均可讀寫該檔案、追加
		ll_file = fileopen(filepath,LineMode!,Write!,Shared!,append!)
	case else
		messagebox('提示','gf_file_write:傳入的引數錯誤!')
		return - 1
end choose
IF ll_file > 0 THEN
    ll_FLength = len(filecontent)
	if ll_FLength > 32765 then
		if mod(ll_FLength,32765) = 0 then
			ll_count = ll_FLength / 32765
		else
			ll_count = ll_FLength / 32765 + 1
		end if
	else
		ll_count = 1
	end if
	for ll_i = 1 to ll_count
		ls_content = left(filecontent,32765)
		FileWrite(ll_file,ls_content)
		filecontent = right(filecontent,len(filecontent) - 32765)
	next
	FileClose(ll_file)
else
	messagebox('提示','gf_file_write:檔案開啟失敗!')
	return - 1
end if
return 0
    

② 呼叫函數

gf_file_write('w',getcurrentdirectory() + '\1.txt','流模式覆蓋')
gf_file_write('w+',getcurrentdirectory() + '\1.txt','流模式追加')
gf_file_write('wl',getcurrentdirectory() + '\1.txt','行模式覆蓋')
gf_file_write('wl+',getcurrentdirectory() + '\1.txt','行模式追加')

12.4 檔案讀取

① 函數定義

/*
\>====================================================================
\> Function: gf_file_read
\>--------------------------------------------------------------------
\> 描述: 檔案讀取
\>--------------------------------------------------------------------
\> 引數:
\> string fileway (開啟檔案的方式)
\> string filepath (要讀取的檔案路徑和檔名稱)
\> ref string filecontent[] (要返回的內容)
\>--------------------------------------------------------------------
\> 返回: integer (0:成功,-1:失敗。)
\>====================================================================
*/

long ll_file,ll_FLength,ll_i,ll_j,ll_count
string ls_content
choose case fileway
	case 'r'
		//流模式、讀取、所有使用者均可讀寫該檔案
		ll_file = fileopen(filepath,streamMode!,Read!,Shared!)
		IF ll_file > 0 THEN
			ll_FLength = len(filepath)
			if ll_FLength > 32765 then
            	if mod(ll_FLength,32765) = 0 then
					ll_count = ll_FLength / 32765
				else
					ll_count = ll_FLength / 32765 + 1
				end if
			else
				ll_count = 1
			end if
			for ll_i = 1 to ll_count
				FileRead(ll_file,ls_content)
				filecontent[1] += ls_content
			next
		else
			messagebox('提示','gf_file_read:檔案開啟失敗!')
			return - 1
		end if
    case 'rl'
		//行模式、讀取、所有使用者均可讀寫該檔案
		ll_file = fileopen(filepath,LineMode!,Read!,Shared!)
		IF ll_file > 0 THEN
			ll_j = 1
			ll_i = FileRead(ll_file,filecontent[ll_j])
			do until string(ll_i) = '-100'
				ll_j = ll_j + 1
				ll_i = FileRead(ll_file,filecontent[ll_j])
			loop
				FileClose(ll_file)
		else
			messagebox('提示','gf_file_read:檔案開啟失敗!')
			return - 1
		end if
case else
	messagebox('提示','gf_file_read:傳入的引數錯誤')
	return - 1
end choose
return 0

② 呼叫函數

(1)、以流模式讀取檔案
string ls_data[]
gf_file_read('r',getcurrentdirectory() + '\1.txt',ls_data[] )
messagebox('流模式返回值',ls_data[1])
(2)、以行模式讀取檔案
string ls_data[]
gf_file_read('rl',getcurrentdirectory() + '\1.txt',ls_data[] )
messagebox('行模式返回值',ls_data[1])
messagebox('行模式返回值',ls_data[2])
messagebox('行模式返回值',ls_data[3])

12.5 字串切割

① 定義函數

/*
\>====================================================================
\> function: gf_string_cut.
\>--------------------------------------------------------------------
\> 描述: 字串切割
\>--------------------------------------------------------------------
\> 引數:
\> way:string (可選引數:array:將字串分割並返回一個陣列。string:將字串分割並返回一個
字串)
\> data:string (要進行分割的字串資料)
\> conditions:string (字串分割的條件)
\> value[] (字串分割後的值)
\>--------------------------------------------------------------------
\> 返回: integer (0:成功,-1:失敗。)
\>====================================================================
*/
    
long ll_empty_pos,i = 1
string ls_value_string,ls_value_array[]
choose case way
	case 'array'
		ll_empty_pos = pos(data,conditions)
		if ll_empty_pos > 0 then
			do
				ls_value_array[i] = trim(mid(data,1,ll_empty_pos - 1))
				data = trim(mid(data,ll_empty_pos + 1))
				ll_empty_pos = pos(data,conditions)
				i++
				if ll_empty_pos = 0 then
					ls_value_array[i] = trim(mid(data,0))
				end if
			loop while ll_empty_pos > 0
				value[] = ls_value_array[]
		else
			messagebox('提示','gf_string_cut傳入的字串未找到!')
			return - 1
		end if
	case 'string'
		ll_empty_pos = pos(data,conditions)
		if ll_empty_pos > 0 then
			do
				ls_value_string += trim(mid(data,1,ll_empty_pos - 1))
				data = trim(mid(data,ll_empty_pos + 1))
				ll_empty_pos = pos(data,conditions)
				if ll_empty_pos = 0 then
					ls_value_string += trim(mid(data,0))
				end if
			loop while ll_empty_pos > 0
			value[1] = ls_value_string
		else
			messagebox('提示','gf_string_cut傳入的字串未找到!')
			return - 1
		end if
case else
	 messagebox('提示','gf_string_cut傳入的引數錯誤!')
	return - 1
end choose
return 0

② 呼叫函數

string ls_data,ls_value[]
ls_data = '123,456,789'
//1、切割字串,並返回切割後的字串
gf_string_cut('string',ls_data,',',ls_value[])
messagebox('',ls_value[1]) //123456789
//2、切割字串,並返回陣列
gf_string_cut('array',ls_data,',',ls_value[])
messagebox('',ls_value[1]) //123
messagebox('',ls_value[2]) //456
messagebox('',ls_value[3]) //789

12.6 字串替換

① 定義函數

/*
\>====================================================================
\> function:gf_string_replace
\>--------------------------------------------------------------------
\> 描述: 字串替換
\>--------------------------------------------------------------------
// 引數:
// string data 字串資料
// string as_old 將要替換的字元
// string as_new 要替換的新值
\>--------------------------------------------------------------------
\> 返回: string 替換後的字元
\>====================================================================
*/
long ll_oldlen, ll_newlen, ll_pos
ll_pos = Pos(data,as_old)
IF ll_pos > 0 Then
	ll_oldlen = Len(as_old)
	ll_newlen = Len(as_new)
	DO WHILE ll_pos > 0
		data = Replace(data,ll_pos,ll_oldlen,as_new)
		ll_pos = Pos(data,as_old,ll_pos + ll_newlen)
	LOOP
END IF
RETURN data

② 呼叫函數

string ls_data
ls_data = gf_string_replace('1234561','1','6')
messagebox('返回值',ls_data) //6234566

12.7 大檔案寫入(二進位制資料流)

① 函數定義

/*
\>====================================================================
\> function: gf_adodb_blob_write.
\>--------------------------------------------------------------------
\> 描述:大檔案寫入(二進位制資料流)
\>--------------------------------------------------------------------
\> 引數:
\> string filepath (要寫入的檔案路徑和檔名稱)
\> blob filecontent (要寫入的二進位制資料檔案內容)
\>--------------------------------------------------------------------
\> 返回:integer (0:成功,-1:失敗。)
\>====================================================================
*/
long li_rtn,ll_file
string ls_data
OLEObject ADODB
ADODB = CREATE OLEObject
li_rtn = ADODB.ConnectToNewObject("ADODB.Stream")
if li_rtn = 0 then
    ADODB.Type = 1 //設定ADODB型別(1、二進位制資料,2、文字資料)
    ADODB.Mode = 3 //設定讀寫模式(1、讀,2、寫,3、讀寫)
    ADODB.open() //開啟ADODB
    ADODB.Position = 0 //Position=0才能設定Charset
    ADODB.Write(filecontent) //Write 和 WriteText 方法向 Stream 中輸入位元組或文字。
    ADODB.savetofile(filepath,2) //savetofile(1、只寫入1次。2、可覆蓋寫入多次)
    ADODB.flush() //清空緩衝區資料
    ADODB.Close() //關閉流
    destroy ADODB
else
	messagebox('提示', '無法連線【ADODB.Stream】!~r~n讀取檔案失敗!')
	return - 1
end if
return 0

② 呼叫函數

gf_adodb_blob_write(getcurrentdirectory()+'\a.txt',blob('123'))

12.8 大檔案讀取(二進位制資料流)

① 函數定義

/*
\>====================================================================
\> function: gf_adodb_blob_read.
\>--------------------------------------------------------------------
\> 描述: 大檔案讀取(二進位制資料流)
\>--------------------------------------------------------------------
\> 引數:
\> string filepath (要讀取的檔案路徑和檔名稱)
\>--------------------------------------------------------------------
\> 返回: blob (從檔案中讀取到的blob資料)
\>====================================================================
*/
long li_rtn
blob lb_data
OLEObject ADODB
ADODB = CREATE OLEObject
li_rtn = ADODB.ConnectToNewObject("ADODB.Stream")
if li_rtn = 0 then
    ADODB.Type = 1 //設定ADODB型別(1、二進位制資料,2、文字資料)
    ADODB.Mode = 3 //設定讀寫模式(1、讀,2、寫,3、讀寫)
    ADODB.Open() //開啟ADODB
    ADODB.LoadFromFile(filepath) //載入檔案
    ADODB.Position = 0 //Position=0才能設定Charset
    lb_data = ADODB.Read() //Read 和 ReadText 方法向 Stream 中讀取位元組或文字。
    ADODB.flush() //清空緩衝區資料
    ADODB.Close() //關閉流
    destroy ADODB
else
	messagebox('提示', '無法連線【ADODB.Stream】!~r~n讀取檔案失敗!')
end if
return lb_data

② 函數呼叫

blob lb_data
lb_data = gf_adodb_blob_read(getcurrentdirectory()+'\a.txt')
messagebox('blob',string(lb_data))

12.9 大檔案寫入(文字流)

① 函數定義

/*
\>====================================================================
\> function: gf_adodb_string_write.
\>--------------------------------------------------------------------
\> 描述:大檔案寫入(文字流)
\>--------------------------------------------------------------------
\> 引數:
\> string filepath (要寫入的檔案路徑和檔名稱)
\> string filecontent (要寫入的文字流內容)
\>--------------------------------------------------------------------
\> 返回:integer (0:成功,-1:失敗。)
\>====================================================================
*/
long li_rtn,ll_file
string ls_data
OLEObject ADODB
ADODB = CREATE OLEObject
li_rtn = ADODB.ConnectToNewObject("ADODB.Stream")
if li_rtn = 0 then
    ADODB.Type = 2 //設定ADODB型別(1、二進位制資料,2、文字資料)
    ADODB.Mode = 3 //設定讀寫模式(1、讀,2、寫,3、讀寫)
    ADODB.open() //開啟ADODB
    ADODB.Position = 0 //Position=0才能設定Charset
    ADODB.WriteText(filecontent) //Write 和 WriteText 方法向 Stream 中輸入位元組或文字。
    ADODB.savetofile(filepath,2) //savetofile(1、只寫入1次。2、可覆蓋寫入多次)
    ADODB.flush() //清空緩衝區資料
    ADODB.Close() //關閉流
    destroy ADODB
else
	messagebox('提示', '無法連線【ADODB.Stream】!~r~n讀取檔案失敗!')
	return - 1
end if
return 0

② 函數呼叫

gf_adodb_string_write(getcurrentdirectory()+'\a.txt','123')

12.10 大檔案讀取(文字流)

① 函數定義

/*
\>====================================================================
\> function: gf_adodb_string_read.
\>--------------------------------------------------------------------
\> 描述: 大檔案讀取(文字流)
\>--------------------------------------------------------------------
\> 引數:
\> string filepath (要讀取的檔案路徑和檔名稱)
\>--------------------------------------------------------------------
\> 返回: string (從檔案中讀取到的blob資料)
\>====================================================================
*/
long li_rtn
string ls_data
OLEObject ADODB
ADODB = CREATE OLEObject
li_rtn = ADODB.ConnectToNewObject("ADODB.Stream")
if li_rtn = 0 then
    ADODB.Type = 2 //設定ADODB型別(1、二進位制資料,2、文字資料)
    ADODB.Mode = 3 //設定讀寫模式(1、讀,2、寫,3、讀寫)
    ADODB.Open() //開啟ADODB
    ADODB.LoadFromFile(filepath) //載入檔案
    ADODB.Position = 0 //Position= 0才能設定Charset
    ls_data = ADODB.ReadText() //Read 和 ReadText 方法向 Stream 中讀取位元組或文字。
    ADODB.flush() //清空緩衝區資料
    ADODB.Close() //關閉流
    destroy ADODB
else
	messagebox('提示', '無法連線【ADODB.Stream】!~r~n讀取檔案失敗!')
end if
return ls_data

② 函數呼叫

string ls_data
ls_data = gf_adodb_string_read(getcurrentdirectory()+'\a.txt')
messagebox('string',ls_data)

12.11 移除字串中的字母

① 函數定義

/*
\>====================================================================
\> Function: gf_remove_letter
\>--------------------------------------------------------------------
\> 描述: 移除字串中的字母
\>--------------------------------------------------------------------
\> 引數:
\> string ls_data 要去除字母的字串
\>--------------------------------------------------------------------
\> 返回: string
\>====================================================================
*/
string str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
string ls_data_new
long i
if ls_data = '' or isnull(ls_data) then
	ls_data_new = ''
else
	for i = 1 to len(ls_data)
	if pos(str,mid(ls_data,i,1)) = 0 then
		ls_data_new += mid(ls_data,i,1)
	end if
	next
end if
return ls_data_new

② 函數呼叫

gf_remove_letter('12abc3sdfsg4')

12.12 獲取上個月初到月底的時間

① 函數定義

/*
>====================================================================
> Function: gf_last_month
>--------------------------------------------------------------------
> 描述: 獲取上個月初到月底的時間
>--------------------------------------------------------------------
> 引數:
> ref string lrt_start
> ref string lrt_end
>--------------------------------------------------------------------
> 返回值: (none)
>====================================================================
*/
string ls_by2
string ls_by,ls_sy
ls_by2 = mid(string(date(today())),1,7) + '-01'
ls_by = string(RelativeDate(date(ls_by2), - 1))
ls_sy = string(Year(date(ls_by2))) + '-' + string(Month(date(ls_by2)) - 1) +
'-01'
lrt_start = ls_sy + ' 00:00:00'
lrt_end = ls_by + ' 23:59:59'    

② 函數呼叫

//呼叫範例
string ls_start,ls_end
of_last_month(ls_start,ls_end)
messagebox('月初的(日期+時間)',ls_start)
messagebox('月底的(日期+時間)',ls_end)

12.13 時間轉字串

① 函數定義

/*
>====================================================================
> Function: gf_datetime_string
>--------------------------------------------------------------------
> 描述: 時間轉字串
>--------------------------------------------------------------------
> 引數:
> string as_datetime
> string as_select
>--------------------------------------------------------------------
> 返回值: string
>====================================================================
*/
string ls_y,ls_m,ls_d,ls_h,ls_i,ls_s
long ll_y,ll_m,ll_d,ll_h,ll_i,ll_s
string ls_format,ls_return
as_datetime = trim(as_datetime)
if pos(as_datetime,'-') > 0 then
    ls_format = '-'
    ll_y = pos(as_datetime,'-')
    ll_m = pos(as_datetime,'-',ll_y + 1)
    ll_d = pos(as_datetime,' ',ll_m + 1)
    ll_h = pos(as_datetime,':')
    ll_i = pos(as_datetime,':',ll_h + 1)
elseif pos(as_datetime,'/') > 0 then
    ls_format = '/'
    ll_y = pos(as_datetime,'/')
    ll_m = pos(as_datetime,'/',ll_y + 1)
    ll_d = pos(as_datetime,' ',ll_m + 1)
    ll_h = pos(as_datetime,':')
    ll_i = pos(as_datetime,':',ll_h + 1)
elseif pos(as_datetime,'.') > 0 then
    ls_format = '.'
    ll_y = pos(as_datetime,'.')
    ll_m = pos(as_datetime,'.',ll_y + 1)
    ll_d = pos(as_datetime,' ',ll_m + 1)
    ll_h = pos(as_datetime,':')
    ll_i = pos(as_datetime,':',ll_h + 1)
end if
ls_y = mid(as_datetime,1,ll_y - 1)
ls_m = mid(as_datetime,ll_y + 1,ll_m - 1 - ll_y)
ls_d = mid(as_datetime,ll_m + 1,ll_d - 1 - ll_m)
ls_h = mid(as_datetime,ll_d + 1,ll_h - 1 - ll_d)
ls_i = mid(as_datetime,ll_h + 1,ll_i - 1 - ll_h)
ls_s = mid(as_datetime,ll_i + 1)
choose case lower(as_select)
	case 'y' //年
		ls_return = ls_y
	case 'm' //月
		ls_return = ls_m
	case 'd' //日
		ls_return = ls_d
	case 'h' //時
		ls_return = ls_h
	case 'i' //分
		ls_return = ls_i
	case 's' //秒
		ls_return = ls_s
	case 'y-m' //年-月
		ls_return = ls_y + ls_format + ls_m
	case 'y-m-d' //年-月-日
		ls_return = ls_y + ls_format + ls_m + ls_format + ls_d
	case 'y-m-d h' //年-月-日 時
		ls_return = ls_y + ls_format + ls_m + ls_format + ls_d + ' ' + ls_h
	case 'y-m-d h:i' //年-月-日 時:分
		ls_return = ls_y + ls_format + ls_m + ls_format + ls_d + ' ' + ls_h +':' + ls_i
	case 'y-m-d h:i:s' //年-月-日 時:分:秒
		ls_return = ls_y + ls_format + ls_m + ls_format + ls_d + ' ' + ls_h +':' + ls_i + ':' + ls_s
	case 'lastday' //獲取當月最後一天
        Integer li_year,li_month
        li_year = Integer(ls_y)
        li_month = Integer(ls_m)
        if li_month = 12 then
        	li_month = 1
        	li_year ++
		else
			li_month = li_month + 1
		end if
	ls_return = string(RelativeDate(Date(String(li_year) + '-' +
	String(li_month) + '-01'), - 1))
end choose
return ls_return

② 函數呼叫

string ls_datetime
ls_datetime = '2021-01-01 11:12:13'
gf_datetime_string(ls_datetime,'Y') //獲取年
gf_datetime_string(ls_datetime,'M') //獲取月
gf_datetime_string(ls_datetime,'D') //獲取日
gf_datetime_string(ls_datetime,'H') //獲取時
gf_datetime_string(ls_datetime,'I') //獲取分
gf_datetime_string(ls_datetime,'S') //獲取秒
gf_datetime_string(ls_datetime,'Y-M') //獲取年+月
gf_datetime_string(ls_datetime,'Y-M-D') //獲取年+月+日
gf_datetime_string(ls_datetime,'H-I') //獲取時+分
gf_datetime_string(ls_datetime,'H-I-S') //獲取時+分+秒
gf_datetime_string(ls_datetime,'Y-M-D H') //獲取年+月+日 時
gf_datetime_string(ls_datetime,'Y-M-D H:I') //獲取年+月+日 時+分
gf_datetime_string(ls_datetime,'Y-M-D H:I:S') //獲取年+月+日 時+分+秒

12.14 xml解析

① 函數定義

/*
>====================================================================
> Function: gf_xml_get
>--------------------------------------------------------------------
> 描述: xml解析
>--------------------------------------------------------------------
> 引數:
> string data
> string label
>--------------------------------------------------------------------
> 返回值: string
>====================================================================
*/
long ll_start
string ls_data,ls_data2,ls_data3
ls_data = trim(data)
ll_start = pos(ls_data,'<' + label + '>')
if ll_start = 0 then
	return ''
else
    ls_data2 = mid(ls_data,ll_start + len('<' + label + '>'))
    ls_data3 = mid(ls_data2,1,pos(ls_data2,'<') - len('<'))
return ls_data3
end if

② 函數呼叫

string ls_xml
ls_xml = '<?xml version="1.0" encoding="UTF-8"?>' + &
'<code>' + &
'<a>1</a>' + &
'<b>2</b>' + &
'<c>3</c>' + &
'<d>4</d>' + &
'</code>'
gf_xml_get(ls_xml,'a')

12.15 獲取指定路徑下的所有檔案和資料夾

① 函數定義

/*
>====================================================================
>Function: gf_dir
>--------------------------------------------------------------------
> >
描述: 獲取指定路徑下的所有檔案和資料夾
>--------------------------------------------------------------------
> 
>引數:
> string as_dir
> listbox lb_filelist
> 
>ref st_dir astr_itemlist[]
>--------------------------------------------------------------------
> >
返回值: integer
>====================================================================
>*/
Long ll_i
Long ll_Count
Long ll_DirCount
    
If Not DirectoryExists ( as_Dir ) Then
	Return -2 // 目錄不存在
End If
    
If Right(as_Dir, 1) <> '\' Then
	as_Dir += '\'
End If
// 處理目錄
ll_DirCount = 0
lb_FileList.DirList( as_Dir + '*.*', 32784)
ll_Count = lb_FileList.TotalItems()
For ll_i = 1 To ll_Count
	If lb_FileList.Text(ll_i) = '[..]' Then
		Continue
	End If
	ll_DirCount ++
    astr_ItemList[ll_DirCount].Item_Name = lb_FileList.Text(ll_i)
    astr_ItemList[ll_DirCount].Item_Name = as_Dir +
    Mid(astr_ItemList[ll_DirCount].Item_Name, 2,
    Len(astr_ItemList[ll_DirCount].Item_Name) - 2) // 去除外部的[]
    astr_ItemList[ll_DirCount].Item_Type = 2
Next
// 處理檔案
lb_FileList.DirList( as_Dir + '*.*', 0)
ll_Count = lb_FileList.TotalItems()
For ll_i = 1 To ll_Count
	ll_DirCount ++
	astr_ItemList[ll_DirCount].Item_Name = as_Dir + lb_FileList.Text(ll_i)
	astr_ItemList[ll_DirCount].Item_Type = 1
Next
Return ll_DirCount

② 函數呼叫

st_dir astr_itemlist[]
gf_dir('D:\',lb_1,astr_itemlist)

12.16 將數值轉換為大寫金額

① 函數定義

/*
>====================================================================
> Declare: gf_capital_amount
>--------------------------------------------------------------------
> 描述: 將數值轉換為大寫金額
>--------------------------------------------------------------------
> 引數:
> ac_money 要轉換的金額
>--------------------------------------------------------------------
> 返回: 大寫金額
>====================================================================
*/
string ls_numstr[10] = {"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"}
string ls_monstr[20] =
{"元","拾","佰","仟","萬","拾","佰","仟","億","拾","佰","仟","萬","拾","佰","仟","億",
"拾","佰","仟"}
integer i
integer li_len
string ls_temp
string ls_char
string ls_intstr
string ls_decstr
string ls_rtnintstr
string ls_rtndecstr
ls_temp = string(abs(ac_money),"0.00")
ls_intstr = left (ls_temp,len(ls_temp) - 3)
ls_decstr = right(ls_temp,2)
li_len = len(ls_intstr)
for i = 1 to li_len
	ls_char = mid(ls_intstr,li_len - i + 1,1)
	if ls_char = "0" then
        choose case i
            case 1,9,17
                ls_rtnintstr = ls_monstr[i] + ls_rtnintstr
            case 5,13
                if li_len > i + 3 then
                    if mid(ls_intstr,li_len - i - 2,3) <> "000" then
                        ls_rtnintstr = ls_monstr[i] + ls_rtnintstr
                    end if
                else
                    ls_rtnintstr = ls_monstr[i] + ls_rtnintstr
                end if
            case else
                if mid(ls_intstr,li_len - i + 2,1) <> "0" then
                    ls_rtnintstr = "零" + ls_rtnintstr
                end if
        end choose
	else
        ls_rtnintstr = ls_numstr[integer(ls_char) + 1] + ls_monstr[i] +
        ls_rtnintstr
	end if
next
if long(ls_intstr) = 0 then
    if long(ls_decstr) > 0 then
        ls_rtnintstr = ""
    else
        ls_rtnintstr = "零元"
    end if
end if
if ls_decstr = "00" then
	ls_rtndecstr = "整"
elseif mid(ls_decstr,1,1) = "0" then
	ls_rtndecstr = ls_numstr[integer(mid(ls_decstr,2,1)) + 1] + "分"
	if long(ls_intstr) > 0 then ls_rtndecstr = "零" + ls_rtndecstr
elseif mid(ls_decstr,2,1) = "0" then
	ls_rtndecstr = ls_numstr[integer(mid(ls_decstr,1,1)) + 1] + "角"
else
    ls_rtndecstr = ls_numstr[integer(mid(ls_decstr,1,1)) + 1] + "角" + &
    ls_numstr[integer(mid(ls_decstr,2,1)) + 1] + "分"
end if
if ac_money >= 0 then
	return ls_rtnintstr + ls_rtndecstr
else
	return "負" + ls_rtnintstr + ls_rtndecstr
end if

② 函數定義

gf_capital_amount(11.22)

12.17 將按鈕迴圈新增到按鈕陣列裡

① 函數定義

/*
>====================================================================
> Function: gf_button_array
>--------------------------------------------------------------------
> 描述: 將按鈕迴圈新增到按鈕陣列裡
>--------------------------------------------------------------------
> 引數:
> commandbutton controls[]
> ref commandbutton lbt_btn[]
>====================================================================
*/
long i
for i = 1 to UpperBound(controls[])
	if left(classname(controls[i]),3) = "cb_" then
		lbt_btn[upperbound(lbt_btn) + 1] = controls[i]
	end if
next

② 函數呼叫

commandbutton a[]
a[1] = cb_1
a[2] = cb_2
gf_button_array(a)

12.18 動態新增資料視窗欄位下的ddlb下拉框

① 函數定義

/*
>====================================================================
> Function: gf_dw_ddlb
>--------------------------------------------------------------------
> 描述:動態新增資料視窗欄位下的ddlb下拉框
>--------------------------------------------------------------------
> 引數:
> datawindow as_dw 要新增下拉框的資料視窗
> string as_dw_column 要新增下拉框的列
> transaction as_affairs 要查詢的SQL事務
> string as_table 要查詢的表
> string as_table 要查詢的where條件
> string as_table_display 要在下拉框顯示的列
> string as_table_data 要在下拉框中指定的資料
>--------------------------------------------------------------------
> 返回值: integer
>====================================================================
*/
string dw_sql,dw_style
string dw_syntax,dw_syntax_error,dw_create_error
boolean lb_flag = false
string ls_data,ls_display
string ls_value
datastore dw_new
dw_new = create datastore
as_dw.Modify(as_dw_column + ".ddlb.case='any'")
as_dw.modify(as_dw_column + ".ddlb.vscrollbar='yes'")
if as_table_condition = '' or isnull(as_table_condition) then
	dw_sql = "select distinct " + as_table_display + ',' + as_table_data + "
	from " + as_table
else
	dw_sql = "select distinct " + as_table_display + ',' + as_table_data + "
	from " + as_table + ' where ' + as_table_condition
end if
dw_style = "style(type=grid)"
dw_syntax = sqlca.syntaxfromsql(dw_sql, dw_style, dw_syntax_error)
if len(dw_syntax_error) > 0 then
	messagebox("提示", "構造sql資料來源錯誤: " + dw_syntax_error)
	return - 1
end if
dw_new.create(dw_syntax,dw_create_error)
if len(dw_create_error) > 0 then
	messagebox("提示", "建立資料視窗錯誤: " + dw_create_error)
	return - 1
end if
dw_new.settransobject(sqlca)
dw_new.retrieve()
long i,ll_rowcount
ll_rowcount = dw_new.rowcount()
if ll_rowcount > 0 then
    for i = 1 to ll_rowcount
    	ls_display = string(dw_new.GetItemString(i,as_table_display))
    	ls_data = string(dw_new.GetItemString(i,as_table_data))
   		if not lb_flag then
    		ls_value = as_dw_column + ".values='"
    		lb_flag = true
   		 else
   			 ls_value += "/"
   		 end if
    	ls_value += Trim(ls_display) + "~t" + Trim(ls_data)
    next
	ls_value += "'"
    if as_dw.Modify(ls_value) <> "" then
        return - 1
    end if
else
	return - 1
end if
return 0

② 函數呼叫

gf_dw_ddlb(dw_1,'name',sqlca,'user','name','id')

一下整理了這麼多函數,這些函數呢不用都記住。有個印象就可以了,可以將文章當作工具書來查即可

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

我們下期再見~ (●'◡'●)