PB從入坑到放棄(五)視窗使用技巧

来源:https://www.cnblogs.com/xiezhr/archive/2023/07/20/17569816.html
-Advertisement-
Play Games

`PB`應用程式就是由許多共同協作完成特定任務的視窗組成的集合。 視窗在應用程式的開發工作中占有很大的比重,是非常重要的一個 `PB `對象 ### 一、視窗類型 ![視窗類型](https://img2023.cnblogs.com/blog/2381533/202307/2381533-2023 ...


PB應用程式就是由許多共同協作完成特定任務的視窗組成的集合。

視窗在應用程式的開發工作中占有很大的比重,是非常重要的一個 PB 對象

一、視窗類型

視窗類型

視窗類型 描述
Main ①可以覆蓋其他視窗,也可以被其他視窗覆蓋
②可以最大、最小化,可以用滑鼠改變其 大小
③可以有邊框,可以有菜單
④常用於應用主操作視窗
Child ①可以被其他視窗覆蓋,也可以覆蓋其他視窗
②可以最大或最小化,也可以用滑鼠改變 其大小,父視窗最小或最大化時, Child 類型的視窗也相應的被最大或最小化
③可以 有邊框,但不能有菜單
④位置是相對於其父視窗而言,用滑鼠拖放其位置不能超過其 父視窗的範圍
⑤常被其他視窗打開
Response ①不能最大、最小化,沒有邊框,不能用滑鼠改變其大小
②在繼續執行程式之前,必須 對這種類型的視窗做出響應
③常用於顯示非常重要的信息
Popup ①可以最大或最小化,在對這種類型的視窗響應之前,可以操作其他視窗
②不隨父視窗 最大和最小化
③可以擁有菜單、邊框
④常用於顯示其他視窗的輔助信息

二、視窗屬性

-- General 屬性頁屬性 --Scroll 屬性頁屬性
General 屬性頁屬性 General 屬性頁屬性
-- ToolBar 屬性頁屬性 --Other 屬性頁
ToolBar 屬性頁屬性 Other 屬性頁

2.1 General 屬性頁屬性

屬性 簡介
Title 視窗的標題
Tag 和視窗相關的一個文本屬性,可以理解成視窗的註釋
MenuName 和視窗相連的菜單
Visibl 視窗是否可見
Enabled 確定視窗的功能是否可用
TitleBar 確定視窗是否有標題欄
ControlMenu, MaxBox, MinBox 三個屬性確定在視窗的標題欄是否顯示最大、最小化以及關閉按鈕
ClientEdge 是否顯示用戶工作區邊框
PaletteWindow 該屬性只用於 Popup 類型的視窗,確定是否顯示標題欄圖標和最大、最小化按鈕
ContextHelp 只用在 Response 類型的視窗上。確定是否支持上下文幫助。如果支持就在視窗的右上角顯示一個問號圖標
RightToLeft 確定由右到左顯示
Center 視窗居中顯示,不管屏幕解析度如何設置。該屬性在 PB 7.0 中沒有,新增
Resizable 決定視窗在運行時是否可以改變其大小
Border 決定視窗是否有邊框
WindowType 確定視窗的類型,可用取值的含義,從字面意思可以理解。該屬性在視窗打開時起作用
BackColor 設置視窗的背景顏色
MdiClientColor 用來確定 MDI 用戶區的顏色
Icon 用來設置視窗標題欄的圖標

2.2 Scroll 屬性頁屬性

屬性 簡介
HscrollBar, VscrollBar 是否需要顯示水平或垂直滾動條
UnitsPerLine 用戶在垂直滾動條上每次單擊移動的 PB單位數。預設為 0,表示每次 滾動視窗高度的 1/100
UnitsPerColumn 用戶在水平滾動條上每次單擊向左或者向右移動的 PB單位數。預設為 0,表示每次滾動視窗寬度的 1/100
ColumnsPerPage 表示每頁顯示的列數。預設為 0,表示顯示 10 列
LinesPerPage 表示每頁顯示的行數。預設為 0,表示顯示 10 行

