保密卡程序的编写
????
?一直用巨盾自帶的保密卡程序,每次都要啟動巨盾,然后輸密碼查保密卡。感覺不是很好,一是巨盾占內存資源大,二是程序界面不很友好,不太喜歡。故根據自己的喜好和設想,設計編寫一個保密卡程序。
實現的功能:
一、輸入正確的密碼后顯示保密卡界面,防止別人偷偷使用。
二、卡上坐標顯示,有形象的十字指示標志。
三、點下相應坐標后顯示密碼,點擊其他坐標后原坐標位置隱藏。
四、支持多個卡操作。
五、顯示卡時防截屏。
六、程序加密。
?
第一個功能:實現很簡單,用一個分組框覆蓋總程序界面,用一個編輯框,加一個按鈕,通過判斷輸入密碼和設定密碼是否一致來取消分組框的顯示。
第二個功能:程序的難點,我的想法是通過建立組件數組來動態創建BitBtn組件,然后通過鼠標的進入離開事件來實現十字指示標志。
第三個功能:通過建立一個臨時BitBtn組件記錄上次按下的組件位置,通過visble屬性來實現。
第四個功能:簡單,image組件讀入不同的卡就可以。
第五個功能:一般,用時鐘組件,反復清空剪輯板可實現。
第六個功能:簡單,現成的exe加殼工具如aspack,ups等。
?
下面是窗體代碼:
unit USafeCard;{$R 'Card.res' 'Card.rc'} interfaceusesWindows, SysUtils, Classes, Forms,Dialogs,Graphics,Clipbrd,StdCtrls, ExtCtrls, Buttons, Controls;typeTForm8 = class(TForm)GroupBox1: TGroupBox;Image1: TImage;BitBtn1: TBitBtn;Button1: TButton;Button2: TButton;Shape1: TShape;Label1: TLabel;Label2: TLabel;Panel1: TPanel;Timer1: TTimer;GroupBox2: TGroupBox;Edit1: TEdit;Button3: TButton;procedure BitBtn1Click(Sender: TObject);procedure BitBtn1MouseEnter(Sender: TObject);procedure BitBtn1MouseLeave(Sender: TObject);procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Shape1MouseEnter(Sender: TObject);procedure Shape1MouseLeave(Sender: TObject);procedure Timer1Timer(Sender: TObject);procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm8: TForm8;BitBtn:array[1..8,1..15] of TBitBtn;//二維數組組件的定義BitBtnTemp:TBitBtn;//記錄上次點擊按鈕的臨時組件implementation{$R *.dfm}procedure TForm8.BitBtn1Click(Sender: TObject); begin(Sender as TBitBtn).Visible:=False;if BitBtnTemp=nil thenbeginBitBtnTemp:= (Sender as TBitBtn);Exit;end;if not(BitBtnTemp=nil) thenbeginBitBtnTemp.Visible:=True;BitBtnTemp:=(Sender as TBitBtn);Exit;end; end;procedure TForm8.BitBtn1MouseEnter(Sender: TObject); var BBTemp:TBitBtn; PosX,PosY:Integer; i,j:Integer; beginBBTemp:=(Sender as TBitBtn);PosY:=BBTemp.Tag div 10;//10-150PosX:=BBTemp.Tag mod 10;//1-8Label2.Caption:=Char(PosX+64)+IntToStr(PosY div 10);//Char(65):Afor i := 1 to 8 dobeginif i=PosX thenbeginfor j := 1 to 15 dobeginBitBtn[i,j].Kind:=bkRetry;BitBtn[i,j].Caption:='&';end;end;end;for j := 1 to 15 dobeginif j=(PosY div 10) thenbeginfor i := 1 to 8 dobeginBitBtn[i,j].Kind:=bkRetry;BitBtn[i,j].Caption:='&';end;end;end;end;procedure TForm8.BitBtn1MouseLeave(Sender: TObject); var i,j:Integer; beginImage1.Visible:=False;for i := 1 to 8 dobeginfor j := 1 to 15 dobeginif BitBtn[i,j].Kind=bkRetry thenbeginBitBtn[i,j].Kind:=bkCustom;BitBtn[i,j].Glyph:=nil;BitBtn[i,j].Caption:='';end;end;end;Image1.Visible:=True;//有時刷新會暴露按鈕后的圖片,不知何原因,故控制圖片的顯示時間 end;procedure TForm8.Button1Click(Sender: TObject); beginImage1.Picture.Bitmap.LoadFromResourceName(HInstance,'ABNNEK'); //Load card1 模糊名稱if not(BitBtnTemp=nil) thenbeginBitBtnTemp.Visible:=True;BitBtnTemp:=nil;end; end;procedure TForm8.Button2Click(Sender: TObject); beginImage1.Picture.Bitmap.LoadFromResourceName(HInstance,'BBTKR'); //Load card2if not(BitBtnTemp=nil) thenbeginBitBtnTemp.Visible:=True;BitBtnTemp:=nil;end; end;procedure TForm8.Button3Click(Sender: TObject); beginif Edit1.Text='mmm ' thenGroupBox2.Visible:=False; end;procedure TForm8.FormCreate(Sender: TObject); var i,j:Integer; beginSetWindowPos(Handle,HWND_TOPMOST,0,0,Self.Width,Self.Height,SWP_SHOWWINDOW);//令窗體在最前for i := 1 to 8 dobeginfor j := 1 to 15 dobeginBitBtn[i, j]:=TBitBtn.Create(Self);//動態創建組件,create參數多用self,也就是窗體本身BitBtn[i, j].Parent:=Panel1;//動態創建組件,要正常顯示需指定父容器BitBtn[i, j].Width:=30;BitBtn[i, j].Height:=28; //大小BitBtn[i, j].Left:=29*(i-1);BitBtn[i, j].Top:=26*(j-1); //位置BitBtn[i, j].OnClick:=BitBtn1Click; //批量響應事件BitBtn[i, j].OnMouseEnter:=BitBtn1MouseEnter;BitBtn[i, j].OnMouseLeave:=BitBtn1MouseLeave;BitBtn[i, j].TabStop:=False;BitBtn[i, j].Tag:=100*j+i;//通過tag來識別組件end;end;Image1.Picture.Bitmap.LoadFromResourceName(HInstance,'ABNNEK'); //Load card1 模糊名稱Edit1.SetFocus; end;procedure TForm8.Shape1MouseEnter(Sender: TObject); beginShape1.Pen.Mode:=pmNop;//顯示卡序號 end;procedure TForm8.Shape1MouseLeave(Sender: TObject); beginShape1.Pen.Mode:=pmWhite;//覆蓋卡序號 end;procedure TForm8.Timer1Timer(Sender: TObject); beginClipboard.Clear;//引用Clipbrd單元,則可以直接調用Clipboard全局變量。 end;end. ? 下面是資源代碼: ABNNEK BITMAP "1.bmp" BBTKR BITMAP "2.bmp" 幾點心得體會: 一、數組的使用。看明白和會使用是兩回事,如何定義,如何使用要通過實踐來加深記憶。 二、剪輯板的使用,Clipbrd組件use后Clipboard就代表系統剪輯板。 三、div和mod對定位坐標的使用。 四、組件tag屬性的用途,在這個程序里我吧組件信息存在里面了。轉載于:https://www.cnblogs.com/delphi7456/archive/2010/10/27/1862973.html
總結
- 上一篇: 计算机导论123出栈顺序,优·计算机导论
- 下一篇: ADB命令中循环执行某个命令