欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      delphi24點(diǎn)游戲

      時(shí)間:2019-05-12 22:29:44下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫小編為你整理了多篇相關(guān)的《delphi24點(diǎn)游戲》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《delphi24點(diǎn)游戲》。

      第一篇:delphi24點(diǎn)游戲

      第3章 “速算24”撲克游戲--單元、異常、邏輯

      3.1 “速算24”撲克游戲效果說明

      “速算24”是一個(gè)考察心算能力、有助于開發(fā)智力的撲克游戲。在給出4張撲克牌之后,要求應(yīng)用這些撲克牌數(shù)字做數(shù)學(xué)運(yùn)算,迅速構(gòu)造出一個(gè)數(shù)學(xué)表達(dá)式,得出結(jié)果24。這個(gè)游戲的關(guān)鍵在于迅速判斷用戶輸入的表達(dá)式是否正確,并做出相應(yīng)的反饋,告訴用戶是算對(duì)了還是算錯(cuò)了。游戲的初始界面如圖3.1所示。

      圖3.1 游戲的初始界面

      當(dāng)用戶單擊“開始”按鈕時(shí),系統(tǒng)開始發(fā)牌,隨機(jī)發(fā)出4張牌,如圖3.2所示為隨機(jī)開始的一局游戲,給出的4張紙牌分別為“9”,“8”,“9”,“2”。在文本框中輸入運(yùn)算表達(dá)式,比如,輸入“8*(2+(9-9))”,單擊“計(jì)算”按鈕,系統(tǒng)會(huì)出現(xiàn)提示框,顯示“您輸入的表達(dá)式的計(jì)算結(jié)果為16!”,告訴你該表達(dá)式的結(jié)果不是“24”,如圖3.3所示。單擊“確定”按鈕,再次在文本框中輸入表達(dá)式,比如“8*(2+(9/9))”,單擊“計(jì)算”按鈕,系統(tǒng)會(huì)出現(xiàn)提示框,顯示“您真行,我服了您!”,表明運(yùn)算正確,如圖3.4所示。

      圖3.2 系統(tǒng)隨機(jī)發(fā)4張紙牌

      圖3.3 運(yùn)算式不正確

      圖3.4 運(yùn)算式正確

      這個(gè)游戲具體的規(guī)則如下:

      (1)單擊“開始”按鈕,游戲開始,系統(tǒng)將隨機(jī)發(fā)牌。

      (2)請(qǐng)迅速在文本框中輸入運(yùn)算表達(dá)式,然后單擊“計(jì)算”按鈕。

      (3)這時(shí)系統(tǒng)會(huì)提示您的運(yùn)算是對(duì)了還是錯(cuò)了,在彈出的對(duì)話框中單擊“OK”按鈕,再次輸入新的運(yùn)算表達(dá)式,重復(fù)上一步,直到您的運(yùn)算表達(dá)式結(jié)果正確,這時(shí)系統(tǒng)會(huì)恭喜您!

      (4)如果結(jié)果錯(cuò)了還想繼續(xù)或者中途想計(jì)算另一局撲克牌,就單擊“重新開始”按鈕,得到新一局撲克牌進(jìn)行游戲。

      下面,我們開始循序漸進(jìn)地創(chuàng)建這個(gè)小游戲。在最開始,游戲的界面和效果都會(huì)非常簡(jiǎn)單,在后面我們會(huì)逐漸地完善它。

      第3章 “速算24”撲克游戲--單元、異常、邏輯

      3.2 生成和建立程序(1)在程序中用到了Image組件,用于放置圖片。還用到了Timer組件,用于計(jì)算用戶操作時(shí)間。下面我們來生成游戲的基本框架。

      3.2.1 Image組件

      Image組件在Additional頁上,用來在窗口中顯示一幅圖片。它擁有如下幾個(gè)主要屬性: 1.Picture屬性

      可以在picture屬性中調(diào)入圖像文件。Delphi支持多種圖像格式,如位圖(.BMP)、圖標(biāo)(.ICO)、圖元(.WFM)、動(dòng)畫光標(biāo)(.ANI)、JPEG圖片(.JPG、.JPEG)等。

      2.AutoSize屬性

      當(dāng)AutoSize為True時(shí),Image組件將根據(jù)它所包含的圖像的大小來調(diào)整自身的大??;當(dāng)AutoSize為False時(shí),不論圖像有多大,組件將保持設(shè)計(jì)時(shí)的大小。如果組件比圖像小,那么只有一部分圖像是可見的。

      3.Stretch屬性

      當(dāng)Stretch為True時(shí),位圖圖像將根據(jù)組件的大小調(diào)整自身的大小,當(dāng)組件大小改變時(shí),上述三種文件也做相應(yīng)變化。Stretch屬性對(duì)圖標(biāo)沒有作用。

      上述的AutoSize和Stretch屬性決定了圖像在窗口中的顯示尺寸。

      圖3.5演示的3個(gè)Image分別為:AutoSize為True,AutoSize為False,Stretch為True的情形??梢钥吹?,Image的原始尺寸比圖片寬,矮,在上面的屬性設(shè)置下,就會(huì)有不同的顯示效果。

      圖3.5 AutoSize和Stretch的設(shè)置 3.2.2 Timer組件

      在Delphi中,組件分可視組件和非可視組件??梢暯M件是指那些在運(yùn)行期間仍然能顯示的組件,例如Label,Button,Image組件等。非可視組件是指那些在程序界面設(shè)計(jì)期間可見,而在程序運(yùn)行時(shí)不可見的組件,例如在System頁上的Timer組件。

      Timer組件能夠有規(guī)律地觸發(fā)OnTimer事件,發(fā)送信息給應(yīng)用程序,它是編制應(yīng)用程序時(shí)最為重要的組件之一。

      1.Timer組件的屬性

      Enabled屬性表示Timer是打開還是關(guān)閉。用Interval屬性設(shè)置兩個(gè)OnTimer事件間的間隔,單位是毫秒。將間隔設(shè)置為0相當(dāng)于關(guān)閉計(jì)時(shí)器,Interval是Cardinal類型的,最大值可到4294967295,當(dāng)然程序中一般不會(huì)把Interval設(shè)成很大的值。2.Timer組件的使用

      Timer是獨(dú)立的對(duì)象,在啟動(dòng)與Windows無關(guān)的邏輯和應(yīng)用事件時(shí)極其有用??梢阅M時(shí)鐘或計(jì)時(shí)器,可視地顯示經(jīng)過的時(shí)間;可以用作系統(tǒng)延時(shí),Delphi提示信息出現(xiàn)只需在該區(qū)域停頓幾秒,就是Timer組件應(yīng)用的一個(gè)例子;可以檢查系統(tǒng)環(huán)境、事件,根據(jù)結(jié)果進(jìn)行響應(yīng);也可以在窗口中閃爍一段正文或圖像,提示某種操作或處理正在進(jìn)行等等。

      盡管Delphi的計(jì)時(shí)器每秒可以產(chǎn)生1000次激發(fā),在編程中還必須注意程序?qū)imer觸發(fā)的響應(yīng)。如果程序處理OnTimer事件的時(shí)間超過Interval的設(shè)定值,就可能錯(cuò)過事件,因?yàn)楫?dāng)下一次觸發(fā)到來時(shí),系統(tǒng)正忙于處理上一事件,則這次觸發(fā)就會(huì)被忽略。同時(shí)要注意其他的Windows應(yīng)用程序是否會(huì)影響Timer的觸發(fā)。如果后臺(tái)正運(yùn)行著一個(gè)占用處理器的程序,就可能會(huì)導(dǎo)致Timer的觸發(fā)不準(zhǔn)確,從而使前臺(tái)程序運(yùn)行出現(xiàn)錯(cuò)誤。

      這里要強(qiáng)調(diào)的是Timer組件是一個(gè)非可視組件,可以把它放置到窗體或者其他容器組件上的任何位置。3.實(shí)現(xiàn)游戲計(jì)時(shí)功能

      在本章的游戲中,我們加入一個(gè)Timer組件,實(shí)現(xiàn)游戲的計(jì)時(shí)功能。

      在窗體中加入一個(gè)Label組件,將此組件的Caption屬性設(shè)置為“使用時(shí)間”,然后從組件面板上選擇System頁中的Timer組件。

      在Unit1中加入Form1的一個(gè)私有成員SpendTime,記錄用戶計(jì)算所用的時(shí)間。代碼如下所示:

      private { Private declarations } SpendTime:Integer;在Form1的onCreate事件中加入如下代碼。將SpendTime設(shè)置為0,并將Timer1的Enabled屬性設(shè)置為False,使Timer1組件不能響應(yīng)OnTimer事件;并將Timer1的Interval屬性設(shè)置為1000,表示當(dāng)Timer1有效時(shí),每間隔1000ms(即1秒)發(fā)生一次OnTimer事件:

      procedure TForm1.FormCreate(Sender: TObject);var i:integer;begin //初始化,設(shè)置數(shù)組RandomData的長(zhǎng)度為4 //并將每個(gè)數(shù)組元素初始化為零

      setLength(RandomData,4);for i := 0 to 3 do RandomData[i]:=0;SpendTime:=0;Timer1.Enabled:=False;Timer1.Interval:=1000;end;然后在標(biāo)題為“開始”的“開始”按鈕的OnClick事件中,加入如下所示的代碼,將Timer1的Enabled屬性設(shè)置為True,使Timer1組件有效,即現(xiàn)在Timer1能響應(yīng)OnTimer事件,計(jì)時(shí)開始。并將SpendTime重新設(shè)置為0:

      Timer1.Enabled:=True;Timer1.Interval:=1000;SpendTime:=0;//將SpendTime重新設(shè)為0 再在“計(jì)算”按鈕的OnClick事件句柄中,增加下面的語句,使Timer1無效:

      Timer1.Enabled:=False;最后雙擊Timer1組件,創(chuàng)建Timer1的OnTimer事件句柄,在其中加入如下所示的代碼,將SpendTime加1,并設(shè)置Label5的Caption屬性:

      procedure TForm1.Timer1Timer(Sender: TObject);begin SpendTime:=SpendTime+1;Label5.Caption:='使用時(shí)間:'+IntToStr(SpendTime)+'秒';end;這樣,每隔1秒鐘,程序就刷新一次使用時(shí)間。

      3.2.3 設(shè)計(jì)初始界面

      按住Shift鍵,然后單擊組件面板中Additional頁中的Image組件,這時(shí)該組件邊緣出現(xiàn)藍(lán)色的邊框,并且凹陷下去,表示可以在窗體上連續(xù)加入幾個(gè)Image組件。選擇好Image組件后,在窗體的左上角單擊,加入1個(gè)Image組件,然后依次向右單擊鼠標(biāo)3次,再加入3個(gè)Image組件。最后再單擊組件面板中最左邊的箭頭。

      為了排列這4個(gè)Image組件,先利用Shift鍵將它們同時(shí)選上,然后右擊,選擇Align命令,在隨后出現(xiàn)的Alignment對(duì)話框中的Horizontal選項(xiàng)組中選擇Space equally,在Vertical選項(xiàng)組中選擇Tops,表示這4個(gè)組件頂端對(duì)齊,水平方向上間距相等。

      按照同樣的方法加入4個(gè)Label組件、3個(gè)Button組件和1個(gè)Edit組件。按照表3.1所示設(shè)置各個(gè)組件的屬性。

      表3.1 各個(gè)組件的屬性

      組件名 Form1 Label1 屬性名 Caption Caption AutoSize WordWrap Caption

      屬性值 速算24

      1.單擊“開始”按鈕,游戲開始,系統(tǒng)將發(fā)出4張撲克牌

      False False

      2.要求用戶利用撲克牌顯示的數(shù)字,通過加減乘除運(yùn)算,以最快的速度得出24(可以使用括號(hào)),JQKA和“王”算做1。然后在文本框中寫好表達(dá)式,接

      著單擊“計(jì)算”按鈕

      Label2

      Label3 AutoSize WordWrap Caption

      False True

      3.這時(shí)系統(tǒng)會(huì)計(jì)算輸入表達(dá)式的結(jié)果,告訴用戶是對(duì)還是錯(cuò)了。在彈出的對(duì)話框中單擊“OK”按鈕,如果錯(cuò)了可以再次輸入新的表達(dá)式,重復(fù)上一步。直

      到您的表達(dá)式正確,這時(shí)系統(tǒng)會(huì)恭喜算對(duì)了!

      Label4 AutoSize WordWrap Caption AutoSize Caption Caption Caption Text

      False True 在下面輸入數(shù)學(xué)表達(dá)式

      False 開始 計(jì)算 退出游戲 空

      Button1 Button2 Button3 Edit1

      現(xiàn)在同時(shí)選擇Label1,Label2和Label3,將它們左對(duì)齊,垂直方向等距離排列。將Button1,Button2和Button3左對(duì)齊,垂直方向等距離排列。

      下面放置4個(gè)Image組件,用于放置4張紙牌的圖片。

      先選擇Image1,然后切換到對(duì)象查看器中的屬性編輯器,選擇屬性選項(xiàng)頁中的Picture屬性,然后在Picture屬性值欄中雙擊,或單擊此屬性值旁邊的帶有省略號(hào)的按鈕,打開Picture Editor對(duì)話框,如圖3.6所示。然后單擊Load按鈕,彈出Load Picture對(duì)話框,在此對(duì)話框中選擇background.bmp文件。最后單擊OK按鈕,退出Picture Editor對(duì)話框。

      圖3.6 指定圖片

      使用同樣的方法,設(shè)定其他3個(gè)Image組件的Picture屬性。

      保存我們的新項(xiàng)目,運(yùn)行之后界面如圖3.7所示,與運(yùn)行時(shí)的界面圖3.1稍有不同。這里是設(shè)計(jì)時(shí)界面,只有界面沒有事件響應(yīng)。是程序創(chuàng)建過程中的一個(gè)步驟的檢驗(yàn)。但是,這個(gè)程序還沒有什么具體的功能,為了讓游戲運(yùn)行起來,必須添加代碼,創(chuàng)建相應(yīng)的事件處理程序。

      第3章 “速算24”撲克游戲--單元、異常、邏輯

      ????生成和建立程序????

      ???????

      3.2.4 事件處理

      需要添加?個(gè)事件:第一個(gè)用于響應(yīng)單擊?開始?按鈕,在此事件中完成發(fā)牌,即隨機(jī)顯示圖片;第二個(gè)用于響應(yīng)單擊?計(jì)算?按鈕,解析用戶在文本框中輸入的表達(dá)式,計(jì)算表達(dá)式的結(jié)果,并判斷表達(dá)式的結(jié)果是否等于??;第三個(gè)用于響應(yīng)單擊?退出游戲?按鈕,退出游戲(程

      序)。?

      1.數(shù)據(jù)初始化

      創(chuàng)建窗體的????????事件處理程序,在這里進(jìn)行必要的初始化。?第一步先在Unit1中添加Form1的私有成員數(shù)組:

      private

      { Private declarations }

      RandomData:array of Integer;然后,在對(duì)象查看器中選中Form1,選中Event選項(xiàng)卡,在OnCreate一欄對(duì)應(yīng)的右邊的空白欄中雙擊,創(chuàng)建OnCreate函數(shù)。添加如下代碼。

      procedure TForm1.FormCreate(Sender: TObject);

      var

      i:integer;

      begin //初始化,設(shè)置數(shù)組RandomData的長(zhǎng)度為4

      //并將每個(gè)數(shù)組元素初始化為零

      setLength(RandomData,4);

      for i := 0 to 3 do

      RandomData[i]:=0;

      end;這里使用一個(gè)for循環(huán)語句,i是循環(huán)變量,格式是:for循環(huán)變量:=初值to末值do循環(huán)體。你也可以借助Delphi的自動(dòng)完成功能,在輸入for之后按下Ctrl+J鍵,生成如下代碼:

      procedure TForm1.FormCreate(Sender: TObject);

      begin

      for := to do

      begin end;

      end;在上述代碼中,程序首先利用setLength函數(shù)設(shè)定可變數(shù)組RandomData的數(shù)組長(zhǎng)度為4,然后,將數(shù)組的每一個(gè)單元都設(shè)置為0。這樣,就完成了數(shù)組的數(shù)據(jù)初始化工作。

      2.“開始”按鈕的Click事件處理

      (?)功能?單擊?開始?按鈕時(shí),系統(tǒng)就隨機(jī)地發(fā)出?張紙牌,顯示在?個(gè)?????組件中。?

      (?)代碼?首先,我們需要一個(gè)循環(huán)變量?,一個(gè)字符串變量存放隨機(jī)選取的圖片的文件名。?創(chuàng)建“開始”按鈕的OnClick事件處理程序,在begin前頭添加需要的變量,然后在此事件

      中加入如下所示的代碼。

      procedure TForm1.Button1Click(Sender: TObject);

      var

      i:integer;

      filename:String;

      begin

      Randomize;//初始化隨機(jī)數(shù)

      for i := 0 to 3 do

      begin RandomData[i]:=Random(13)+1;//產(chǎn)生一個(gè)1到13的隨機(jī)數(shù)

      filename:=IntToStr(RandomData[i])+'.bmp';//根據(jù)隨機(jī)數(shù),得到文件名

      //根據(jù)i的不同為不同的Image組件載入圖像文件

      case i of 0 : Image1.Picture.LoadFromFile(filename);1 : Image2.Picture.LoadFromFile(filename);2 : Image3.Picture.LoadFromFile(filename);3 : Image4.Picture.LoadFromFile(filename);

      end;

      edit1.Text:='';

      edit1.SetFocus;

      end;

      end;在Delphi內(nèi)部,隨機(jī)數(shù)的產(chǎn)生實(shí)際上也是在一套算法的控制之下,Randomize函數(shù)用于初始化產(chǎn)生隨機(jī)數(shù)的種子,保證兩次產(chǎn)生的隨機(jī)數(shù)不同,而Random(i:integer)則利用初始化過后的隨機(jī)數(shù)種子產(chǎn)生一個(gè)1~i之間的隨機(jī)數(shù)。這里i設(shè)定為13,以配合撲克牌的張數(shù)13。

      ???????????????????用來將一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)字符串,和上一章中的??????????????????的功能恰好相反。?我們已經(jīng)預(yù)先準(zhǔn)備了位圖文件,它們都是???形式,文件名則是利用數(shù)字????命名。??????中特殊的字符串運(yùn)算符???將兩個(gè)字符串串聯(lián)起來,產(chǎn)生一個(gè)新的字符串,我們需要的位圖文件后綴是???,因此,在產(chǎn)生文件名的時(shí)候,在數(shù)字后面加上??????這個(gè)字符串。?????語句在上一章中已經(jīng)講過,單擊?開始?按鈕后,準(zhǔn)備接受用戶的輸入,然后利用????????方法,把焦點(diǎn)設(shè)置到?????上。????????是??????提供的方法之一,用于設(shè)置輸入

      焦點(diǎn)到某個(gè)指定的組件。?

      3.“計(jì)算”按鈕的OnClick事件

      雙擊“計(jì)算”按鈕,創(chuàng)建此組件的OnClick事件響應(yīng)句柄,然后在代碼編輯器中加入如下所

      示的代碼,用于計(jì)算用戶輸入的表達(dá)式。

      procedure TForm1.Button2Click(Sender: TObject);

      var

      result:integer;

      answer:String;

      begin

      result:=TotalCompute(Edit1.Text);

      if(result=24)then Application.MessageBox('您真行,我服了您!','對(duì)了',MB_OK)

      else

      begin answer:='您輸入的表達(dá)式的計(jì)算結(jié)果為'+IntToStr(Result)+'!';Application.MessageBox(PChar(answer),'錯(cuò)了',MB_OK);

      end;

      end;這段程序根據(jù)自定義函數(shù)的計(jì)算結(jié)果判斷用戶的輸入正確與否,并且輸出相應(yīng)的結(jié)果以提示

      用戶。

      在語句“result:=TotalCompute(Edit1.Text)”中用到了一個(gè)自定義的函數(shù)TotalComp-ute,我們用它來計(jì)算用戶輸入的表達(dá)式?,F(xiàn)在我們還沒編寫這個(gè)函數(shù)的代碼,所以,目前這段代碼是無法運(yùn)行的。沒關(guān)系,可以先把它用“//”注釋掉,然后隨便給 result賦一個(gè)值,測(cè)試這個(gè)事件處理程序的其他部分是否運(yùn)行正常,例如:

      //result:=TotalCompute(Edit1.Text);

      result:=24;這樣,運(yùn)行后,單擊“計(jì)算”按鈕后的顯示如圖3.8所示。

      圖3.8 成功的提示信息

      我們用一個(gè)??????類型的??????變量存放出錯(cuò)信息,但是???????函數(shù)的第一個(gè)參數(shù)要求是?????(????????????????字符指針)類型,因此,我們用一個(gè)強(qiáng)制類型轉(zhuǎn)換將??????轉(zhuǎn)換

      成?????。?4.“退出游戲”按鈕的OnClick事件

      雙擊“退出游戲”按鈕,創(chuàng)建此組件的OnClick事件處理程序,然后在代碼編輯器中加入如

      下所示的代碼,用于退出程序。

      procedure TForm1.Button3Click(Sender: TObject);

      begin

      Close;

      end;在上一章中我們提到可以用?????????????????????代替?????,但這里使用?????來結(jié)束程序的運(yùn)行。這樣,可以通過????????????事件來指定在什么條件下窗體可以關(guān)閉。

      第3章 “速算24”撲克游戲--單元、異常、邏輯

      ????生成和建立程序???????????5.OnCloseQuery事件

      當(dāng)調(diào)用?????方法來關(guān)閉窗體時(shí),????????????事件發(fā)生。利用????????????事件來指定在什么條件下窗體可以關(guān)閉。????????????事件包含一布爾型的????????參量,可以用它來決定窗體是否關(guān)閉。????????的默認(rèn)值為????。?可以利用????????????事件來詢問用戶是否真的希望馬上關(guān)閉窗體。?我們?cè)谶@里彈出一個(gè)對(duì)話框,代碼如下所示:

      procedure TForm1.FormCloseQuery(Sender: TObject;var CanClose: Boolean);begin if(MessageDlg('現(xiàn)在要退出游戲嗎?', mtConfirmation, [mbOk, mbCancel], 0)= mrOk)then canClose:=True else canClose:=False;end;MessageDlg是一種提示對(duì)話框,第一個(gè)參數(shù)是對(duì)話框詢問的訊息,是一個(gè)字符串;第二個(gè)參數(shù)則代表對(duì)話框的類型,mtConfirmation是一個(gè)TMsgDlgType的枚舉類型,表示這個(gè)對(duì)話框是個(gè)確認(rèn)對(duì)話框。TMsgDlgType類型如下所示:

      type TMsgDlgType =(mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);以上定義的對(duì)話框類型分別表示:警告、錯(cuò)誤、提示、確認(rèn)和自定義類型。

      第三個(gè)參數(shù)是TMsgDlgBtn類型的集合,這個(gè)集合包含了類型為TMsgDlgBtn的按鈕,TMsgDlgBtn的定義如下:

      type TMsgDlgBtn =(mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mnNoToAll, mbYesToAll, mbHelp);在我們的程序中,利用了一個(gè)集合[mbOK, mbCancle],表示在對(duì)話框中顯示兩個(gè)按鈕:OK和Cancel的組合。

      最后一個(gè)參數(shù)是用來描述幫助索引的長(zhǎng)整型變量,用來獲取提示用戶的幫助信息,這里我們沒有任何幫助信息,先不管它。??????????函數(shù)和用戶交互,返回一個(gè)????類型的數(shù)字,??????預(yù)先定義了一套數(shù)字,用來直觀地表示對(duì)話框返回信息。如果用戶單擊了??按鈕,這個(gè)對(duì)話框返回????,效果如圖???所示。?

      圖3.9 關(guān)閉窗口時(shí)詢問用戶

      現(xiàn)在,我們已經(jīng)完成了程序的主體部分。??第3章 “速算24”撲克游戲--單元、異常、邏輯

      ????單元間的互相引用????????3.3.1 單元引用的概念

      在第?章關(guān)于單元的知識(shí)里,我們已經(jīng)知道??????可以定義不包含窗體的單元,它集中定義了程序中使用的函數(shù),這一節(jié)里,我們就要實(shí)現(xiàn)這樣的一個(gè)單元,用來實(shí)現(xiàn)上面提到的????????????函數(shù)。?我們可以在任何單元中編寫自己的函數(shù),當(dāng)然包括與窗體相連的單元??墒俏覀兂3P枰玫揭恍┏S玫暮瘮?shù),這時(shí)最好是創(chuàng)建一個(gè)不與窗體相連的獨(dú)立單元,用它來容納自己的函數(shù),這稱為獨(dú)立的單元文件。當(dāng)創(chuàng)建了不與窗體相連的獨(dú)立單元文件后,項(xiàng)目中的其他單元就能很容易地共享這些函數(shù),其他項(xiàng)目也可以很容易地調(diào)用這些函數(shù)了。?對(duì)于單元間的引用,要用到????語句。?3.3.2 uses語句

      ????語句告訴程序在最終的執(zhí)行代碼中需要用到哪些函數(shù)和過程。??????會(huì)自動(dòng)把一些必須的單元包括進(jìn)來,例如???????,????????,????????等。對(duì)于我們自己編寫的單元,如果程序中使用了該單元的函數(shù)或代碼,也需要包括在????部分中。?????語句具有兩種類型:公有引用和私有引用。?在?????????部分包含的????語句代表的是本單元的公有引用,就是說,這部分的引用可以被其他引用本單元的單元繼承性地引用。在?????????部分的????語句應(yīng)包含在?????????部分中的代碼所需要的單元,去掉那些??????可以自動(dòng)加入到程序中的單元。?在?????????部分包含的????語句代表的是本單元的私有引用,就是說,這部分的引用只能被本單元內(nèi)部使用。在??????????????部分的????語句應(yīng)只包含在??????????????部分中的代碼所需的單元的名字。?對(duì)于單元間的引用,要避免交叉引用。假設(shè)有兩個(gè)單元?和?,如果?出現(xiàn)在?的?????????部分的????語句中,那么單元?便不能出現(xiàn)在單元?的?????????的????語句中。因?yàn)檫@樣會(huì)產(chǎn)生對(duì)單元的循環(huán)訪問,編譯時(shí)會(huì)出現(xiàn)錯(cuò)誤信息。?3.3.3 創(chuàng)建另一個(gè)單元

      創(chuàng)建一個(gè)不與窗體相連的單元文件的方法是,首先選擇主菜單的????命令,然后選擇???命令,此時(shí)??????彈出一個(gè)?????????對(duì)話框,如圖????所示。在此圖中選擇???選項(xiàng)卡中的????,然后單擊??按鈕。此時(shí)??????自動(dòng)為我們創(chuàng)建一個(gè)名為?????的獨(dú)立單元文件,并顯示在代碼編輯器中,我們只需在此加入函數(shù)即可。?

      圖3.10 New Items對(duì)話框

      單元?jiǎng)?chuàng)建之后,就需要實(shí)現(xiàn)單元之間的互相引用。這里有兩種方法:?(1)直接在Unit1中寫入uses Unit2,代碼如下所示:

      var Form1: TForm1;implementation uses Unit2;(2)選擇主菜單的File | Use Unit命令,此時(shí)Delphi彈出Use Unit對(duì)話框,如圖3.11所示,在此窗口中列出當(dāng)前文件沒有連接的所有文件,只需選擇需要連接的文件即可。當(dāng)選擇了某一文件并單擊OK按鈕后,當(dāng)前文件就包含了對(duì)所選文件的引用。

      圖3.11 Use Unit對(duì)話框

      如果當(dāng)前文件已經(jīng)連接了當(dāng)前項(xiàng)目中所有其他文件,選擇????????命令后,就會(huì)彈出如圖????所示的信息窗口,告訴程序員當(dāng)前文件已經(jīng)連接了當(dāng)前項(xiàng)目中所有其他文件。?

      圖3.12 Information對(duì)話框

      此時(shí)再編譯,程序就沒有任何錯(cuò)誤了。?現(xiàn)在我們已經(jīng)創(chuàng)建了?????,它將用作我們的數(shù)學(xué)函數(shù)定義單元。在開始定義這個(gè)單元之前,需要先了解一下關(guān)于??????的異常處理機(jī)制。?第3章 “速算24”撲克游戲--單元、異常、邏輯

      3.4 異 常 處 理

      3.4.1 異常處理的概念 在應(yīng)用程序開發(fā)中如何檢測(cè)、處理程序的運(yùn)行錯(cuò)誤是一個(gè)很重要的問題。在 Delphi 的IDE(集成開發(fā)環(huán)境)中提供了一個(gè)完善的內(nèi)置調(diào)試器,可以發(fā)現(xiàn)大部分程序錯(cuò)誤。但并不是所有的錯(cuò)誤都可以被發(fā)現(xiàn),而且當(dāng)程序涉及到與外設(shè)的數(shù)據(jù)交換或操作外設(shè),如要求用戶輸入、讀寫磁盤等時(shí),錯(cuò)誤的發(fā)生是程序無法控制的,如輸入非法字符、磁盤不能讀寫等。這些情況不僅會(huì)導(dǎo)致應(yīng)用程序異常中止,而且可能引起系統(tǒng)的崩潰。針對(duì)這些問題,Delphi提供了一套強(qiáng)大的異常處理機(jī)制。巧妙地利用它,可以使程序更為強(qiáng)健,使用更為友好。

      Delphi異常處理機(jī)制建立在Protected Blocks(保護(hù)塊)的概念上。所謂保護(hù)塊是指用保留字try和end封裝的一段代碼。保護(hù)塊的作用是當(dāng)應(yīng)用程序發(fā)生錯(cuò)誤時(shí)自動(dòng)創(chuàng)建一個(gè)相應(yīng)的Exception(“異常”類)。程序可以捕獲并處理這個(gè)“異常”類,以確保程序的正常結(jié)束以及資源的釋放和數(shù)據(jù)不受破壞。如果程序不進(jìn)行處理,則系統(tǒng)會(huì)自動(dòng)提供一個(gè)消息框?!爱惓!鳖愂荄elphi異常處理機(jī)制的核心,也是Delphi異常處理的主要特色。Delphi提供的所有“異?!鳖惗际穷怑xception的子類。用戶也可以從類Exception派生一個(gè)自定義的“異?!鳖悺?/p>

      3.4.2 資源保護(hù)方式

      回收分配的資源是確保程序健壯性的一個(gè)關(guān)鍵。但默認(rèn)情況下異常發(fā)生時(shí)程序會(huì)在出錯(cuò)點(diǎn)自動(dòng)退出當(dāng)前模塊,因此需要一種特殊的機(jī)制來確保即使在異常發(fā)生的情況下,釋放資源的語句仍能被執(zhí)行,而Delphi的異常處理正提供了這種機(jī)制。

      Delphi提供了一個(gè)保留字finally,用于實(shí)現(xiàn)資源的保護(hù)。

      {分配資源}

      try {資源使用情況} finally {釋放資源}

      end;try?finally?end就形成了一個(gè)資源保護(hù)塊。finally后面的語句在任何情況下(不論程序是否發(fā)生異常)都會(huì)執(zhí)行。

      在異常保護(hù)的情況下,當(dāng)異常發(fā)生時(shí),系統(tǒng)會(huì)自動(dòng)彈出一個(gè)消息框,在框中顯示異常的消息。退出當(dāng)前模塊后異常類自動(dòng)清除。

      3.4.3 異常響應(yīng)方式

      異常響應(yīng)為開發(fā)者提供了一個(gè)按需進(jìn)行異常處理的機(jī)制。try?except?end形成了一個(gè)異常響應(yīng)保護(hù)塊。與finally不同的是:正常情況下except 后面的語句并不被執(zhí)行,而當(dāng)異常發(fā)生時(shí)程序自動(dòng)跳到except處,進(jìn)入異常響應(yīng)處理模塊。當(dāng)異常被響應(yīng)后異常類自動(dòng)清除。

      下面是異常響應(yīng)方式的一般代碼:

      try {程序正常功能} except on ESomething do {響應(yīng)特定異常} else {提供默認(rèn)響應(yīng)} end;保留字on?do用于判斷異常類型。必須注意的是:except后面的語句必須包含在某一個(gè)on?do模塊中,而不能單獨(dú)存在。這是又一個(gè)與finally不同的地方。

      3.4.4 提供默認(rèn)響應(yīng)

      在異常響應(yīng)模塊中,一般我們只對(duì)希望響應(yīng)的特定異常進(jìn)行處理。如果一個(gè)異常發(fā)生而響應(yīng)模塊并沒有包含對(duì)它的處理代碼,則退出當(dāng)前響應(yīng)模塊,異常類仍被保留。

      為了保證任何異常發(fā)生后都能在當(dāng)前響應(yīng)模塊中被清除,可以定義默認(rèn)響應(yīng):

      try {程序正常功能} except on ESomething do {響應(yīng)特定異常} else {提供默認(rèn)響應(yīng)} end;由于else可以響應(yīng)任何異常,包括我們一無所知的異常,因此在默認(rèn)響應(yīng)中最好只包括諸如顯示一個(gè)消息框之類的處理,而不要改變程序的運(yùn)行狀態(tài)或數(shù)據(jù)。

      第3章 “速算24”撲克游戲--單元、異常、邏輯

      3.5 數(shù)學(xué)邏輯單元(1)

      此游戲程序最關(guān)鍵的地方是如何將用戶輸入的字符串表達(dá)式解析成數(shù)學(xué)表達(dá)式。為了使程序結(jié)構(gòu)清晰明了,我們將此解析代碼和程序的主代碼分開,單獨(dú)編寫成一個(gè)單元。

      3.5.1 算法設(shè)計(jì)

      游戲的難點(diǎn)是如何將一字符串形式的表達(dá)式解析成計(jì)算機(jī)能計(jì)算的算術(shù)表達(dá)式。例如對(duì)于字符串“3^(4*(9+4))”,如何讓計(jì)算機(jī)解析、計(jì)算。

      我們的想法是按照數(shù)學(xué)四則運(yùn)算規(guī)則,先逐層進(jìn)入最里層的括號(hào),然后在括號(hào)內(nèi)部計(jì)算乘方,接著進(jìn)行乘(除)法運(yùn)算,最后按順序進(jìn)行加(減)運(yùn)算,當(dāng)本層括號(hào)內(nèi)部計(jì)算完成后,返回結(jié)果,去掉括號(hào)內(nèi)部數(shù)據(jù),退出到下一級(jí)括號(hào)(如果有)內(nèi)進(jìn)行計(jì)算。

      這里面涉及的技術(shù)細(xì)節(jié)主要有下面幾點(diǎn):

      (1)層層剝離括號(hào),然后從最里層的括號(hào)開始計(jì)算。(2)對(duì)于每一個(gè)運(yùn)算符號(hào),找到符號(hào)兩側(cè)的數(shù)字,形成一個(gè)計(jì)算式。

      (3)每一個(gè)子計(jì)算式完成后,運(yùn)算結(jié)果返回到原始數(shù)列中,作為子串的一部分,繼續(xù)進(jìn)行上述計(jì)算。

      3.5.2 字符串的相關(guān)函數(shù)

      在游戲中,用戶輸入的都是字符數(shù)據(jù),我們需要從這些字符中分析得到數(shù)字和運(yùn)算符號(hào),因此要用到與字符串操作有關(guān)的函數(shù)。

      function Pos(sub , all:string):integer;這個(gè)函數(shù)含有兩個(gè)參數(shù):sub表示要查找的字符,all表示原字符串。函數(shù)在字符串a(chǎn)ll中尋找指定的字符sub的位置,如果字符串中不存在sub字符,則函數(shù)結(jié)果為0。

      function LastDelimiter(sub,all :string):integer 這個(gè)函數(shù)含有兩個(gè)參數(shù):sub表示要查找的字符,all表示原字符串。函數(shù)返回在字符串a(chǎn)ll中所有查找到的指定字符sub的最后一個(gè)的位置,如果字符串中不存在sub字符,則函數(shù)結(jié)果為0。

      function Copy(allstring:string;first,length:integer):string 這個(gè)函數(shù)的3個(gè)參數(shù)的含義分別是:allstring代表原來的字符串,first表示拷貝開始的位置,length表示要拷貝的子串長(zhǎng)度。函數(shù)返回拷貝成功的子串。

      procedure Delete(str:string;ppos,length:integer)這個(gè)過程用于刪除字符串中的一段字符。參數(shù)str代表將要操作的字符串,ppos代表開始刪除的位置,length表示將要?jiǎng)h除多少個(gè)字符。function Length(S): Integer;Length函數(shù)返回字符串S的長(zhǎng)度。

      function Trim(const S: string): string;overload;function Trim(const S: WideString): WideString;overload;Trim函數(shù)返回字符串S去掉前面和后面的空格后的字符串。

      下面的例子給出一個(gè)綜合利用字符串處理函數(shù)編寫的一個(gè)處理特定字符串的函數(shù),它的功能是:輸入一個(gè)字符串后,可以返回字符串中兩個(gè)單括號(hào)之間的子字符串,并去掉前面和后面帶著的空格:

      function GetMyStr(const S: string): string;begin Result:=Trim(Copy(S,Pos('<',S)+1,Pos('>',S)-Pos('<',S)-1));end;比如我們?cè)诔绦蛑袑懙紾etMyStr(‘This is a test < Result to output > end of test’);,會(huì)得到字符串“Result to output”。

      3.5.3 算法的代碼編寫

      基于上述的考慮和知識(shí)基礎(chǔ),我們?cè)诼暶鞑糠侄x下列幾個(gè)主要函數(shù):

      (1)AnyLastPos函數(shù)定位最后一個(gè)算術(shù)運(yùn)算符的位置。

      function AnyLastPos(Str:String):integer;(2)AnyFirstPos函數(shù)定位最先一個(gè)算術(shù)運(yùn)算符的位置。

      function AnyFirstPos(Str:String):integer;(3)AnyFirstF函數(shù)判斷最先出現(xiàn)的符號(hào)是+號(hào)、-號(hào)、*號(hào)還是/號(hào)。

      function AnyFirstF(Str:String):Char;(4)SubCompute函數(shù)用于計(jì)算不帶()號(hào)的加、減、乘、除運(yùn)算。

      function SubCompute(Str:String):integer;(5)TotalCompute函數(shù)用于計(jì)算表達(dá)式的結(jié)果。

      function TotalCompute(Str:String):integer;1.尋找最后一個(gè)算術(shù)運(yùn)算符

      定義4個(gè)整數(shù)變量SubPos,PluPos,MulPos,DivPos,在給定的字符串中尋找+,-,*,/的最后位置,將這些位置存儲(chǔ)在上述的4個(gè)變量中,然后比較4個(gè)符號(hào)出現(xiàn)的位置,得到數(shù)值最大的運(yùn)算符;在返回的結(jié)果中,返回這個(gè)運(yùn)算符的位置。

      程序代碼如下所示:

      function AnyLastPos(Str:String):integer;var SubPos:integer;PluPos:integer;MulPos:integer;DivPos:integer;Pos:Integer;begin //定位字符串中最后一個(gè)運(yùn)算符的位置

      SubPos:=LastDelimiter('-',Str);PluPos:=LastDelimiter('+',Str);MulPos:=LastDelimiter('*',Str);DivPos:=LastDelimiter('/',Str);Pos:=SubPos;if(Pos

      分別在給定的字符串中尋找+,-,*,/第一次出現(xiàn)的位置,然后比較4個(gè)符號(hào)出現(xiàn)的位置,得到數(shù)值最小的運(yùn)算符。在返回的結(jié)果中,傳遞的是這個(gè)運(yùn)算符的位置。

      程序代碼如下所示:

      function AnyFirstPos(Str:String):integer;var SubPos:integer;PluPos:integer;MulPos:integer;DivPos:integer;ForPos:integer;FirstPos:integer;begin //定位字符串中最先一個(gè)運(yùn)算符的位置

      SubPos:=Pos('-',Str);PluPos:=Pos('+',Str);MulPos:=Pos('*',Str);DivPos:=Pos('/',Str);ForPos:=Pos('^',Str);FirstPos:=200;if(SubPos=0)then //如果沒有-號(hào)

      SubPos:=200;//將SubPos設(shè)置成一個(gè)不可能的值

      if(PluPos=0)then //如果沒有+號(hào)

      PluPos:=200;//將PluPos設(shè)置成一個(gè)不可能的值

      if(MulPos=0)then //如果沒有*號(hào)

      MulPos:=200;//將MulPos設(shè)置成一個(gè)不可能的值

      if(DivPos=0)then //如果沒有/號(hào)

      DivPos:=200;//將DivPos設(shè)置成一個(gè)不可能的值

      if(ForPos=0)then //如果沒有^號(hào)

      ForPos:=200;//將ForPos設(shè)置成一個(gè)不可能的值

      if(FirstPos>SubPos)then FirstPos:=SubPos;if(FirstPos>PluPos)then FirstPos:=PluPos;if(FirstPos>MulPos)then FirstPos:=MulPos;if(FirstPos>DivPos)then FirstPos:=DivPos;if(FirstPos>ForPos)then FirstPos:=ForPos;

      AnyFirstPos:=FirstPos;//結(jié)束函數(shù),返回位置

      end;第3章 “速算24”撲克游戲--單元、異常、邏輯

      3.5 數(shù)學(xué)邏輯單元(2)

      3.得到最先出現(xiàn)的運(yùn)算符類型

      這個(gè)函數(shù)的返回結(jié)果是Char類型,代表這是一個(gè)字符變量。實(shí)際上,它返回的是+、-、*、/ 這4個(gè)符號(hào)中最早出現(xiàn)的一個(gè)。

      程序分別尋找4個(gè)符號(hào)最早出現(xiàn)的位置,然后判斷最先出現(xiàn)的是哪一種符號(hào),再根據(jù)符號(hào)類型返回代表運(yùn)算符的字符。

      在具體的實(shí)現(xiàn)過程中,因?yàn)槲覀円玫阶钕瘸霈F(xiàn)的運(yùn)算符,所以判斷的是每次尋找后各個(gè)運(yùn)算符的位置的最小值。如果不存在這個(gè)運(yùn)算符,則將代表這個(gè)運(yùn)算符位置的相應(yīng)變量設(shè)置為200。對(duì)于本程序來說,這是一個(gè)搜索過程中不可能達(dá)到的值,這樣就排除了這個(gè)位置的繼續(xù)比較的可能。

      程序代碼如下所示:

      function AnyFirstF(Str:String):Char;var SubPos:integer;PluPos:integer;MulPos:integer;DivPos:integer;Operator:char;tempPos:integer;begin SubPos:=Pos('-',Str);PluPos:=Pos('+',Str);MulPos:=Pos('*',Str);DivPos:=Pos('/',Str);

      if(SubPos=0)then //如果沒有-號(hào)

      SubPos:=200;//將SubPos設(shè)置成一個(gè)不可能的值

      if(PluPos=0)then //如果沒有+號(hào)

      PluPos:=200;//將PluPos設(shè)置成一個(gè)不可能的值

      if(MulPos=0)then //如果沒有*號(hào)

      MulPos:=200;//將MulPos設(shè)置成一個(gè)不可能的值

      if(DivPos=0)then //如果沒有/號(hào)

      DivPos:=200;//將DivPos設(shè)置成一個(gè)不可能的值

      Operator:='-';tempPos:=SubPos;if(tempPos>PluPos)then begin tempPos:=PluPos;Operator:='+';end;if(tempPos>MulPos)then begin tempPos:=MulPos;Operator:='*';end;if(tempPos>DivPos)then begin tempPos:=DivPos;Operator:='/';end;

      AnyFirstF:=Operator;//結(jié)束函數(shù),返回位置 end;4.計(jì)算不帶括號(hào)的運(yùn)算表達(dá)式

      做完上述工作后,我們可以開始進(jìn)行一些實(shí)際的運(yùn)算了。

      包括加、減、乘、除、乘方運(yùn)算的表達(dá)式的程序算法如下所示:

      (1)尋找乘方符號(hào)“^”,如果存在,則計(jì)算一次乘方,去掉計(jì)算過的部分,接著循環(huán)查找和計(jì)算子串的乘方。

      (2)尋找乘號(hào)“*”或者除號(hào)“/”,如果存在,則計(jì)算一次乘(除)法,去掉計(jì)算過的部分,接著循環(huán)計(jì)算子串的乘除法。

      (3)尋找加號(hào)“+”或者減號(hào)“-”,如果存在,則計(jì)算一次加(減)法,去掉計(jì)算過的部分,接著循環(huán)計(jì)算子串的加減法。

      上述算法是嚴(yán)格按照順序進(jìn)行的,它體現(xiàn)了數(shù)學(xué)運(yùn)算中的優(yōu)先關(guān)系,經(jīng)過上述的計(jì)算,子字符串被分解,計(jì)算完畢。

      無論是乘方、乘除法還是加減法,內(nèi)部實(shí)現(xiàn)的邏輯是基本一致的。下面,我們?cè)O(shè)定有一個(gè)運(yùn)算表達(dá)式:3+2^5/4。

      程序代碼如下所示:

      function SubCompute(Str:String):integer;var Middle:String;Mul2:String;Right:String;First:integer;tempStr:String;temp:integer;Left:String;Mul1:String;MulPos:Integer;DivPos:Integer;Fuhao:Char;begin Middle:='';Mul2:='';Right:='';

      //定位第一個(gè)^號(hào)位置,計(jì)算乘方

      First:=Pos('^',Str);While(First<>0)do //循環(huán)計(jì)算乘方

      begin tempStr:=Copy(Str,1,First-1);temp:=AnyLastPos(tempStr);Left:=Copy(Str,1,temp);Mul1:=Copy(str,temp+1,First-temp-1);tempStr:=Copy(str,First+1,Length(str)-First);temp:=AnyFirstPos(tempStr);if(temp=200)then begin Mul2:=tempStr;Right:='';end else begin Mul2 :=Copy(tempStr,1,temp-1);Right:=Copy(tempStr,temp,Length(tempStr)-temp+1);end;Middle:=FloatToStr(IntPower(StrToInt(Mul1),StrToInt(Mul2)));Str:=Left+Middle+Right;First:=Pos('^',Str);end;

      //定位第一個(gè)*號(hào)或/號(hào)的位置

      MulPos:=Pos('*',Str);DivPos:=Pos('/',Str);First:=MulPos;if(MulPos>DivPos)then First:=DivPos;if((DivPos=0)and(MulPos<>0))then begin First:=MulPos;DivPos:=2000;// 將除號(hào)所在位置設(shè)置成一個(gè)大于MulPos但又不可能的值

      end;if((DivPos<>0)and(MulPos=0))then begin First:=DivPos;MulPos:=2000;// 將乘號(hào)所在位置設(shè)置成一個(gè)大于DivPos但不可能的值

      end;while(First<>0)do //循環(huán)計(jì)算乘、除

      begin tempStr:=Copy(Str,1,First-1);temp:=AnyLastPos(tempStr);Left:=Copy(Str,1,temp);Mul1:=Copy(Str,temp+1,First-temp-1);tempStr:=Copy(Str,First+1,Length(Str)-First);temp:=AnyFirstPos(tempStr);if(temp=200)then begin Mul2:=tempStr;Right:='';end else begin Mul2 :=Copy(tempstr,1,temp-1);Right:=Copy(tempStr,temp,Length(tempStr)-temp+1);end;if(MulPos>DivPos)then Middle:=IntToStr(StrToInt(Mul1)div StrToInt(Mul2))else Middle:=IntToStr(StrToInt(Mul1)*StrToInt(Mul2));Str:=Left+Middle+Right;

      MulPos:=Pos('*',Str);DivPos:=Pos('/',Str);First:=MulPos;if(MulPos>DivPos)then First:=DivPos;

      if((DivPos=0)and(MulPos<>0))then begin First:=MulPos;DivPos:=2000;// 將除號(hào)所在位置設(shè)置成一個(gè)大于MulPos但又不可能的值

      end;if((DivPos<>0)and(MulPos=0))then begin First:=DivPos;MulPos:=2000;// 將乘號(hào)所在位置設(shè)置成一個(gè)大于DivPos但不可能的值

      end;end;//定位+、-號(hào)首先出現(xiàn)的位置

      First:=AnyFirstPos(Str);if(First=200)then //如果沒有+、-號(hào),則可以直接返回結(jié)果

      begin SubCompute:=StrToInt(Str);exit;end;Fuhao:=AnyFirstF(Str);//確定首先出現(xiàn)的符號(hào)是+號(hào)還是-號(hào)

      while(First<>0)do begin //如果找到+號(hào)或-號(hào)

      tempStr:=Copy(Str,1,First-1);temp:=AnyLastPos(tempStr);Left:=Copy(Str,1,temp);Mul1:=Copy(Str,temp+1,First-temp-1);tempStr:=Copy(Str,First+1,Length(Str)-First);temp:=AnyFirstPos(tempStr);if(temp=200)then begin Mul2:=tempStr;Right:='';end else begin Mul2 :=Copy(tempStr,1,temp-1);Right :=Copy(tempStr,temp,Length(tempStr)-temp+1);end;if(Fuhao='+')then Middle:=IntToStr(StrToInt(Mul1)+StrToInt(Mul2))else Middle:=IntToStr(StrToInt(Mul1)-StrToInt(Mul2));Str:=Left+Middle+Right;First:=AnyFirstPos(Str);if(First=200)then break;Fuhao:=AnyFirstF(Str);end;

      SubCompute:=StrToInt(Middle);end;程序執(zhí)行過程如下所示:

      (1)定位字符串中第一個(gè)乘方符號(hào)“^”的位置First。這個(gè)式子中的First為4。

      (2)如果存在乘方符號(hào),即First不等于0,則繼續(xù)進(jìn)行計(jì)算,否則退出循環(huán)。

      (3)進(jìn)入循環(huán)體內(nèi)部,得到“^”前面的子串tempStr(“3+2”),尋找tempStr中的最后一個(gè)運(yùn)算符temp(這里是“+”),則Temp和First之間的字符就是乘方符號(hào)的第一個(gè)參數(shù)(“2”)。

      (4)同樣的邏輯,得到“^”后面的子串tempStr(“5/4”),尋找tempStr中的第一個(gè)運(yùn)算符位置temp(“/”),則Temp和First之間的字符就是乘方符號(hào)的第二個(gè)參數(shù)(“5”)。

      (5)去掉乘方符號(hào)和兩個(gè)參數(shù),得到左側(cè)子串left(“3+”)和右側(cè)子串right(“/4”)。

      (6)利用這兩個(gè)參數(shù)和乘方符號(hào),計(jì)算乘方,將結(jié)果返回,并插入在left和right之間,得到一次計(jì)算后的新字符串(“3+32/4”)。

      (7)判斷新串內(nèi)部是否包含“^”,如果包含,則返回到步驟(3),不包含則進(jìn)入下一種運(yùn)算。

      第3章 “速算24”撲克游戲--單元、異常、邏輯

      3.5 數(shù)學(xué)邏輯單元(3)5.計(jì)算整個(gè)表達(dá)式的值

      TotalCompute函數(shù)利用循環(huán),找到最內(nèi)層的一對(duì)括號(hào),然后調(diào)用SubCompute函數(shù)處理這一對(duì)括號(hào)中的表達(dá)式。SubCompute函數(shù)處理的表達(dá)式中已經(jīng)沒有括號(hào)了,因此SubCompute只需處理乘方、加、減、乘、除,返回結(jié)果,形成新的字符串。

      當(dāng)整個(gè)字符串縮減至空值時(shí),整個(gè)表達(dá)式計(jì)算完成。

      程序代碼如下所示:

      function TotalCompute(Str:String):integer;var First:integer;Last:integer;SubStr:String;LeftStr:String;Middle:String;Right:String;temp:integer;begin First:=LastDelimiter('(',Str);//定位最后一個(gè)(號(hào)位置 while(First<>0)do begin SubStr:=Copy(Str,First+1,Length(Str)-First);Last:= Pos(')',Str);//Last:=Last+First;//定位最后一個(gè)(號(hào)以后的最開始的)號(hào)位置

      LeftStr:=Copy(Str,1,First-1);//(號(hào)左邊的字符串

      Middle:=Copy(Str,First+1,Last-First-1);//()號(hào)中間的字符串

      Right:=Copy(Str,Last+1,Length(Str)-Last);//)號(hào)右邊的字符串

      temp:=SubCompute(Middle);//進(jìn)入下面的計(jì)算

      Middle:=IntToStr(temp);

      Str:=LeftStr+Middle+Right;First:=LastDelimiter('(',Str);end;

      Result:=SubCompute(Str);end;end.在程序中,“計(jì)算”按鈕的OnClick事件處理程序中調(diào)用TotalCompute函數(shù)。函數(shù)中使用了一些數(shù)學(xué)函數(shù)和定位字符串的函數(shù),這些函數(shù)Delphi已經(jīng)在相應(yīng)的系統(tǒng)單元中進(jìn)行了定義,我們需要把這些系統(tǒng)單元包括到文件里面:

      uses Sysutils,Math;將前面調(diào)用TotalCompute的注釋去掉,把代碼改回:

      procedure TForm1.Button2Click(Sender: TObject);var result:integer;answer:String;begin result:=TotalCompute(Edit1.Text);if(result=24)then Application.MessageBox('您真行,我服了您!','對(duì)了',MB_OK)else begin

      第二篇:delphi復(fù)習(xí)資料

      題型:

      填空題20×1 簡(jiǎn)答題5×6 程序填空題11×2 編程題2×14 資料整理的不是完全完整,結(jié)合這些重點(diǎn)可以在書上再仔細(xì)復(fù)習(xí)。希望好好復(fù)習(xí),大家都能通過!

      第一章Delphi簡(jiǎn)介

      1.1delphi概念 Delphi的主要特點(diǎn): Borland公司的Pascal編譯器 Delphi以object Pascal為編程語言 Delphi充分發(fā)揮了windows的強(qiáng)大功能 Delphi提供了豐富的32位可視組件庫

      Delphi在數(shù)據(jù)庫和網(wǎng)絡(luò)處理功能方面是同類產(chǎn)品中最強(qiáng)的

      1.2delphi7集成開發(fā)環(huán)境

      主窗口:包括菜單欄,工具欄及組件欄; 對(duì)象游覽器:包括屬性頁和事件頁; 對(duì)象樹性列表; 窗體設(shè)計(jì)器; 代碼編輯器;

      1.3delphi程序的基本結(jié)構(gòu)

      擴(kuò)展名為dpr的是項(xiàng)目文件;擴(kuò)展名為pas的單元文件;擴(kuò)展名為dfm的是窗體文件

      單元文件的格式如下:

      單元頭:該單元指定單元的名稱

      接口部分:該部分從保留字interfact開始,到保留字implementation之前結(jié)束。接口部分可以有uses語句,還可以用來聲明常量,數(shù)據(jù)類型,變量,過程和函數(shù)等。其中uses語句必須緊跟在保留字interfact之后。在整個(gè)程序中都可以被訪問

      實(shí)現(xiàn)部分:這些聲明可以在本單元中被訪問,不可以在其他單元中被訪問,類的方法必須在實(shí)現(xiàn)部分實(shí)現(xiàn)

      初始化部分:從保留字implementation開始,到保留字finalization之前結(jié)束。一個(gè)單元中可以沒有該部分。

      結(jié)束部分:一個(gè)單元中只有出現(xiàn)了初始化部分,才可以有結(jié)束部分

      第二章Object Pascal語言基礎(chǔ) 2.1詞法符號(hào) 保留字

      標(biāo)識(shí)符:1標(biāo)識(shí)符由字母,數(shù)字或下劃線組成 2標(biāo)示符的第一個(gè)字符必須是字母或下劃線 3標(biāo)識(shí)符的長(zhǎng)度不應(yīng)超過255個(gè)字符 4不能將保留字用作標(biāo)識(shí)符 5標(biāo)識(shí)符不區(qū)分大,小寫

      標(biāo)準(zhǔn)標(biāo)識(shí)符是可以重新定義的,而保留字卻不允許重新定義

      因system單元是自動(dòng)應(yīng)用的,不必也不允許在引用部分列出system單元 Absolute指令字用于指示相同類型的另一標(biāo)識(shí)符存放在同一段內(nèi)存區(qū)域中 2.2常量和變量

      布爾常量是指false和true這兩個(gè)值 用#引導(dǎo)一個(gè)整數(shù),整數(shù)表示該字符的ASCII碼 用‘’‘’表示單引號(hào)字符 2.3簡(jiǎn)單數(shù)據(jù)類型

      數(shù)據(jù)類型分為簡(jiǎn)單數(shù)據(jù)類型,字符串類型,結(jié)構(gòu)類型,指針類型,過程與函數(shù)類型和可變類型等是一種常見的分類方法

      有序數(shù)據(jù)類型特點(diǎn):

      1、數(shù)據(jù)的分布是離散的;

      2、除了第一個(gè)元素外,其他任何元素都有一個(gè)前驅(qū)元素;

      3、除了最后一個(gè)元素外,其他任何元素都有一個(gè)后繼元素

      關(guān)系運(yùn)算符號(hào):=,<>,>≡,>,<≡,< 整型數(shù)的邏輯運(yùn)算符:not,and,or,xor 左,右移位運(yùn)算符:shl,shr 基本字型有ansichar和widechar Pascal語言提供的自變量為實(shí)型的標(biāo)準(zhǔn)函數(shù)由: 1絕對(duì)值函數(shù)abs(x):函數(shù)值為x的絕對(duì)值 2平方函數(shù)sqr(x):函數(shù)值為x的平方

      3正弦函數(shù)sin(X):函數(shù)值為x的正弦,其中x的單位為弧度 4余弦函數(shù)cos(x):函數(shù)值為x的余弦,其中x的單位為弧度 5反正切函數(shù)arctan(x):函數(shù)值為x的正反切,函數(shù)值的單位為弧度 6指數(shù)函數(shù)exp(x):函數(shù)值為指數(shù)e 的x次方 7對(duì)數(shù)函數(shù)in(x):函數(shù)值為x的自然對(duì)數(shù) 8平方根函數(shù)sqrt(x):函數(shù)值為x的平方根

      9舍入函數(shù)round(x):對(duì)實(shí)數(shù)x作四舍五入,結(jié)果為整數(shù) 10截尾取整函數(shù)trunc(x):截去實(shí)數(shù)x的小數(shù)部分,結(jié)果為整數(shù) object pascal提供了豐富的日期時(shí)間處理函數(shù),常用的有: 1date0:函數(shù)返回系統(tǒng)當(dāng)前日期,無參數(shù),返回?cái)?shù)據(jù)是tdate time型 2time0:函數(shù)返回系統(tǒng)當(dāng)前時(shí)間,無參數(shù),返回?cái)?shù)據(jù)是tdate time型 3now0:函數(shù)返回系統(tǒng)當(dāng)前日期和時(shí)間,無參數(shù),返回?cái)?shù)據(jù)是tdate time型 4strtodte(日期字符串):字符串轉(zhuǎn)換為日期時(shí)間函數(shù),返回?cái)?shù)據(jù)是tdate time型

      2.4結(jié)構(gòu)類型 結(jié)構(gòu)數(shù)據(jù): —集合類型(set)—數(shù)組類型(arry)—記錄類型(record)—文件類型(file)—類類型(class)

      —類引用類型(class reference)—接口類型(interfact)

      object pascal中規(guī)定了基類型只能是不超過265個(gè)有序值的集合,集合元素的敘數(shù)值必須介于0~~255之間

      集合運(yùn)算有交(*),并(+),差(—),運(yùn)算對(duì)象是兩個(gè)相同類型的集合,運(yùn)算結(jié)果也是集合。例如,若有為[1,3,5],y為[3,4,5],則x*y為[3,5],x+y為[1,3,4,5],x-y為[1] 數(shù)組的定義:Type arry [indextype。。,indextypen] of basetype ①對(duì)于通用字符串類型string,指定其最大長(zhǎng)度(0------255)。此時(shí)string型被視為shortstring型

      ②shortstring型不是以null(空字符#0)作為字符串的結(jié)果標(biāo)志,而是將長(zhǎng)度保存在字符串?dāng)?shù)組下標(biāo)為0的儲(chǔ)存單元中 ③ansistring以full結(jié)束

      記錄的定義: Type 記錄類型標(biāo)識(shí)符=record 域1:類型1 域2:類型2。。。。域n:類型n 2.6語句流程 語法形式: 輸入語言

      Read([文件變量]變量列表)

      Readln([文本文件變量]變量列表)有回車 省略文本變量參數(shù)表示從鍵盤輸入中讀取數(shù)據(jù) 輸出語言

      Write([文件變量]輸出項(xiàng)表)

      Writeln([文本文件變量]輸出項(xiàng)表)有回車

      注釋和編譯指令 //單行注釋內(nèi)容 {注釋內(nèi)容}(*注釋內(nèi)容*)

      Case語句的語法格式: Case選擇表達(dá)式of 常量1:語句1 常量2:語句2。。。。

      常量n-1:語句n-1 [else語句n;] End;

      保留字case后的選擇表達(dá)式,其值必須是有序類型,如整型,字符型,布爾型,枚舉型或子界型 P45頁程序

      While語句的執(zhí)行過程是:先計(jì)算布爾表達(dá)式的值,當(dāng)值為true時(shí),執(zhí)行循環(huán)體中的語句序列,然后重新計(jì)算布爾表達(dá)式的值,若仍為true則再執(zhí)行一遍循環(huán)體

      While語句的特點(diǎn)是先判斷條件,當(dāng)條件為true才執(zhí)行。當(dāng)?shù)谝淮螚l件為false時(shí),循環(huán)次數(shù)為0

      Repeat語句的執(zhí)行過程是:先執(zhí)行repeat到until之間的語句,然后計(jì)算布爾表達(dá)式的值,若為false,則再執(zhí)行repeat到until之間的語句,若為true則推出循環(huán)體

      Break過程,可使程序的執(zhí)行流程立即退出該層循環(huán) Continue過程將使程序直接轉(zhuǎn)入下一次循環(huán) 2.7過程與函數(shù)

      Procedure過程名(參數(shù)表)

      Function函數(shù)名(參數(shù)表):返回?cái)?shù)據(jù)類型 過程由過程首部、局部聲明部分和過程體組成。函數(shù)由函數(shù)首部、局部聲明部分和函數(shù)體組成。

      參數(shù)的傳遞如下:

      1值參數(shù)聲明時(shí),形參前面無任何修飾

      2變量參數(shù)聲明時(shí) 變參傳遞的是一個(gè)變量的地址,即實(shí)參把地址傳遞的是一個(gè)變量的地址,即實(shí)參把地址傳遞給變參,變參和實(shí)參指向的是同一地址空間。在過程和函數(shù)中對(duì)變參的修改直接影響實(shí)參 3常量參數(shù)聲明時(shí),形參的前面用保留字const修飾

      過程和函數(shù)重裁是指定義多個(gè)名稱相同,而參數(shù)列表不同的過程和函數(shù)。編譯器根據(jù)調(diào)用時(shí)實(shí)參表中的參數(shù)個(gè)數(shù)和類型,自動(dòng)匹配一個(gè)重裁的過程或函數(shù)。重裁過程或函數(shù)使用默認(rèn)參數(shù)可能會(huì)導(dǎo)致二義性錯(cuò)誤 2.8程序與單元的結(jié)構(gòu) 單元結(jié)構(gòu): 1單元首部

      2接口部分:定義的這些標(biāo)識(shí)符可以被引用該單元的程序訪問 3實(shí)現(xiàn)部分:在實(shí)現(xiàn)部分定義的標(biāo)志符不能被其他單位或程序訪問 4初始部分 5終結(jié)部分

      2.9標(biāo)識(shí)符的作用域

      標(biāo)識(shí)符的作用域是指其在程序中起作用的范圍。

      單元中接口部分定義的標(biāo)識(shí)符包括數(shù)據(jù)類型,類,常數(shù),變量,過程和函數(shù)導(dǎo)等 他們?cè)谝迷搯卧某绦颍?xiàng)目文件,其他單元)中都可以被訪問

      第三章 Delphi中的面向?qū)ο?3.1面向?qū)ο蟪绦蛟O(shè)計(jì)概述

      將具有相同屬性和行為的對(duì)象抽象為類,每個(gè)對(duì)象都屬于某個(gè)類。通過繼承關(guān)系構(gòu)成類的層次結(jié)構(gòu),子類可以直接繼承父類的性質(zhì)和功能。3.2類與對(duì)象

      類是具有相同或相似屬性和行為的一組對(duì)象的共同描述,是對(duì)相似對(duì)象建立的模板。

      對(duì)象由屬性和方法構(gòu)成。屬性是描述對(duì)象靜態(tài)特征的一組數(shù)據(jù)想:方法描述了該類對(duì)象動(dòng)態(tài)特征的一個(gè)操作序列,體現(xiàn)對(duì)象的行為特征或功能。定義類:type 類名=class 數(shù)據(jù)成員

      成員函數(shù)或過程 End;

      注意:在函數(shù)或過程名前必須帶有類名。Procedure Circle.Draw; 聲明對(duì)象一般形式為:var 對(duì)象名:類名; 訪問對(duì)象成員:對(duì)象名.成員

      構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義,作用和特點(diǎn):

      構(gòu)造函數(shù)是專用的創(chuàng)建對(duì)象和初始化對(duì)象的成員函數(shù)。定義時(shí)用保留字constructor,函數(shù)名通常為create。在定義的構(gòu)造函數(shù)中,不僅可以為類對(duì)象分配內(nèi)存空間,而且可以打開文件或數(shù)據(jù)庫讀取數(shù)據(jù)或控制設(shè)備復(fù)位。析構(gòu)函數(shù)是專用的刪除對(duì)象和為對(duì)象進(jìn)行善后處理的成員函數(shù)。定義時(shí)用保留字destructor,函數(shù)名通常為Destroy。在析構(gòu)函數(shù)中,不僅可以釋放相應(yīng)的內(nèi)存資源,還可以保存數(shù)據(jù)信息,關(guān)閉文件或者數(shù)據(jù)庫,控制設(shè)備復(fù)位并關(guān)機(jī)。3.3類成員的訪問權(quán)限

      封裝是把一組數(shù)據(jù)和與這組數(shù)據(jù)有關(guān)的操作集合組裝在一起,形成一個(gè)能動(dòng)的實(shí)體,也就是對(duì)象。

      訪問權(quán)限分為:private:私有數(shù)據(jù)成員、成員函數(shù)、過程。不能被類所在單元以外的程序訪問,但本單元是可見的。

      Protected:保護(hù)??。被該類及該類的所有派生類訪問,并成為派生類的私有成員。

      Public:共有??。被該類以外的類訪問。

      Published:公布??。在設(shè)計(jì)期間的對(duì)象觀察器窗口中可見。

      Automated:自動(dòng)??。用于響應(yīng)對(duì)象鏈接與嵌入自動(dòng)化類型信息的公共接口。3.4繼承

      繼承的實(shí)質(zhì)是在既有類的基礎(chǔ)上構(gòu)造新的類,即新類從一個(gè)或者多個(gè)已有類中繼承數(shù)據(jù)和方法,同時(shí)增加或重新定義數(shù)據(jù)和方法,由此構(gòu)造出一個(gè)新的類型,稱為派生類。已有的類稱為基類。繼承的主要目的是實(shí)現(xiàn)代碼的重用。派生類的定義:type 派生類=class(基類){派生類新增或改寫部分} End;

      派生類的構(gòu)造和析構(gòu)函數(shù):在派生類構(gòu)造函數(shù)的開始部分,使用inherited保留字來調(diào)用基類的構(gòu)造函數(shù),首先初始化基類的成員,然后構(gòu)造派生類的特有成員。在派生類的析構(gòu)函數(shù)的結(jié)尾部分,使用inherited保留字來調(diào)用基類的析構(gòu)函數(shù),最后釋放基類的成員部分。

      構(gòu)造函數(shù)越上層越早被調(diào)用,析構(gòu)函數(shù)越下層越早被調(diào)用。3.5多態(tài)性

      多態(tài)性是指同一的操作,在不同的對(duì)象中具體實(shí)現(xiàn)過程不同。Object Pascal 支持兩種多態(tài)性和運(yùn)行時(shí)的多態(tài)性。編譯時(shí)的多態(tài)性通過重載來實(shí)現(xiàn),運(yùn)行時(shí)的多態(tài)性用虛方法來實(shí)現(xiàn)。

      重載函數(shù)或者過程用保留字overload來說明。例如:Function max(x:integer):integer;integer; 虛方法的定義如p79 虛方法與動(dòng)態(tài)方法的區(qū)別:在運(yùn)行時(shí)才能確定對(duì)象方法的調(diào)用地址,這種調(diào)用方法為動(dòng)態(tài)聯(lián)編。虛方法與動(dòng)態(tài)方法在功能上是等價(jià)的,不同在于虛方法額調(diào)用速度比較快,動(dòng)態(tài)方法的代碼比較少。

      抽象類與抽象方法:使用指令字abstract說明,則該方法稱為抽象方法,包含抽象方法的類稱為抽象類。定義:procedure 過程名;virtual;abstract;

      第四章

      4.1 VCL基礎(chǔ)

      四種基本的組件類型:標(biāo)準(zhǔn)組件,自定義組件,圖形組件,非可視組件。圖形組件與標(biāo)準(zhǔn)組件的的區(qū)別在于:①標(biāo)準(zhǔn)組件可以獲得輸入焦點(diǎn),即可用Tab鍵依次獲得焦點(diǎn);圖形組件不能獲得輸入焦點(diǎn)。②標(biāo)準(zhǔn)組件可以包含其他組件,即可以是其他組件的父類;圖形組件不能包含其他組件。③標(biāo)準(zhǔn)組件具有一個(gè)WINDOWS句柄,圖形組件沒有WINDOWS句柄。

      4.2窗體設(shè)計(jì)

      窗體組件的屬性值設(shè)置為 組件名.屬性:=屬性值。重點(diǎn)看一下caption、visible、hint。

      窗體的方法和事件詳見P91.4.3常用VCL組件

      對(duì)于memo組件的編程填空要注意。列表框組件(listbox)的常用屬性見P104 4.4菜單設(shè)計(jì)

      對(duì)菜單項(xiàng)可以指定其加速鍵,方法是在菜單項(xiàng)的Caption屬性中,在要作為加速鍵的字母前添加符號(hào)“&”,則運(yùn)行時(shí)該字母帶有下劃線,按下Alt+加速字母鍵就執(zhí)行此菜單項(xiàng)。

      4.6對(duì)話框的使用

      Showmessage過程:調(diào)用Showmessage過程會(huì)彈出一個(gè)簡(jiǎn)單的對(duì)話框,對(duì)話框上顯示提示信息及“確定”按鈕,單擊該按鈕,就關(guān)閉對(duì)話框。

      Inputbox函數(shù):調(diào)用Inputbox函數(shù)顯示一個(gè)能夠接受喲娜防護(hù)輸入數(shù)據(jù)的對(duì)話框,并返回用戶輸入的數(shù)據(jù)值。

      Inputquery函數(shù):與Inputbox函數(shù)最大的不同是他的返回值是一個(gè)邏輯值。

      第五章 5.1程序調(diào)試

      錯(cuò)誤的種類及處理方式:

      1、語法錯(cuò)誤:沒有遵守語言的語法規(guī)則而產(chǎn)生。

      2、運(yùn)行錯(cuò)誤:程序在執(zhí)行過程中發(fā)生了錯(cuò)誤。程序試圖打開一個(gè)不存在的文件或試圖修改一個(gè)只讀文件,程序運(yùn)行過程中出現(xiàn)除零錯(cuò)誤或用戶輸入了非法數(shù)據(jù)等。

      3、邏輯錯(cuò)誤:運(yùn)行的結(jié)果與設(shè)想的結(jié)果不同。

      解決邏輯錯(cuò)誤可以從三步驟來解決:猜測(cè)出程序可能出錯(cuò)的地方,并在此設(shè)置斷點(diǎn)。讓程序執(zhí)行到斷點(diǎn)停止運(yùn)行,觀察所有中間變量及對(duì)象內(nèi)容。讓程序單步運(yùn)行,同時(shí)觀察每一個(gè)變量及對(duì)象內(nèi)容的變化。

      事件變量和相關(guān)數(shù)據(jù)的值:提示文本,watch list窗口,evaluate 窗口。5.2異常保護(hù)和處理

      1、異常保護(hù)與try?finally?end;語句 Try ? //被保護(hù)的代碼塊 Finally ? //處理語句 End;

      2、響應(yīng)異常和try?except?end;語句 Try //以下為保護(hù)代碼塊 ?

      If <異常條件> raise<異常對(duì)象> Except //以下為異常處理快

      On <異常類1> do <處理過程1或語句1> On <異常類2> do <處理過程2或語句2> On ?

      Else <其他處理過程或語句> End;

      通過繼承類exception可以自定義新的異常類。

      第6章 Delphi7與數(shù)據(jù)庫

      6.1數(shù)據(jù)庫簡(jiǎn)介 數(shù)據(jù)庫可以長(zhǎng)期存儲(chǔ)、有組織、可共享的數(shù)據(jù)集合。

      數(shù)據(jù)庫系統(tǒng)(database system,DBS)是指具有數(shù)據(jù)管理功能的計(jì)算機(jī)系統(tǒng)。它一般由數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)和應(yīng)用系統(tǒng)構(gòu)成。

      數(shù)據(jù)庫系統(tǒng)根據(jù)的組織方式主要分為層次數(shù)據(jù)庫系統(tǒng)、網(wǎng)狀數(shù)據(jù)庫系統(tǒng)、關(guān)系型數(shù)據(jù)庫系統(tǒng)很面向?qū)ο髷?shù)據(jù)庫系統(tǒng)等幾類

      Delphi支持關(guān)系型數(shù)據(jù)庫,關(guān)系型數(shù)據(jù)庫由表組成。標(biāo)的定義了事物的一組屬性數(shù)據(jù),稱為記錄。表的列定義了事物的某種屬性,稱為字段。6.2 Delphi7的數(shù)據(jù)庫訪問機(jī)制

      Borland推出了一個(gè)數(shù)據(jù)庫引擎(borland database engine,BDE)BDE管理器(BDE Administrator)是設(shè)置和管理BDE的工具,它可以用來管理BDE中的數(shù)據(jù)庫別名和驅(qū)動(dòng)器。Datebase Desktop的使用:

      1、定義數(shù)據(jù)庫別名

      2、設(shè)置工作目錄及私有目錄

      3、建立數(shù)據(jù)表結(jié)構(gòu)

      4、保存數(shù)據(jù)表文件

      5、建立索引(1)建立主索引(2)建立次索引

      6、設(shè)置有效性檢查

      7、設(shè)置口令

      8、設(shè)置參照完整性

      9、輸入部分?jǐn)?shù)據(jù)

      數(shù)據(jù)庫游覽器可用于定義數(shù)據(jù)庫別名、查詢或編輯數(shù)據(jù)庫中的各類信息,如數(shù)據(jù)庫的參數(shù)設(shè)置、各類據(jù)表文件的結(jié)構(gòu)及數(shù)據(jù),也可以使用SQL語句進(jìn)行查詢 6.3數(shù)據(jù)庫組件

      使用TTable組件連接并顯示數(shù)據(jù)表的一般步驟

      1、把一個(gè)TTable組件放到窗體上

      2、TableName屬性指定要訪問的表

      3、TDataSource組件放到窗體上,設(shè)置DataSet屬性指向該TTable組件

      4、把數(shù)據(jù)控制組放到窗體上,設(shè)置TDataSource屬性指向該TDataSource組件

      5、把TTable組件的Active屬性設(shè)為True Tablel.Fields[0].AsString:=Editl Edit.Text Editl.Text= Tablel Fields [0].AsString Editl.Text:= Tablel.FieldByName(‘Name’).AsString 當(dāng)表結(jié)構(gòu)改變引起字段索引號(hào)改變時(shí),就要修改相應(yīng)的程序,所以使用第二種方法比較好。

      DataSet屬性:表明于當(dāng) 前數(shù)據(jù)源組件相聯(lián)系的數(shù)據(jù)集組件對(duì)象的名字

      Enabled屬性:如果Enabled屬性值為True(默認(rèn)值),數(shù)據(jù)控制組件將顯示數(shù)據(jù):如果Enabled屬性值為False,則所有與此數(shù)據(jù)源組件相連的數(shù)據(jù)控制組件都將不顯示任何數(shù)據(jù)。

      Columna屬性用于指定TDBGrid對(duì)象中各欄目的特征 6.4 TField對(duì)象的使用

      動(dòng)態(tài)字段對(duì)象與永久字段對(duì)象的概念,區(qū)別,使用場(chǎng)合:Delphi會(huì)為數(shù)據(jù)中的每一個(gè)字段自動(dòng)生成一個(gè)動(dòng)態(tài)的字段對(duì)象。數(shù)據(jù)集的結(jié)構(gòu)和其他信息改變,當(dāng)應(yīng)用程序重新打開這個(gè)數(shù)據(jù)集時(shí),就會(huì)基于最近的結(jié)構(gòu)和信息重建所有的字段對(duì)象。當(dāng)數(shù)據(jù)集關(guān)閉時(shí),這些對(duì)象也跟著取消。

      動(dòng)態(tài)對(duì)象的最大特點(diǎn)是適應(yīng)性強(qiáng),缺點(diǎn)是要想改變字段的顯示屬性、數(shù)據(jù)格式就要編寫代碼,不能把某些字段暫時(shí)隱去,也不能增加新的字段。

      永久字段最大的好處是可以在設(shè)計(jì)時(shí)設(shè)置它的屬性。可以選擇部分字段,增加新的字段。再永久字段對(duì)象列表中刪除某些需要保護(hù)的字段,避免用戶訪問這些字段;在數(shù)據(jù)庫查詢或特定數(shù)據(jù)表的字段基礎(chǔ)上定義新的字段,代替現(xiàn)存的字段;改變?cè)械淖侄蔚娘@示和編輯屬性。6.5 數(shù)據(jù)集的操作 數(shù)據(jù)集的打開與關(guān)閉:

      1、設(shè)置Active屬性 Table.Active:=True;//打開數(shù)據(jù)集,數(shù)據(jù)集組件對(duì)數(shù)據(jù)表進(jìn)行讀寫操作。Table.Active:=False;//關(guān)閉數(shù)據(jù)集,數(shù)據(jù)集組件不能對(duì)數(shù)據(jù)表進(jìn)行讀寫操作。

      2、調(diào)用Open和Close方法 Table1.Opene//打開數(shù)據(jù)集和 Table1.Close//關(guān)閉數(shù)據(jù)集。移動(dòng)記錄指針:

      1、Bof屬性:如果Bof為True,表明當(dāng)前記錄指針?biāo)幍奈恢脼閿?shù)據(jù)集的第一條記錄;反之,則不是第一條記錄。

      2、Eof屬性:如果Eof為True,表明當(dāng)前記錄指針?biāo)幍奈恢脼閿?shù)據(jù)集的最后一天記錄;反之,則不為最后一條記錄。

      3、First方法:將記錄指針移至數(shù)據(jù)集的第一條記錄處,并使之成為當(dāng)前記錄,同時(shí)將Bof屬性值設(shè)置為True。

      4、Last方法:將記錄指針移至數(shù)據(jù)集最后一條記錄處,并使之成為當(dāng)前記錄,同時(shí)將Bof屬性設(shè)置為True。

      5、Next方法:將記錄指針后移一條記錄,并使之成為當(dāng)前記錄。如果記錄指針指向了數(shù)據(jù)集的最后一條記錄,將Eof屬性設(shè)置為True。

      6、Prior方法:將記錄指針前移一條記錄,并使之成為當(dāng)前記錄。如果記錄指針指向了數(shù)據(jù)集的第一條記錄,將Bof屬性設(shè)置為True。

      7、MoveBy方法:將記錄指針從當(dāng)前記錄開始向后或向前移動(dòng)若干條記錄。格式如下:function MoveBy(Distance:Integer):Integer;

      限制記錄集:

      1、SetRangeStart方法和SetRangeEnd方法可以過濾記錄。SetRangeStart方法用來限制記錄集的開始,SetRangeEnd方法用來限制記錄集的結(jié)束,調(diào)用ApplyRange方法使限制生效,調(diào)用CancelRange方法取消為數(shù)據(jù)表設(shè)定的限制范圍。

      2、使用數(shù)據(jù)集的Filter屬性

      Filter屬性值是一個(gè)用來指明數(shù)據(jù)表過濾標(biāo)準(zhǔn)的字符串,F(xiàn)ilter屬性決定了過濾器是否起作用。

      查找記錄:

      1、使用FindKey方法。使用Table的FindKey方法或FindNearest方法。

      2、搜索特定記錄(Locate)。FindKey或FindNearest方法只能在TTable組件中使用,如果使用的是TQuery或TStoreProc組件,就要使用Locate方法來查找記錄。Locate函數(shù)適合于所有數(shù)據(jù)集組件,也適合于TTable組件。AppendRecord方法與InsertRecord方法:這里兩個(gè)方法分別與Append方法與Insert方法相似,都是用于在表中插入一條新紀(jì)錄,但AppendRecord方法與InsertRecord方法比Append方法與Inser t方法更簡(jiǎn)單、更方便一些,不需要調(diào)用Post方法。過程形式如下:Procedure AppendRecord(Const Values:Array of Const);

      Procedure InsertRecord(Const Values:Array of Const);

      建立數(shù)據(jù)表的主從關(guān)系:設(shè)置表之間的主從關(guān)系是通過設(shè)置從表的MasterSource屬性和MasterField屬性來實(shí)現(xiàn)的,且從表必須按MasterField屬性中指定的字段建立了索引。

      6.6TQuery組件

      TQuery組件和TTable組件的比較:同屬于數(shù)據(jù)集組件。

      不同之處為:TQuery組件主要功能是用來支持SQL語言訪問本地或遠(yuǎn)程數(shù)據(jù)庫;TQuery組件允許用戶同時(shí)訪問多個(gè)表,而TTable組件一次只能訪問一個(gè)表格;TQuery組件訪問的是表格中的特定數(shù)據(jù)內(nèi)容,而TTable組件只有在提供過濾或限定檢索范圍時(shí)才能訪問表格中的特定數(shù)據(jù)內(nèi)容,否則訪問的將是表格中的全部數(shù)據(jù)。掌握P193 BDE綜合實(shí)例。

      6.8 ADO技術(shù)

      通過ADO不僅能夠訪問基于SQL Server的所有數(shù)據(jù)庫,而且可以通過ODBC訪問所有支持ODBC的數(shù)據(jù)庫。

      ODBC是一種采用開放式結(jié)構(gòu)進(jìn)行數(shù)據(jù)庫鏈接的接口標(biāo)準(zhǔn),是一種開放的獨(dú)立于廠商的API應(yīng)用程序接口。掌握P208 ADO應(yīng)用實(shí)例

      第七章 Windows編程基礎(chǔ)

      7.1動(dòng)態(tài)鏈接庫(DLL)

      Windows允許同時(shí)運(yùn)行的多個(gè)程序共享一組函數(shù)的單一備份,于是引入了動(dòng)態(tài)鏈接方式,將可共享的程序代碼以及各種數(shù)據(jù)資源編譯成單獨(dú)的模塊。

      一般項(xiàng)目的格式如下: Program 程序標(biāo)識(shí)符; Uses 單元列表; Begin 程序體; End.DLL項(xiàng)目文件的格式如下: Library 程序標(biāo)識(shí)符號(hào); Uses 單元列表;

      Exports 過程和函數(shù)標(biāo)識(shí)符列表; Begin 程序體; End.兩者的區(qū)別的原因在于:Delphi編譯器是一句項(xiàng)目文件頭的保留字是Program還是Library來決定編譯生成的是EXE文件還是DLL文件。若DLL 要輸出共其他應(yīng)用程序調(diào)用的函數(shù)或過程,則需要在其項(xiàng)目文件的保留字exports之后一一列出,這些DLL函數(shù)或過程將被編譯成遠(yuǎn)程地址調(diào)用。

      Window系統(tǒng)自身包含三個(gè)DLL,分別是Kernel,User,GD1。DLL調(diào)用必須使用標(biāo)準(zhǔn)方式,其一是靜態(tài)引用,其二是動(dòng)態(tài)引用。靜態(tài)引入:

      加載引用的DLL文件是,庫文件的查找順序是:

      1、當(dāng)前路徑;

      2、Windows系統(tǒng)的安裝目錄;

      3、Windows的系統(tǒng)目錄system和system32;

      4、列在環(huán)境變量PATH中的路徑。

      引入方法:

      1、最簡(jiǎn)單的是名字引入;

      2、使用索引引入;

      3、若名字引入會(huì)引起標(biāo)識(shí)符沖突,可以使用換名引入。

      第三篇:c++24點(diǎn)游戲

      c++24點(diǎn)游戲

      #include “iostream” #include “string” using namespace std;

      //定義Stack類

      const maxsize=20;

      enum Error_code { success, overflow, underflow };

      template class Stack { public: Stack();

      bool empty()const;bool full()const;int size()const;void clear();

      Error_code top(T &item)const;Error_code pop();

      Error_code push(const T &item);private: int count;T entry[maxsize];};

      template Stack::Stack(){ count=0;}

      template

      bool Stack::empty()const { return count==0;}

      template

      bool Stack::full()const { return count==maxsize;}

      template int Stack::size()const { return count;}

      template void Stack::clear(){ count=0;}

      template

      Error_code Stack::top(T &item)const { if(empty())return underflow;item= entry[count-1];return success;}

      template

      Error_code Stack::pop(){ if(empty())return underflow;count--;return success;}

      template

      Error_code Stack::push(const T &item){ if(full())return overflow;entry[count++]=item;return success;}

      Stack sign;Stack num;

      int set;

      // 判斷程序中的異常,以便適時(shí)退出?//

      void process(char c)

      //計(jì)算兩個(gè)數(shù)的 +-* / 運(yùn)算// { int k=0;double a,b;sign.pop();

      if(num.top(b)==success){

      num.pop();

      if(num.top(a)==success){ num.pop();k=1;} } if(k){ switch(c){

      case '+': num.push(a+b);break;case '-': num.push(a-b);break;case '*': num.push(a*b);break;case '/': if(b==0){ set=4;num.push(-1);} else

      num.push(a/b);break;} }

      else {set=1;num.push(-1);} }

      void get_command(string &str){

      cout<<“n請(qǐng)輸入要進(jìn)行運(yùn)算的表達(dá)式,包括” +,-,*,/,=,(,)“和數(shù)字,”<

      <<“注意: 以數(shù)字開頭,等號(hào)結(jié)尾,中間括號(hào)要匹配.”<>str;}

      double do_command(const string &str){ string s=“";

      double outcome=-1;char c;

      for(int i=0;str[i]!='