2.3 ToolBar 屬性頁屬性

屬性 簡介
ToolBarVisible 工具條是否可見
ToolBarAlignment 確定工具條在視窗上的初始位置。 有 5 個可用的枚舉型取值: AlignAtBootom!(底部)、AlignAtLeft!(左)、 AlignAtRight!(右)、 AlignAtTop!(頂部)、 Floating!(浮動)
ToolBarX, ToolBarY, ToolBa rHeight 和 ToolBarWidth 用來設置當工具條浮動顯示時工具條的起始位置及高寬。預設取值都是 0

2.4 Other 屬性頁中的屬性

用來設置視窗的真實坐標、寬高和滑鼠的預設指針。

當屏幕解析度是 800 × 600 時,全屏顯示的視窗 X, Y, Width 和 Height 分別是 0, 0, 3658, 2407。

三、11種常用控制項

視窗可以看作是一個容器,所以在視窗上可以放各種控制項,來完成用戶與程式的交互

種常用控制項

控制項 說明
Button 用來執行特定的命令,接受用戶的鍵盤或滑鼠操作。
該控制項的 Text 屬性一般用來 向用戶說明該按鈕的功能。
典型事件是 Clicked
Picture button 和控制項 Button 相同,只是在它的上面還可以顯示圖形,提供更漂亮友好的界面。
典型事件也是 Clicked
Static text 顯示指示性或解釋性信息,文字只能單行顯示。
一般很少在該控制項上編程
Singlelineedit 單行編輯,一般用來接受用戶比較少的文字輸入。
典型事件是 Modified,通常在該 事件上判斷用戶的輸入是否符合既定規則,如是否是數字等
Multilineedit 多行編輯,用來接收用戶比較多的文字輸入。
典型事件也是 Modified,通常在該事 件上判斷用戶的輸入是否符合既定規則
Check box 覆選框,用來界定用戶的輸入,一般輸入信息作為其他命令執行時的選項。
當有多個覆選框時,它們間的連接符習慣性認為是“ and”。
重要屬性是 Checked,通常用來判斷該控制項是否選中
Radio box 單選按鈕,用來界定用戶的輸入只能是給定值中的一個。
它的輸入信息通 常用來選擇其他命令互斥的執行方式。
重要屬性 是 Checked,true 表示選中
Dropdownlistbox 以緊湊列表框的形式給用戶顯示信息,通常在該控制項中進行單選。
經常和游標 ( cursor ) 配 合 使 用 , 顯 示 從 數 據 庫 中 提 取 的 數 據 。
典 型 事 件 是 SelectionChanged,通常在該事件上讀取當前用戶的選擇信息
Listbox 列表框,是顯示信息的,但其顯示格式不如 Dropdownlistbox 緊湊,也通常和光 標(cursor)配合使用,顯示從資料庫中提取的數據。但是,該控制項經常可以同時 選中多行。典型事件也是 SelectionChanged,通常在該事件上讀取當前用戶的選 擇信息
DataWindow 是 PB中最重要的、也是 PB最具特色的一個控制項。
可以 完成對資料庫中的所有數據操作
Group box 將功能類似的或在功能模塊上關係緊密的部件放置在一起,界面美觀,可以 給用戶一個操作上的暗示。很少在該控制項上編程

四、視窗事件

4.1 常用事件

