明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

記憶參數(shù)的設(shè)置

[摘要]---- 我們平時(shí)用的很多軟件都具有一些記憶功能,如foxmail和TheBat等等。這些軟件能在啟動(dòng)時(shí)自動(dòng)的保持上一次關(guān)閉軟件時(shí)的一些狀態(tài),如窗口的初始位置,用戶在軟件中設(shè)置的一些特性(如窗口風(fēng)格,橫相排列還是豎相排列等等),如果能讓我們的程序也具有這樣的一些功能可以使我們程序看起來更專業(yè)性一些...
---- 我們平時(shí)用的很多軟件都具有一些記憶功能,如foxmail和TheBat等等。這些軟件能在啟動(dòng)時(shí)自動(dòng)的保持上一次關(guān)閉軟件時(shí)的一些狀態(tài),如窗口的初始位置,用戶在軟件中設(shè)置的一些特性(如窗口風(fēng)格,橫相排列還是豎相排列等等),如果能讓我們的程序也具有這樣的一些功能可以使我們程序看起來更專業(yè)性一些:) 這里我就來講一下怎樣使應(yīng)用程序能記住上一次關(guān)閉時(shí)的窗口位置,并在下一次啟動(dòng)時(shí)和上一次的位置一樣。  

---- 既然要保留信息,就一定要涉及到存貯的問題。數(shù)據(jù)的存貯有好幾種辦法,可以寫.ini或.inf文件,還可以用Delphi提供的文件類來自定義一個(gè)文件,還可以用數(shù)據(jù)庫接口(如ODBC)引入一種數(shù)據(jù)庫文件,foxpro 的.dbf和Access的.mdb比較常用,還可以直接往Windows的注冊(cè)表里寫。寫.ini和.inf文件沒有任何的安全性,且不適合win95,還記得在94,95年時(shí)用中文的Windows3.2中大量的用到了.ini文件,但Windows95出現(xiàn)后,微軟建議盡可能的把信息寫到注冊(cè)表中。用ODBC的話會(huì)給程序帶來很多不必要的麻煩,如會(huì)使程序更加復(fù)雜,需要相應(yīng)的DBMS的驅(qū)動(dòng)程序的支持,如果沒有相應(yīng)數(shù)據(jù)源的驅(qū)動(dòng)程序,則該數(shù)據(jù)源就不能使用,還有安全性問題也不能很好的解決。  

---- 在這里推薦使用寫注冊(cè)表的方法。因?yàn)檫@種方法很方便,不需太多額外的開銷,程序比較簡(jiǎn)單,對(duì)一般的用戶來說在注冊(cè)表里找到有用的信息比打開.ini文件要麻煩的多。所以注冊(cè)表的安全性比.ini文件要略強(qiáng)一些。  

---- 使應(yīng)用程序能記住上一次關(guān)閉時(shí)的窗口位置,并在這一次啟動(dòng)時(shí)和上一次的位置一樣。總體思路是這樣的:在關(guān)閉程序時(shí)要記錄下本次程序結(jié)束時(shí)的信息,寫入注冊(cè)表中,在下次程序啟動(dòng)時(shí)讀注冊(cè)表中相應(yīng)信息,并賦給程序。  

---- 對(duì)于我們這個(gè)程序來說主要需要記錄的信息是窗口關(guān)閉時(shí)的Top,Left,Height,Width。  

---- 注意:要想使Delphi可以操作注冊(cè)表,必須包括registry單元。  

---- 以下是源程序和相關(guān)注釋:  

   unit Unit1;

   interface

   uses
Windows, Messages,. . . . . . . ,registry;
//包括registry單元
   type
         TForm1 = class(TForm)
            .
            .
            .
         public
           ww:TRegistry;                    
//聲明一個(gè)TRegistry對(duì)象,我們就通過ww來
實(shí)現(xiàn)對(duì)注冊(cè)表的操作

//啟動(dòng)窗口時(shí)要做的一些工作
procedure TForm1.FormCreate(Sender: TObject);
begin
  ww:=TRegistry.Create;                    
//創(chuàng)建ww對(duì)象
  ww.RootKey :=HKEY_CURRENT_USER;          
//注意:通過修改RootKey可以把信息寫到注冊(cè)表的每一個(gè)角落
  ww.OpenKey('software',FALSE);            
