?? lc_bcb_105.txt
字號:
10.4.2 窗體重用實例
下面我們通過一個具體的實例來說明窗體重用的設計過程。我們在一個名為passform.dll 的文件中儲存了一個口令設置窗口和一個口令檢查窗口。而后在一個Delphi 編寫的程序和一個VB編寫的程序中進行調用。事實證明這種方法是完全可行的。
10.4.2.1 窗體重用DLLs的設計
窗體重用DLLs的設計依照(10.4.1)中介紹的步驟進行。DLLs中的兩個窗體 SetPassWordForm和GetPassWordForm分別用于設置和檢查口令。它們的設計界面如圖所示。
圖10.3 口令設置窗口SetPassWordForm設計界面
圖10.4 口令檢查窗口GetPassWordForm設計界面
窗體類TSetPassWordForm定義了兩個數據成員Verified和PassWord,用于記錄口令確認狀態和設置的口令。TSetPassWordForm的定義如下:
type
TSetPassWordForm = class(TForm)
Label1: TLabel;
Edit1: TEdit;
OKBtn: TBitBtn;
CancelBtn: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
Verified: Boolean;
public
{ Public declarations }
PassWord: PChar;
end;
窗口生成時,對數據成員和部件狀態進行初始化:
procedure TSetPassWordForm.FormCreate(Sender: TObject);
begin
Verified := False;
PassWord := StrAlloc(40);
OKBtn.Enabled := False;
Label1.Caption := 'Please Input PassWord:';
end;
按鈕OKBtn在程序啟動時Enabled屬性設置為False,直到口令被正確設置后Enabled屬性才恢復為True。這樣就保證了只有口令被正確設置后,口令設置窗口才能正常關閉。否則只能按Cancel按鈕取消。
在口令設置代碼單元中定義了一個輸出函數SetPassWord,用于生成口令設置窗口并返回設置的口令:
function SetPassWord(PWord: PChar): Boolean;
var
SetPassWordForm: TSetPassWordForm;
begin
Result := False;
SetPassWordForm := TSetPassWordForm.Create(Application);
try
with SetPasswordForm do
if ShowModal = mrOK then
begin
StrCopy(PWord,StrUpper(Password));
Result := True;
end;
finally
SetPasswordForm.Free;
end;
end;
口令成功設置,把PassWord的值拷貝給PWord輸出,并返回True。應該注意的是由于
PWord本身就是指針類型,指向一個字符串的地址,因而雖然PWord用于輸出,但在參數表中仍為傳值參數,而不是傳址參數。另外調用函數StrCopy,要求PWord在傳入前已分配內存,否則會導致一個一般保護錯。try...finally用于保護窗口所占用內存資源在任何情況下都能正常釋放,讀
者可參看第十二章。
在口令設置窗口中,為了確保用戶記住了設置的口令,在用戶輸入并按回車鍵后,要求用戶再次輸入進行確認。只有用戶重新輸入的字符串與原設置口令相同,口令設置窗口才能正常關閉
。否則將原設置口令清空,要求用戶再次輸入。以上功能的實現在編輯框的OnKeyPress事件處理過程中。
procedure TSetPassWordForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Edit1.text = '' then Exit;
if Key = #13 then
begin
if Verified then
if StrPas(PassWord) = Edit1.text then
begin
OKBtn.Enabled := True;
Edit1.Enabled := False;
OKBtn.SetFocus;
end
else
begin
Verified := False;
MessageDlg('PassWord is InValid.',mtWarning,[mbOK],0);
Edit1.text := '';
PassWord := '';
Label1.Caption := 'Please Input PassWord:';
end
else
begin
Verified := True;
StrPCopy(PassWord,Edit1.text);
Edit1.text := '';
Label1.caption := 'Please Verify PassWord:';
end;
Key := #0;
end;
end;
口令檢查窗口的實現相對簡單,只定義了一個輸出函數GetPassWord,用于生成口令檢查窗口并返回口令檢查的結果。
function GetPassword(Password: PChar): Boolean;
var
GetPasswordForm: TGetPasswordForm;
begin
Result := False;
GetPasswordForm := TGetPasswordForm.Create(Application);
try
with GetPasswordForm do
if ShowModal = mrOK then
if UpperCase(Edit1.Text) <> StrPas(StrUpper(Password)) then
MessageDlg('Invalid Password', mtWarning, [mbOK], 0)
else
Result := True;
finally
PasswordForm.Free;
end;
end;
PassWord為輸入的參數,不能為空,由調用以上函數的程序負責維護。
窗口中用戶輸入口令時回顯在屏幕上的字符由編輯框的PassWordChar屬性確定。
在DLLs的工程文件中,把兩個輸出函數寫到exports子句中。
library PassForm;
uses
GetPass in 'GETPASS.PAS' {PasswordForm},
Setpass in 'SETPASS.PAS' {SetPassWordForm};
exports
GetPassword,SetPassWord;
begin
end.
10.4.2.2 Delphi應用程序調用重用窗體
在Delphi應用程序中調用重用窗體,首先必須包含passform.dll的兩個輸出函數:
function GetPassword(Password: PChar): Boolean;
far; external 'c:\dlls\PassForm';
function SetPassword(PassWord: PChar): Boolean;
far; external 'c:\dlls\PassForm';
這位于程序單元的implementation部分。
而后在過程中調用相應函數實現口令的設置和檢查。程序運行后的界面如圖。
圖10.5 Delphi應用程序調用重用窗體運行界面
口令設置部分的實現代碼為:
procedure TForm1.SetButtonClick(Sender: TObject);
begin
PassWord := StrAlloc(40);
if SetPassWord(PassWord) = False then
MessageDlg('PassWord is not set',mtInformation,[mbOK],0);
end;
首先為口令字符串分配內存。當口令設置窗體按Cancel按鈕取消時,顯示相應的信息。
口令檢查部分的實現代碼為:
procedure TForm1.TestButtonClick(Sender: TObject);
begin
if PassWord = nil then
begin
MessageDlg('Set password first', mtInformation, [mbOK], 0);
SetButton.SetFocus;
Exit;
end;
if GetPassword(PassWord) then
Label1.Caption := 'You are Wellcome !'
else
Label1.Caption := 'Sorry,You are InValid User.';
end;
根據口令檢查的結果,在標簽框中顯示相應的信息。
10.4.2.3 VB應用程序調用重用窗體
VB是微軟公司極力推薦的一個可視化開發工具。它雖然并不支持動態鏈接庫的創建,但可以調用標準的Windows API動態鏈接庫和用其它語言編寫的動態鏈接庫。為了驗證所生成DLLs的普適性,我們用VB開發了一個簡單的程序來調用passform.dll中儲存的窗體。
VB程序的運行界面如圖,和(10.5)的Delphi程序基本一致。
圖10.6 VB應用程序調用重用窗體運行界面
下面是VB程序的完整代碼,和Delphi程序的對應部分基本一致。
Option Explicit
Declare Function GetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As String) As Integer
Declare Function SetPassWord Lib "c:\dlls\passform.dll" (ByVal PassWord As String) As Integer
Dim PassWord As String * 40
Sub Check_Click ()
If PassWord = "" Then
MsgBox ("Enter sample password first")
SetPass.SetFocus
Else
If GetPassWord(PassWord) Then
StatusLbl.Caption = "You are Welcome!"
Else
StatusLbl.Caption = "Sorry,You are Invalid User."
End If
End If
End Sub
Sub SetPass_Click ()
If SetPassWord(PassWord) = 0 Then
MsgBox ("PassWord is not Set.")
End If
End Sub
有關VB編程的一些具體問題,讀者可參看有關的VB參考書。
10.4.3 小結
本章我們討論的是動態鏈接庫編程。許多可視化開發工具(如Visual Basic)不支持 DLLs的創建,而Delphi在這里又有上乘的表現。特別是窗體重用機制是Delphi對Windows下DLLs編程的一個重大改進。在一般的DLLs編程中也體現了Delphi快捷、方便的特點。動態鏈接庫是
Windows下程序組織的一種重要方式,使用動態鏈接庫可以極大地保護用戶在不同開發工具、不同時期所做的工作。利用動態鏈接庫,用戶可以逐步去構筑自己的程序模塊庫,為今后的工作積累素材。
[上一篇] [下一篇]
[本討論區] [返回首頁] [分類討論區] [全部討論區] 討論區
--
※ 來源:.西北網絡中心兵馬俑 BBS 站 bbs.xanet.edu.cn.[FROM: 202.117.1.151]
返回首頁
分類討論區
全部討論區
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图欧美在线|
国产在线播精品第三|
久久国产生活片100|
日韩一区二区三区视频在线|
青青草国产精品97视觉盛宴|
精品视频一区二区三区免费|
欧美色图天堂网|
欧美日韩大陆在线|
日韩一二三区不卡|
26uuu欧美|
国产精品青草综合久久久久99|
国产精品久久99|
中文字幕在线不卡|
樱桃国产成人精品视频|
亚洲精品成人在线|
亚洲在线视频免费观看|
日韩精品一级中文字幕精品视频免费观看|
婷婷综合另类小说色区|
免费在线看成人av|
国产精品18久久久久久久久|
99r国产精品|
欧美日韩国产123区|
日韩精品一区二区三区老鸭窝|
精品对白一区国产伦|
国产农村妇女毛片精品久久麻豆
|
成人性生交大片免费看视频在线|
国产精品一区二区在线看|
国产91高潮流白浆在线麻豆
|
91精品国产麻豆|
久久精品人人做人人综合
|
亚洲国产视频直播|
免费看日韩精品|
av网站免费线看精品|
欧美日本精品一区二区三区|
国产欧美一二三区|
亚洲午夜久久久久|
国产九九视频一区二区三区|
在线视频国内一区二区|
久久亚洲二区三区|
亚洲精品乱码久久久久久日本蜜臀|
日韩高清在线电影|
99视频有精品|
欧美va亚洲va在线观看蝴蝶网|
综合久久久久综合|
久久丁香综合五月国产三级网站|
www.亚洲激情.com|
日韩欧美一卡二卡|
一区二区三区在线视频免费
|
99久久er热在这里只有精品15|
欧美色综合影院|
国产精品免费久久久久|
日韩电影在线一区二区|
91免费版在线看|
久久女同互慰一区二区三区|
天天综合日日夜夜精品|
国产成人啪午夜精品网站男同|
欧美日韩mp4|
亚洲天堂福利av|
丁香婷婷综合五月|
精品88久久久久88久久久|
午夜一区二区三区视频|
91美女福利视频|
国产精品久久久久一区|
国产很黄免费观看久久|
精品久久久久久久久久久久包黑料
|
国产精品美女久久久久久久|
韩国中文字幕2020精品|
欧美一区二区免费观在线|
亚洲高清免费一级二级三级|
在线精品观看国产|
成人欧美一区二区三区黑人麻豆|
国产激情91久久精品导航
|
国产精品传媒入口麻豆|
国产一区二区三区最好精华液|
日韩亚洲欧美成人一区|
亚洲国产成人高清精品|
色狠狠综合天天综合综合|
国产精品日韩精品欧美在线|
成人国产电影网|
国产精品久久久久久久久动漫|
成人爱爱电影网址|
国产精品久久久久久久裸模|
av福利精品导航|
亚洲另类春色国产|
在线观看一区不卡|
亚洲高清在线精品|
91精品国产色综合久久不卡蜜臀
|
成人美女在线观看|
国产精品私人自拍|
成人av网在线|
亚洲制服丝袜在线|
6080日韩午夜伦伦午夜伦|
亚洲第一激情av|
日韩亚洲欧美综合|
国内精品伊人久久久久av影院|
久久久夜色精品亚洲|
国产激情91久久精品导航|
国产精品理论片在线观看|
色婷婷综合久久久久中文
|
自拍偷自拍亚洲精品播放|
av电影天堂一区二区在线
|
日韩avvvv在线播放|
日韩精品一区二区三区四区视频|
国产乱一区二区|
亚洲另类在线视频|
日韩视频免费观看高清完整版|
精品一区二区三区影院在线午夜|
久久久国产午夜精品
|
亚洲国产一区视频|
精品久久人人做人人爱|
eeuss鲁片一区二区三区|
亚洲一区二区三区国产|
精品福利一区二区三区|
91精品福利视频|
国模娜娜一区二区三区|
亚洲色图在线播放|
日韩一区二区三区电影
|
亚洲欧美日韩精品久久久久|
欧美日韩免费电影|
国产成都精品91一区二区三|
性做久久久久久免费观看|
国产欧美精品一区二区色综合|
欧美日韩中文精品|
高清不卡一区二区|
石原莉奈在线亚洲三区|
国产精品五月天|
欧美电影免费观看高清完整版在线观看|
99久久99久久精品免费看蜜桃|
美国av一区二区|
一区二区三区欧美日韩|
久久久亚洲精华液精华液精华液|
在线免费不卡视频|
国产成人免费av在线|
免费在线看成人av|
一级精品视频在线观看宜春院
|
日韩一卡二卡三卡四卡|
91片黄在线观看|
国产aⅴ综合色|
久久激情综合网|
视频在线观看一区二区三区|
日韩理论片一区二区|
国产精品无人区|
国产亚洲综合色|
精品国产一区二区三区不卡
|
成人av先锋影音|
国产精品一区免费在线观看|
精品一区二区免费看|
日韩电影免费在线看|
午夜私人影院久久久久|
午夜精品久久久久久久|
亚洲精品国产一区二区精华液
|
中文字幕二三区不卡|
欧美精品一区在线观看|
欧美岛国在线观看|
日韩欧美高清在线|
精品精品国产高清a毛片牛牛
|
亚洲视频免费看|
日韩一区中文字幕|
亚洲日本乱码在线观看|
亚洲六月丁香色婷婷综合久久|
国产精品福利电影一区二区三区四区|
久久久久久久电影|
欧美激情一区二区三区在线|
国产精品久久久久久久久快鸭|
中文字幕在线观看不卡|
亚洲视频免费看|
亚洲午夜三级在线|
日欧美一区二区|
美女视频黄a大片欧美|
国产一区三区三区|
丁香网亚洲国际|
91久久一区二区|
69久久夜色精品国产69蝌蚪网|
日韩一区二区三区免费观看|
欧美r级在线观看|
国产女人18水真多18精品一级做|
国产精品久久久久久久蜜臀|
一二三四社区欧美黄|
免费观看日韩av|
国产成人啪免费观看软件|
一本大道av伊人久久综合|
欧美日韩高清影院|
26uuu久久天堂性欧美|
国产精品不卡在线|
亚洲成人免费看|
国产精品99久久久久久久女警
|
av在线不卡免费看|
精品视频免费在线|
久久在线观看免费|
亚洲综合在线观看视频|
日韩精品乱码av一区二区|
国产一区欧美二区|
91久久奴性调教|
久久久久久一级片|
一区二区久久久久|
国产成人在线看|
欧美日本韩国一区二区三区视频|
国产日产亚洲精品系列|
图片区小说区区亚洲影院|
成人深夜视频在线观看|