事件 事件說明
open 在視窗打開之後,顯示之前發生。
調整視窗大小、設置視窗實例變數、初始化一些控制項
close 視窗被關閉時發生。觸發該事件後,沒有辦法阻止視窗的關閉
closequery 在開始關閉視窗時發生,該事件返回一個0或1的返回值
如果返回值為1,則視窗不關閉,close事件也不會產生
如果返回值為0,則視窗被關閉
resize 當視窗大小發生變化時變化,視窗被打開時也觸發此事件
key 當用戶在鍵盤上按下一個鍵且插入點不在編輯區域時發生
activate 在視窗成為活動視窗之前、 Open 事件觸發完後觸發 ,此事件發生後,Tab 值最小的對象得到焦點,如果沒有 排序號,則視窗本身獲得焦點
deactivate 視窗變為不活動時發生
clicked 戶單擊視窗的空白區域時發生,此區域不能有任何的空間或數據視窗
doubleclicked 用戶雙擊視窗的空白區域時發生,此區域不能有任何的空間或數據視窗
dragleave 當可拖放對象或控制項,離開空白區時發生
dragleave 當可拖放對象或控制項,在視窗中被拖動時發生
hotlinkalarm 在動態數據交換(DDE)伺服器應用發送了新的(修改後)的數據,且客 戶DDE應用程式已經接收到數據時發生
mousedown 空白區,單擊滑鼠左擊時發生。
此事件與click事件相同,flags的值總為1
mousemove 滑鼠在視窗中移動時發生
mouseup 放開滑鼠左鍵時發生
rbuttondown 空白區,按下滑鼠右鍵時發生
remoteexec 當一個DDE客戶應用程式發送了一條命令時發生
remotehotlinkstart 當一個DDE客戶應用程式要開始一個熱連接(hotlink)時發生
remotehotlinkstop 當一個DDE客戶應用程式要結束一個熱鏈接時發生
remoterequest 當一個DDE客戶應用程式請求數據時發生
remotesend 當一個DDE客戶應用程式已經發送了數據時產生
systemkey 當插入點不在編輯框中且用戶按下【alt】或【alt+其他組合鍵時發生】
timer 調用timer函數,啟動定時器、設定時間後發生
toolbarmoved 當MDI視窗中的工具欄被移動時發生

4.2 舉個慄子

① open事件

Cb_Save.Enabled=False //禁用“保存”按鈕的功能
SetPointer(HourGlass!) //將滑鼠形狀置為沙漏形
Dw_1.SetTransObject(SQLCA) //為數據視窗設置事務對象
Dw_1.Retrieve() //檢索數據

② 避免用戶因疏忽退出視窗而丟掉在數據視窗中的修改數據 ,通常在 CloseQuery 事件中判
斷某些工作是否完成,並顯示一個提示視窗詢問用戶,根據用戶的確認,返回一個值來決定
是否觸發視窗的 Close 事件。

返回值為 1,表示取消關閉動作;返回值為 0,表示繼續執行Close 事件

Int li_flag
//如果數據視窗中沒有修改,則允許執行 Close,直接返回
If dw_1.ModifiedCount() <= 0 And dw_1.DeletedCount() <= 0 Then Return 0
//如果數據視窗有修改,詢問用戶是否保存
li_flag = MessageBox("提示","數據已經修改,是否保存? ",Question!,YesNoCancel!,1)
Choose Case flag_i //根據用戶選擇執行
	Case 1 //用戶選擇要保存數據
		If dw_1.Update() = 1 Then //如果修改數據成功
			Commit; //提交
			Return 0 //繼續執行 Close 事件
		Else //修改數據不成功
			rollback; //回退事務
			li_flag = MessageBox("提示","數據錯誤,是否繼續關閉!",Question!,YesNoCancel!,2) //顯示錯誤
			If li_flag = 1 Then
				Return 0 //允許關閉
			Else
				Return 1 //不允許關閉
			End If
		End If
	Case 2 //用戶選擇不保存數據
        Rollback; //回退事務
        Return 0 //允許執行 Close 事件
	Case 3 //用戶選擇取消
		Return 1 //不允許關閉
End Choose //用戶所有的選擇情況處理完畢

③ 在視窗的 Resize 事件中編寫腳本,當用戶調整視窗大小時,根據用戶調整的
比例對視窗上的控制項大小進行調整。首先定義兩個實例變數用來保存調整之前的視窗大小