//打開鍵software,可以看到Borland,Netscape
還有Microsoft也在這個(gè)software鍵中
  ww.CreateKey( '王偉');                   
//在software鍵中創(chuàng)建一個(gè)名為“王偉“的鍵值,
使自己的名字和Borland,Netscape,
//Microsoft并排在一起,是不是很Cool啊:)
  ww.OpenKey( '王偉',FALSE);               
//打開鍵"王偉"
  ww.CreateKey('XX單位XX管理系統(tǒng)');        
//創(chuàng)建應(yīng)用程序的名稱
  ww.OpenKey('XX單位XX管理系統(tǒng)',TRUE);
  ww.CreateKey('位置');                    
//創(chuàng)建應(yīng)用程序中某一個(gè)要存貯的項(xiàng)目的名稱,便于管理
  ww.OpenKey('位置',TRUE);
  if (ww.ReadString('first')<>'1')then     
//這是值得注意的一個(gè)地方,通過“first“來判斷程序是否
    begin                                  
//是第一次寫注冊(cè)表,如果是第一次寫則用程序給的默認(rèn)值來
    ww.WriteString('first','1');           
//設(shè)置窗口的位置和大小。如果不是第一次啟動(dòng)應(yīng)用程序則說明
    Form1.WindowState:=(wsNormal);         
//注冊(cè)表中已經(jīng)寫了位置信息,就讀這些信息并賦給Form。
    Form1.Top:=10;
    form1.Left:=10;
    form1.Height:=100;
    form1.Width:=100;
    end
  else
  begin
    if(ww.ReadString('max')='y') then      
//判斷上次關(guān)閉程序時(shí),窗口是否是最大化的。如果是的話,則
      Form1.WindowState:=(wsMaximized)     
//繼續(xù)使窗口擁有這一特征。
    else
    begin
    Form1.top:=StrToInt(ww.ReadString('top'));    
//如果不是最大化,則取位置和大小數(shù)據(jù)賦給From
    Form1.left:=StrToInt(ww.ReadString('left'));
    Form1.height:=StrToInt(ww.ReadString('height'));
    Form1.width:=StrToInt(ww.ReadString('width'));
    end;
  end;
end;

//關(guān)閉窗口時(shí)要做的一些工作       
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ww.OpenKey('位置',FALSE);                  
//打開“位置”鍵
  if Form1.WindowState=(wsMaximized) then    
//如果當(dāng)前程序是最大化,則把這一信息寫入注冊(cè)表,
    ww.WriteString('max','y')                
//便于下一次時(shí)使用。
  else
  begin
  ww.WriteString('max','n');                 
//如果不是最大化,則把窗口的位置和大小數(shù)據(jù)寫入注冊(cè)表中。
  ww.WriteString('top',IntToStr(Form1.top));
  ww.WriteString('left',IntToStr(Form1.left));
  ww.WriteString('height',IntToStr(Form1.Height));
  ww.writeString('width',IntToStr(Form1.Width));
  end;
end;
 

---- 需要注意的幾點(diǎn):  

---- 1:因?yàn)槌绦虿豢赡茉诘谝淮问褂脮r(shí),就從注冊(cè)表里讀數(shù)據(jù),所以第一次必須由程序賦一個(gè)初值。然后做上標(biāo)記,表示已經(jīng)有過第一次了,以后只要判斷出不是第一次了,就可以讀數(shù)據(jù)了。(這點(diǎn)最重要,由這一點(diǎn)還可以引出一個(gè)話題,那就是可以做一個(gè)Demo版的軟件,每次啟動(dòng)時(shí)往注冊(cè)表里加個(gè)1,當(dāng)>10時(shí),就不許用該軟件了,cool吧)  

---- 2:往注冊(cè)表里可以寫string型數(shù)據(jù),也可以寫Integer型數(shù)據(jù),但在注冊(cè)表中的Integer型數(shù)據(jù)是以16進(jìn)制形式存在的,而我們?cè)诔绦蛑杏玫亩际?0進(jìn)制數(shù),所以干脆寫string型,然后用StrToInt或IntToStr轉(zhuǎn)換。  

---- 3:寫注冊(cè)表并不是很安全的,它的內(nèi)容可以用RegEdit一覽無佘的看到,所以千萬不能將一些重要的信息(如密碼)不經(jīng)加密而直接寫入注冊(cè)表,這樣做是非常危險(xiǎn)的!