//open事件中代碼
ii_width = This.width
ii_height = This.height
//Resize事件中代碼
Int li_index //迴圈變數
DragObject lobj_every //用來獲取視窗上的控制項
For li_index = 1 To UpperBound(this.control[]) //對視窗中的所有控制項逐一處理
    lobj_every = control[li_index] //保存當前控制項
    lobj_every.x = lw_obj.x * (newwidth / ii_width) //重新設置 x 坐標
    lobj_every.width = lobj_every.width * (newwidth / ii_width) //重新設置寬度
    lobj_every.y = lobj_every.y * (newheight / ii_height) //重新設置 y 坐標
    lobj_every.height = lobj_every.height * (newheight / ii_height) //重新設置高度
Next
ii_width = newwidth //保存當前寬度
ii_height = newheight //保存當前高度

五、視窗常用函數

5.1 open 函數

函數用來打開其他的視窗

① 語法

Open ( Windowvar)

② 參數

  • Windowvar 是一個 Window 類型的參數,是要打開的視窗名稱

③ 返回

  • 成功時返回1,否則返回-1
  • 數為 Null, 則返回 Null

④ 舉個慄子

//打開主視窗
Open(w_main)

註:連續調用Open函數,視窗不會被打開兩次,只是第二次調用時會再次觸發視窗 Activate 事件。為了避免這種情況,可以將腳本修改如下

If Not IsValid(w_main) Then //如果視窗沒有打開
	Open(w_main) //則打開該視窗
Else //如果視窗已經打開
	W_main.BringToTop = True //將該視窗顯示在最頂層
End If

竟然open函數調用兩次也不能打開兩個視窗,那麼問題來了,怎麼才能打開多個視窗呢?代碼如下

① 打開和 w_edit 完全相同的一個視窗

w_edit lws_edit  //定義一個視窗變數
Open(lws_edit)   //創建視窗實例

②通過數組,打開多個實例視窗

w_edit lws_edit[3]
Int li_index
For li_index =1 To 3
	Open(lws_edit[li_index])
Next

5.2 close 函數

函數的作用是關閉視窗,釋放視窗及其上面的控制項所占用的記憶體空間,視窗的CloseQuery 事件和 Close 事件觸發

① 語法

Close ( Windowname )

② 參數

  • Windowname 是要關閉的視窗名稱,是一個 Window 類型的變數
  • 成功返回 1,否則返回-1
  • 參數為 Null,則返回 Null

5.3 MessageBox 函數

函數可以打開一個小信息視窗,不僅可以以多種方式給用戶顯示提示信息,還可以將用戶的選擇信息返回 。

小信息視窗有標題、提示信息、圖標、按鈕等 4 個元素,可以通過不同的參數來決定顯示哪些或者顯示哪種樣式。

① 簡單模式

只能顯示提示信息,並有一個確認按鈕,不能讓用戶進行選擇

  • 語法
MessageBox(title,text)
  • 參數

    • title 為信息視窗標題
    • text 為提示信息
  • 舉個慄子

    MessageBox(“錯誤提示” ,“數據保存錯誤! ” )
    

    messagebox

② 複雜模式

  • 語法

    MessageBox ( title, text {, icon {, button {, default } } } )
    
  • 參數

    • title 為信息視窗標題
    • text 為提示信息
    • icon 用來表示使用哪種圖標
    • button 用來表示提供哪些按鈕

圖標icon取值如下

icon圖標

按鈕button取值如下

參數取值 顯示樣式 返回值
OK! 顯示 【確定】 按鈕,該取值為預設值 總返回 1
OKCancel! 顯示 【確定】 和 【取消】按鈕 1-【確定】, 2-【取消】
YesNo! 顯示 【是】 和 【否】按鈕 1-【是】, 2-【否】
YesNoCancel! 顯示 【是】、 【否】 和 【取消】 三個按鈕 1-【是】, 2-【否】, 3-【取消】
RetryCancel! 顯示 【重試】 和 【取消】按鈕 1-【重試】, 2-【取消】
AbortRetryIgnore! 顯示 【放棄】、 【重試】和 【忽略】三個按鈕 1-【放棄】, 2-【重試】, 3-【忽略】
  • 舉個慄子

    li_flag = MessageBox("提示","是否保存數據? ",Question!,YesNoCancel!,1)
    Choose Case li_flag
    Case 1 //用戶選擇 Yes,保存數據
    . . . . . . //處理語句
    Case 2 //用戶選擇 No,不保存
    . . . . . . //處理語句
    Case 3 //用戶選擇了 Cancel,不進行任何操作
    . . . . . . //處理語句
    End Choose
    

六、值傳遞與接收

6.1 字元串

① 打開一個視窗,並傳遞一個字元串

string ls_str
ls_str = '個人公眾號:XiezhrSpace'
openwithparm( 視窗名,ls_str)

② 接收字元串

string ls_str
ls_str = message.stringparm

6.2 數值

① 打開一個視窗,並傳遞一個數值

openwithparm( 視窗名,1)

② 接收數值

long ll_row
ll_row = message.doubleparm

6.3 結構體

① 打開一個視窗,並傳遞一個結構體

st_parameter s_pm
s_pm.a = 1
openwithparm( 視窗名,s_pm)

② 接收結構體

st_parameter s_pm
s_pm = message.powerobjectparm
messagebox('提示',s_pm.a)

6.4 用戶對象

① 打開一個視窗,並傳遞一個用戶對象

//(1)、創建類用戶對象u_parameter,並定義實例變數
//(2)、給用戶對象賦值,並傳遞該用戶對象
u_parameter u_pm
u_pm.a = '1'
openwithparm(視窗名,u_pm)

② 接收用戶對象

u_parameter u_pm
u_pm = message.powerobjectparm
messagebox('提示',u_pm.a)

6.5 exe應用程式

① 打開一個exe,並傳遞參數

ls_exe = 'a.exe' + '|值1|' + '|值2|'
run(ls_exe)

② 接收exe傳遞的參數

string ls_parameter
ls_parameter = commandparm()

6.6 傳遞消息和接收消息

① 傳遞string消息

w_main.triggerevent('ue_open',0,'test')
//在用戶自定義事件ue_open中接收消息:
string ls_msg
ls_msg = string(message.longparm,'address')

② 傳遞long消息

w_main.triggerevent('ue_open',100,0)
//在用戶自定義事件ue_open中接收消息:
long ll_msg
ll_msg = message.wordparm

6.7 可視化類傳值

u_customvisual u_cv
u_cv = create u_customvisual
openuserobjectwithparm(u_cv,1)

6.8 關閉視窗傳遞數據

① 語法

CloseWithReturn ( windowname, Returnvalue )

② 參數

  • windowname 是要關閉的視窗的名稱
  • Returnvalue 要返回的數值

註:只有被關閉的視窗是 response 類型才能有效地獲取返回參數

七、觸發事件

7.1 立即觸發

obj.triggerevent(clicked!)
obj.trigger event ue_init()
obj.trigger function wf_init()

7.2 在事件隊列最後觸發

obj.postevent(clicked!)
obj.post event ue_init()
obj.post function wf_init()

7.3 動態綁定觸發

obj.dynamic event ue_init()
obj.dynamic function wf_init()
註:
動態調用和靜態調用的區別
靜態調用就是在編譯代碼時就對函數進行徹底編譯
動態調用就是在程式執行的時候才回去查找和調用相應的函數

7.4 規定的時間內觸發某事件

idle(60) //如果60秒沒有操作的話就觸發application對象的idle事件
timer(60) //每隔60秒就觸發一次視窗的timer事件

八、視窗使用技巧

8.1 創建視窗實例

① 創建視窗實例

w_edit lws_edit
Open(lws_edit)

② 打開多個視窗實例

w_edit lws_edit[3]
Int li_index
For li_index =1 To 3
	Open(lws_edit[li_index])
Next

8.2 使用視窗屬性編程

根據 tag 的取值對各個控制項進行初始化

Int li_index,li_total
DataWindow ldw_temp
DropDownListbox lddlb_temp
RadioButton lrb_temp
li_total = Upperbound(Parent.Control[])
For li_index = 1 To li_total
	Choose Case Lower(Parent.Control[li_index].Tag)
	Case "DataWindow"
		ldw_temp = Parent.Control[li_index]
		ldw_temp.Reset()
	Case "DropDownListbox"
        lddlb_temp = Parent.Control[li_index]
        lddlb_temp.SelectItem(0)
	Case "radiobutton"
        lrb_temp = Parent.Control[li_index]
        lrb_temp.Checked = False
	Case Else
	…
	End Choose
Next

8.3 視窗最小化時設置動態圖標

當程式最小化時打開 timer(在 deactive 中加入 timer(1)語句),併在 timer 事件中編寫

程式激活時關閉 Timer 事件(在 Active 事件中加入 timer(0)語句)

If This.Icon = "appico.ico" Then
	This.Icon = "reverse.ico"
Else
	This.Icon = "appico.ico"
End If

8.4 放置閃爍文字

以閃爍文字顯示重要信息可以吸引用戶的註意力,避免這些重要信息被忽略。通過周期性修改 visible 屬性,可以實現閃爍效果

在視窗中,假設放置一個靜態文本 st_1,在視窗的 Open 事件中定義 Timer 事件的間隔:Timer(1)

Timer 事件 中代碼如下

If Mod(Second(Now()),2) = 1 Then
	st_1.visible = False
Else
	st_1.Visible = True
End If

閃爍

8.5 提高視窗的打開速度

視窗的 Open 事件中經常編寫腳本來進行初始處理工作,如果這些工作花費的時間比較長,在視窗顯示之前用戶就得等待很長的時間

這時,可以如下腳本優化

第一種方案:

open事件中添加代碼

PostEvent("ue_openpost")

ue_openpost 事件中添加代碼

SetPoInter(HourGlass!)
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
SetPoInter(Arrow!)

第二種方案:

open事件中添加如下代碼

dw_1.SetRedraw(False)
TriggerEvent("ue_openpost")
Dw_1.SetRedraw(True)

8.6 移動不帶標題欄的視窗

在開發應用程式中,可能要用到不帶標題欄的視窗,而帶有標題欄的視窗可以通過拖放
標題欄來移動視窗,如何移動沒有標題欄視窗呢?

在要拖放視窗的 MouseDown 事件中編寫代碼,代碼如下

Send(handle(this),274,61458,0)

8.7 給視窗添加自動滾動條功能

視窗的 Resize 事件中編寫腳本,根據當前視窗的大小來設置是否顯示滾動條

① 聲明函數

Subroutine GetScrollRange(Uint hWindow,Int nScrollBarFlag,ref Int nMin,ref Int nMax) Library "user.exe"
Function Int GetScrollPos(Uint hWindow,Int nScrollBarFlag) Library "user.exe"

② 定義實例變數

Int ii_width,ii_height

open事件中添加代碼

ii_width = This.Width
ii_height = This.Height

Resize 事件中實現

Uint hwindow
Int nScrollPos,nMinPos,nMaxPos
If This.WindowState = Minimized! Then //如果正在進行最小化,則直接返回
	Return
End If
HWindow = Handle(This) //獲取當前視窗的句柄
//下麵開始處理水平滾動條
If This.Width < i_Width Then //如果小於打開時的寬度
	This.HscrollBar = True //則顯示水平滾動條
Elseif This.HscrollBar Then //如果大於或等於打開時的寬度,並且已經有滾動條
    NScrollPos = GetScrollPos(hwindow,0) //使用 API 函數獲取當前滾動條位置
    GetScrollRange(hwindow,0,nMinPos,nMaxPos) //使用 API 函數獲取滾動範圍
    If nScrollPos > nMinPos Then //如果用戶滾動了滾動條並且此時不需要顯示滾動條
    	Post(hwindow,276,6,0) //則在水平方向調整視窗中的內容到原來的位置
    End If
	This.HscrollBar = False //取消滾動條特性
End If
//下麵開始處理垂直滾動條
If This.Height < i_Height Then //如果小於打開時的高度
	This.VscrollBar = True //則顯示垂直滾動條
Elseif This.VscrollBar Then //如果大於或等於打開時的高度,並且已經有滾動條
    NScrollPos = GetScrollPos(hWindow,1) //使用 API 函數獲取當前滾動條位置
    GetScrollRange(hwindow,1,nMinpos,nMaxPos) //使用 API 函數獲取滾動範圍
    If nScrollPos > nMinPos Then //如果用戶滾動了垂直滾動條且不需再顯示
    	Post(hwindow,277,6,0) //則垂直調整視窗中的內容到原來的位置
    End If
	This.VscrollBar = False //取消滾動條特性
End If

8.8 自動調整視窗

實現視窗居中

//***************************************************************
//* 功能: 將視窗移到屏幕的中央
//* 參數 1: aw_window 要處理的視窗
//* 返回值: (none)
//* 調用舉例: gf_window_center(w_pay_mode) //將視窗置於屏幕的中央
//***************************************************************
Environment le_env
Int li_ScreenHeight, li_ScreenWidth
Long ll_posx,ll_posy
GetEnvironment(le_env)
li_ScreenHeight = PixelsToUnits(le_env.ScreenHeight,YPixelsToUnits!)
li_screenwidth = PixelsToUnits(le_env.ScreenWidth,XPixelsToUnits!)
If aw_window.width > li_ScreenWidth Then //如果視窗超寬
	ll_posx = 1
Else
	ll_posx = (li_ScreenWidth - aw_window.Width) / 2
End If
If aw_window.height > li_ScreenHeight Then //如果視窗超高
	ll_posy = 1
Else
	ll_posy = (li_ScreenHeight - aw_window.Height) / 2
End If

aw_window.Move(ll_posx ,ll_posy)

以上就是本期內容的全部,希望對你有所幫助。我們下期再見 (●'◡'●)


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

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在前端開發的世界里,Vue.js一直是一個備受追捧的框架。隨著Vue 3的發佈,開發者們開始熱烈討論它與Vue 2之間的差異和優勢。就像披薩和漢堡一樣,這兩個版本都有自己獨特的特點和追隨者。那麼,Vue 2和Vue 3到底誰才能在前端界贏 ...
  • 需求:通過介面返回的二進位流數據,這個流數據他是一個xlsx文檔,需要給到用戶一個文檔線上連接。 下麵是具體代碼,註意只針對二進位的文件數據,如果圖片上傳直接調用uploadFile就可以,並且相容原生微信小程式。 export function exportExcel1(query) { uni. ...
  • ## 簡單解決jsp中文亂碼問題 初學jsp製作一個簡單的響應頁面 具體代碼如下: ``` username : Hello ``` 保存為test.jsp文件,啟動tomcat訪問,出現下圖: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201101104 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 本文重點介紹了京東零售電商業務在訂單逆向履約上面的最佳技術實踐,閱讀本文,讀者可以瞭解到整個快退平臺新系統設計的底層邏輯,也可以參考本文並結合實際場景,將方案應用在遺留債務系統改造、業務和技術建模中。 ...
  • # 1.打開文件 位於自動導入的模塊IO中,無需手動導入。 ``` f = open('D:\M\test.txt') ``` 若文件不存在,則報錯 ``` Traceback (most recent call last): File "d:\M\github\Python\Demo\t14.py ...
  • ```cpp #include #include #include #pragma comment( lib, "Winmm" ) static int counter = 0; static int64_t ticks_per_second; void __stdcall on_timer(HWN ...
  • 本系列博客將利用C++實現一系列數值演算法。數值演算法離不開矩陣,但是C++並未自帶矩陣這一對象,直接使用數組又會帶來諸多不便,因此我們需要做一些預備工作————編寫一個矩陣類,實現矩陣的基本功能。一般來說,讀者可以直接使用Eigen庫進行矩陣計算,從頭開始造輪子僅僅是為了滿足筆者個人的需要。 #一、成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...