程式在做什麼 ? 接受外界的反應 如何接受輸入? Inputbox 進行運算 有哪些運算的東西? 輸出結果 如何輸出結果? Msgbox.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

第二章 VB的编程机制 【授课时间】第3周,第2次课 【授课题目】 2.1 面向对象程序设计概述 2.2 VB中的对象
5.1 掌握Power Scrip语言 5.2 使用控件 实训五 控件应用
指導教授 ~ 張志勇 組員: 彭勇盛 陳信通 吳建賦
計算機程式語言實習課.
第13章 数据库的基本应用 Visual Basic 程序设计教程.
File Access 井民全製作.
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
Chapter 5 迴圈.
第十章 進階輸出入元件(一) StringGrid 10-1 核對框(CheckBox)
第二十八章 開發新的VCL元件 雖然BCB內提供了很多VCL元件,但是一定還有一些我們常常需要用的介面並沒有製作成VCL元件,或是一些個人化的介面,我們也有需要做成VCL元件。在第十三章,我們將介紹如何自行開發新的VCL元件。
進階輸出入元件(一) 本書第三章已介紹Form 、Label 、Edit 及Button 等最基本的輸出入元件, 本章將繼續介紹一些可以提昇輸出入視覺效果的元件, 例如CheckBox 、RadioButton 及RadioGroup 等17 個進階元件, 學習本章將可提昇使用介面的親和性。 核對框(CheckBox)
BLANK overview.
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
Visual Basic快速入门 ADO数据控件与数据绑定控件 VB数据库编程举例 VB开发数据库应用系统实例分析
課程名稱:程式設計 授課老師:________
LINQ 建國科技大學 資管系 饒瑞佶.
連結資料庫 ACCESS MSSQL.
基础综合 C++ Builder 显示与输入接口
Q101 在701 SDX Linux上的標準安裝與使用程序v2
程式語言 -Visual Basic 變數、常數與資料型態.
页眉 基础综合 C++ Builder 按钮组件
資料庫操作2.
資料庫操作.
Google Data API Spreadsheet
ASP动态网页设计实用教程 主讲教师: 开课单位:.
1. 檔案File  開新New  檔案Empty File (再另存新檔D:\hello.c)
Delphi实用教程 第5章 多窗体和MDI窗体 第5章 多窗体和MDI窗体.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
R教學 安裝RStudio 羅琪老師.
第十二章 事件 12-1 KeyPress 12-2 KeyDown及KeyUp
安裝JDK 安裝Eclipse Eclipse 中文化
第十二章 Win32環境程式設計 這一章節可以說是本書精華之一,Win32程式設計算是比較複雜的部分,但是我們以最簡單的敘述帶領著大家進入Win32程式設計的殿堂,讓你寫出來的程式具有一定的水準以上。若能將本章與下一章的技巧靈活運用,更能讓大家寫出高階的視窗程式。
網頁切換移轉 JS vs. ASP.NET.
Visual Basic 物件導向程式設計簡介.
App Inventor2呼叫PHP存取MySQL
第二章 SPSS的使用 2.1 啟動SPSS系統 2.2 結束SPSS系統 2.3 資料分析之相關檔案 2.4 如何使用SPSS軟體.
Java 程式設計 講師:FrankLin.
第二章 创建用户界面 本章重点和难点 2.1 基本属性 2.2 创建窗体 2.3 Visual Basic的常用控件 2.4 制作菜单.
第六章 擷取輸入裝置的訊息和事件 鍵盤、滑鼠,是我們最常使用的輸入工具。我們是不是常常希望可以再按下某個按鈕後就可以有哪些功能出現呢?沒錯,這就是這一章節的重點,在第四章,我們提到了有關鍵盤、滑鼠、以及RS-232介面的事件及訊息偵測,讓我們更能掌控電腦週邊的硬體。
網頁切換移轉 JS vs. ASP.NET.
程式設計 Visual Basic簡介 週次:2 建國技術學院 資管系 饒瑞佶 2003年9月17日.
第一單元 建立java 程式.
VS.NET 2003 IDE.
Ch20. 計算器 (Mac 版本).
Pocket Access.
VB2005 DataBase Manipulation Command for Access
表格(HTML – FORM).
期末考.
GUI Title and GUI Status
挑戰C++程式語言 ──第8章 進一步談字元與字串
Controls.
GridView.
GridView操作 (II).
利用 EditorConfig 自訂文字編輯器設定
挑戰C++程式語言 ──第7章 輸入與輸出.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
陣列與結構.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
連結資料庫 MYSQL.
多國語系 建國科技大學 資管系 饒瑞佶.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
SQLite資料庫 靜宜大學資管系 楊子青.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
Unix指令4-文字編輯與程式撰寫.
Develop and Build Drives by Visual C++ IDE
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

程式在做什麼 ? 接受外界的反應 如何接受輸入? Inputbox 進行運算 有哪些運算的東西? 輸出結果 如何輸出結果? Msgbox

資料處理 繪圖 工具軟體 開發軟體 作業系統 驅動程式 資料處理程式乃是程式中佔最大宗的程式 程式的類型 資料處理 繪圖 工具軟體 開發軟體 作業系統 驅動程式 資料處理程式乃是程式中佔最大宗的程式

系統架構的演進 集中式資料處理方式 銀行櫃臺 檔案式資料處理方式 報稅系統 主從式資料處理方式 不勝枚舉 N-Tier資料處理方式

系統開發的演進 檔案存取方式 簡單的資料庫檔案+專屬高階語言,如dBase 簡單的資料庫檔案+專屬高階語言+進步的Compiler,如Clipper 較複雜的資料庫檔案+獨立的高階語言,如Access + VB ==> Client/Server架構 先進的資料庫軟體+專屬開發語言,如Oracle+Developer 2000==>4 GL

系統開發的演進(續) 先進的資料庫軟體+獨立高階語言,如Oracle + Visual Basic 先進的資料庫軟體+中介軟體+獨立高階語言,如Oracle + MTS + Visual Basic==> N-Tier

主從架構的分工 前端(Client) 後端(Server) 通常是一個高階語言,如Visual Basic GUI 存取後端資料 計算原則 資料庫伺服器,如 MS SQL Server 提供資料的存取 加強資料的控管

Delphi 簡介

Form 介紹 範例一:一個 form 的程式 專案選項的設定 儲存檔案 Application directories/conditionals 儲存檔案 程式的副檔名 --> .pas 專案的副檔名 --> .dpr 表格的副檔名 --> .dfm 資源的副檔名 --> .res

view source program --> 專案名稱 use --> 使用到那些檔案 in -->使用到檔案的位置 begin………end; Application.initialize Application.CreateForm(TForm1, Form1) Application.Run

Delphi 程式撰寫工具 code completion code templates: ctrl+J 方法一:ctrl+space 方法二:輸入物件名稱及句點後,等約一秒即出現 code templates: ctrl+J code parameters:輸入函數名稱及左括號後,等約一秒即出現 tool-tip expression evaluation:將滑鼠指到變數上,系統即告知此變數再何處宣告或其內容為何

Delphi 程式撰寫注意事項 不分大小寫 每一行指令結束時要加分號; 每一個procedure都有一個begin及end; 變數使用前一定要宣告

attribute 屬性介紹 name、caption windowstate (max,min,normal) color font borderstyle top、left、height、width visible

方法(method)介紹 show hide close

event 事件介紹 表單出始時觸發的事件 表單結束時觸發的事件 按一下滑鼠所觸發的事件 按一下鍵盤所觸發的事件 Oncreate,onshow,onactivate 表單結束時觸發的事件 Onclosequery ,onclose 按一下滑鼠所觸發的事件 OnMousedown, OnMouseUp,Onclick 按一下鍵盤所觸發的事件 Onkeydown, Onkeypress,Onkeyup Onclick 將form的變大10個pixel OnDblClick 將form的變小10個pixel

delphi 函數 showmessage(‘hello!’); showmessage(form1.name); showmessage(‘form的高度為’ + IntToStr(form1.height)); showmessage(datetimetostr(now));

加入元件 button: 加入的物件後,delphi會自動將宣告procudrue 練習1(ex1dpr1) 改變form的顏色 mousedown, mouseup 改變form1的caption 加入的物件後,delphi會自動將宣告procudrue 練習1(ex1dpr1)

基本輸出入函數 Messagebox、MessageDlg InputBox InputQuery 建立一個button,並於click事件中加入 if application.messagebox(‘確定要離開嗎?’, ‘確認’, MB_YESNO+MB_defbutton2+ MB_iconinformation+MB_systemModal) =IDYes then close; (see page 10-6) 問題: 如果使用者直接於功能表列上去按關閉鈕呢 Messagebox與messageDlg功能不同之處只在Messagebox可以設定標題的文字。 InputBox 建立Button1、Label1,並於Button1的Click事件中加入 label1.caption:=inputbox(‘代號’,‘請輸入代號',’default value'); 使用者若按cancel, 則傳回預設值。 InputQuery 與InputBox類似,但傳回的是一個Boolean值,True 代表使用者按下 OK,false 代表Cancel 將上例改為InputQuery,若使用者按下Cancel,則label1的標題設定為‘取消’ case InputQuery(‘代號’,‘請輸入代號',str) of true: label1.caption:= str+#10#13+’按下確定‘; false: label1.caption:= str+#10#13+’按下取消‘; end;

程式架構 Delphi以unit為基礎,其基本架構如下: unit Unit1; interface uses Windows, ... type … end; implementation

程式註解 適當的註解可以提供使用者較容易瞭解程式,Delphi 4提供了三種註解的寫法: // :單行的註解 { } : 區塊註解 // :單行的註解 { } : 區塊註解 (* *) : 區塊註解

流程控制(Cont…) 判斷控制 If condition then begin … end else begin … end; 範例 Case condition of cond1 : statement ; cond2 : statement ; … else : statement ; end ; 範例 寫一個程式,當輸入的結果 顯示 >=90 A >=80 And <90 B >=70 And <80 C >=60 And <70 D <60 E

流程控制 迴圈控制 Repeat …; Until condition; While condition do begin … end ; For 變數=初始值 to 結束值 do begin … end ; 計算1+3+…..+9999

流程控制(Cont…) 例外處理 範例 try … ... except on exception do statement … end; try … finally … end; 範例 mydate:Tdatatime try mydate:=strtodatetime(‘xx/xx/1999’); except on EconvertError do showmessage(‘出現例外’); end; (需在tools/debugging options的Language Exceptions中將 stop on delphi exceptions 拿掉 )

其他控制 With Object1… do begin statement; statement; … statement; end; 範例 with button1 do begin font.color:=clgreen; height:=50; width:=50; end;

練習:由使用者輸入一個數字與程式內定的答案做比對,如果太大(太下)就秀出太大(太小),重新再輸入一下,直到猜對為止,當猜對時要秀出使用者共猜了幾次。 try Randomize; answer:=random(100); j:=0; while bingo<>true do begin guessnum:=strtoint(inputbox('guess','please input a number','')); j:=j+1; if guessnum>answer then showmessage('too big') else if guessnum<answer then showmessage('too small') else showmessage('一共猜了' + inttostr(j)+ '次'); bingo:=true; end; except on EconvertError do showmessage('無效的數字'); if application.messagebox(‘還要在猜嗎?','確認', MB_YESNO+MB_defbutton2+ MB_iconinformation+MB_systemModal) =IDYes then form1.Button1Click(nil);

運算式 算術:+ - * / div (取整數) mod (取餘數) 布林:not and or xor 字串:+ 集合:+ - * <= >= = <> in

運算範例 範例一 範例二 a:=5;b:=3 showmessage(inttostr(a and b)); var a,b : set of byte a:=[1,2,3];b:=[1,2,3,4] if a <= b then showmessage(‘a <= b’) else show message(‘a > b’);

資料型態 PASCAL提供了下列各種資料型態 數字型態: Integer 4 Bytes -2147483648~2147483647 Cardinal 4 Bytes 0~4294967295 ShortInt 1 Byte -128 ~ 127 SmallInt 2 Bytes -32768~32767 LongInt 4 Bytes -2147483648~2147483647 Int64 8 Bytes -263 ~ 263 - 1 Byte 1 Byte 0 ~ 255 Word 2 Bytes 0 ~ 65535 LongWord 4 Bytes 0~4294967295

資料型態(Cont…) 字元型態 布林型態 列舉型態 Char 1 Byte AnsiChar 1 Byte WideChar 2 Bytes 布林型態 True False 列舉型態 Type 列舉名稱 =(列舉 1, 列舉 2, 列舉 3,…)

資料型態(Cont…) 範圍資料型態 實數型態 Type MyNumber = -128..127 Real48 6 Bytes 2.9*10-39 ~ 1.7*1038 Single 4 Bytes 1.5*10-45 ~ 3.4*1038 Double 8 Bytes 5*10-324 ~ 1.7*10308 Extended 10 Bytes 3.6*10-4951 ~ 1.1*104932 Comp 8 Bytes -236+1 ~ 263 -1 Currency 8 Bytes -922337203685447.5808 ~ 922337203685447.5807 Real 8 Bytes 5*10-324 ~ 1.7*10308

資料型態(Cont…) 字串型態 集合型態 ShortString 2 Bytes ~ 256 Bytes AnsiString 4 Bytes ~ 2 GB WideString 4 Bytes ~ 2 GB 集合型態 集合型態是由一群相同序數型態的元素所組成的集合,其序數是介於 0 ~ 255 TmyInt= 0..255 ; Tmyintset = Set of TmyInt ;

資料型態(Cont…) 陣列型態 紀錄型態 指標型態(pointer) 變形資料型態 (variant) TmyArray = array[0..9] of Integer; 紀錄型態 TMyStudent = Record Name: String]50]; IDNO: String[20]; … end 指標型態(pointer) 變形資料型態 (variant)

資料型態範例 範例一 範例二 範例三 for I:=1 to 9 do myarray[I,j]:=I*j; procedure TForm1.Button1Click(Sender: TObject); type mycolor=(r,g,b); var x : mycolor; Begin x:=g; case x of r : showmessage('紅色'); g : showmessage('綠色'); b : showmessage('藍色') end; End; //試著給x不同的值看看 範例二 I : integer; str:string; begin str:=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’; for I:=0 to length(str) do if I mod 2 = 0 then str[I]:=‘$’; showmessage(str); end. 範例三 myarray=array[1..9,1..9] of integer I , j : integer; str:=‘’; for I:=1 to 9 do for j:=1 to 9 do myarray[I,j]:=I*j; str:=str+inttostr(myarray[I,j])+’,’; str:=str+#10#13;

變數宣告及生命週期 用var來宣告,如宣告 x:integer; 在procedure內宣告的話,屬於local變數,於此procedure結束時,此變數就消失了 在implementation中宣告的話,屬於global變數,其生命週期與unit相同; global變數可以給定初始值

函數/程序 宣告function mysum(x,y:integer):integer; 可宣告於type 之內、外,之內代表屬於form之member function,實作時需加 Tform1,且呼叫時也要加form1;宣告於Type之外則屬於整個程式所有,故呼叫時直接用函數即可。 實作 function mysum(x,y:integer):integer; begin mysum:=x+y; end ; 於 button1 的onclick事件中輸入 showmessage(inttostr(mysum(5,3))); //宣告於Type之外 showmessage(inttostr(form1.mysum(5,3))); //宣告於Type之內

參數傳遞 傳值與 不定個數的參數 open parameters 內定 為傳值傳遞 用var 指定為傳址傳遞 用 const指定為傳值傳遞,且不能改變參數值 撰寫兩個procedure如下 procedure byval(myval : integer); begin myval:=myval*myval; end; procedure byvar ( var myval : integer); 新增一個button,並於click事件中加入 procedure TForm1.Button2Click(Sender: TObject); var x:integer; x:=4; byval(x); showmessage(inttostr(x)); 分別呼叫byval及byvar 會得到不同的結果 不定個數的參數 open parameters 製作一個函數如下,可接受任意長度的整數矩陣 function mysum (a:array of integer):integer; var i:integer; sum:integer; sum:=0; for I := 0 to High(a) do sum := sum +a[i]; result:=sum; (記得也要宣告) 另外,新增一個button,並於其click事件填入 procedure TForm1.Button1Click(Sender: TObject); const max_x=6; var x:array[0..max_x] of integer; i:integer; for i:=0 to high(x) do x[i]:= i; showmessage(inttostr(mysum(x))); end

物件寶庫的使用 使用時機:對於專案常用或共用的表單統一做成一個供大家使用 設計一個專案共用的表單

parent、owner、sender與 self 介紹 範例一:建立panel1及button1,button2,觀察button1會隨panel1而移動,所以button1的parent為panel1 範例二: 建立button1的onclick 事件如下 if sender is tbutton then showmessage( (sender as tbutton).caption) else showmessage(‘no sender’); 設定button2的onclick內容與button1共用 設定button3的onclick內容為:button1click(nil);

滑鼠事件 OnMouseDown OnMouseMove MbLeft:使用者按下左鍵 Mbmiddle:使用者按下中間鍵 Mbright:使用者按下右鍵 建立button1的OnMouseDown 的事件如下 case button of mbleft : edit1.text:=‘你按下左鍵’; mbmiddle : edit1.text:=‘你按下中間鍵’; mbright : edit1.text:=‘你按下右鍵’; end; OnMouseMove 於form1的OnMouseMove事件加入 edit2.text:=‘X 座標 : ’+inttostr(x)+’ , Y座標 :‘+ inttostr(y);

鍵盤事件 OnKeyDown OnKeyPress 練習ex2 於edit1的 OnKeyDown事件中加入 if ((key=13) and (shift=[ssalt,ssctrl])) then begin edit2.SetFocus; edit2.SelectAll; end; OnKeyPress OnKeyPress的key值是一個char; OnKeydown的key值是word; 於form1的 onkeypress事件中加入 showmessage(key); //需將edit1的enabled設為false,否則無法引發form1的onkeypress 事件。 練習ex2

form特有屬性及操作 Active:判斷 form是否為active ActiveControl:判斷目前form的那一個物件為active 在form1上加入edit1、edit2、timer及label1,並在Timer的OnTimer事件中加入以下程式 timerinterval:=100; label1.caption:=activecontrol.name+’ is active.’; bordericon:設定form在左上角是否出現最大、最小、關閉及help的按鈕。 Bordericons:=[biSystemMenu,biMinimize,biMaximize] Bordericons:=Bordericons-[biMaximize] (取消最大鈕) Bordericons:=[] (取消所有的icon) windowsState:wsMaximized,wsMinimized,wsNormal ShowHint及Hint:提示訊息 修改form1及edit1的showhint為true,並在hint屬性中填入‘這是form1’、 ‘這是edit1’ TabOrder及TabStop TabOrder:控制元件取得焦點的順序 TabStop:決定控制元件是否可以取得焦點 分別建立edit1,edit2,edit3,edit4,並將edit2的TabStop設為false 利用 findnextcontrol 尋找下一個tabstop findnextcontrol(activecontrol,true,true,true).setfocus ; hide、show 建立form1、form2,並分別加入一個button1,再於form1的button1中加入 form2.show; form1.hide; 再於form2的button1中加入 form1.show; form2.hide; 範例:執行form1時自動出現password視窗

Canvas物件 //亂數產生三個圓 procedure TForm1.Timer1Timer(Sender: TObject); var x,y,r,g,b:integer; begin if num< 3 then num:=num+1; randomize; with form1.Canvas do for i:=1 to 20 do x:=random(width); y:=random(width); r:=random(256); g:=random(256); b:=random(256); brush.Color:=rgb(r,g,b); Ellipse(x,y,x+10,y+10); end; end else form1.Refresh; num:=0

Image螢幕保護程式 procedure TForm4.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin self.Close; end; procedure TForm4.FormActivate(Sender: TObject); image1.top:=self.top; image1.left:=self.left; image1.width:=self.width; image1.height:=self.height; procedure TForm4.Timer1Timer(Sender: TObject); image_index:=image_index+1; if image_index>3 then image_index:=1; image1.Picture.LoadFromFile( 'c:\mydelphi\'+inttostr(image_index)+'.jpg');

圓球螢幕保護程式 var Form3: TForm3; red:integer; topdirection:integer=1; // 1代表往下,2 代表往上 leftdirection:integer=1; // 1代表往右,2 代表往左 implementation {$R *.DFM} procedure TForm3.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin self.Close; end; procedure TForm3.Timer1Timer(Sender: TObject); //var red,green,blue:integer; // var red:integer; // randomize; // red:=Random(256); // green:=Random(256); // blue:=Random(256); red:=red+10; if red>255 then red:=0; self.Color:=rgb(red,0,0); procedure TForm3.Timer2Timer(Sender: TObject); var i,r,g,b,x,y,x2,y2,size:integer; randomize; for i:=1 to 20 do r:=random(256); g:=random(256); b:=random(256); x:=random(self.Width); y:=random(self.height); x2:=random(self.Width); y2:=random(self.height); size:=random(50); {畫圓 self.Canvas.brush.Color:=rgb(r,g,b); self.Canvas.Ellipse(x,y,x+size,y+size); } //畫線 self.Canvas.Pen.Color:=rgb(r,g,b); self.Canvas.MoveTo(x,y); self.Canvas.lineto(x2,y2); // self.Canvas.Rectangle(x,y,x+size,y+size) end; // end i // self.Canvas.Brush.Style:=bsDiagCross; // self.Canvas.Brush.Color:= clgreen; // self.Canvas.Pen.Color:=clgreen; // self.Canvas.MoveTo(200,300); // self.Canvas.lineto(500,500); // self.Canvas.Pie(100,100,200,250,300,350,400,400) procedure TForm3.Timer3Timer(Sender: TObject); self.Refresh; procedure TForm3.Timer4Timer(Sender: TObject); var r,g,b:integer; if (topdirection=1) and (shape1.top< (self.Height-shape1.Height)) then shape1.top:=shape1.top+20 else if (topdirection=1) and (shape1.top > (self.Height-shape1.Height)) then topdirection:=2; end else if (topdirection=2) and (shape1.top >= 0) then shape1.top:=shape1.top-20 else if (topdirection=2) and (shape1.top<=0) then topdirection:=1; if (leftdirection=1) and (shape1.left<(self.width-shape1.width)) then shape1.left:=shape1.left+20 else if (leftdirection=1) and (shape1.left > (self.width-shape1.width)) then leftdirection:=2; else if (leftdirection=2) and (shape1.left >= 0) then shape1.left:=shape1.left-20 else if (leftdirection=2) and (shape1.left <=0) then leftdirection:=1; // shape1.Brush.Color:=rgb(r,g,b);

Snow 螢幕保護程式 procedure TForm5.FormActivate(Sender: TObject); begin randomize; for i:=1 to 100 do snow[i]:=Tshape.Create(self); snow[i].parent:=self; snow[i].visible:=true; snow[i].Shape:=stcircle; snow[i].top:=random(self.Height); snow[i].left:=random(self.width); snow[i].Width:=random(20); snow[i].height:=random(20); end; // end for i end; procedure TForm5.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); self.close; procedure TForm5.Timer1Timer(Sender: TObject); if snow[i].top < self.Height-snow[i].Height then snow[i].top:=snow[i].top+5 else snow[i].top:=0;

文字控制物件 TEdit:只能編輯一行。 TMaskEdit:只能編輯一行,但能指定輸入的格式。 TMemo:能編輯多行。 TRichEdit:能編輯多行、能設定文字的字行格式。

TEdit Text:取得TEdit 的內容 MaxLength:設定最多能輸入多少字元 CharCase:強迫使用者輸入的字元為大寫或小寫 PasswordChar:隱藏使用者輸入的字元 建立button1、edit1及edit2,並將edit2的PasswordChar設為*,再於button1的click事件中加入 if edit2.text <> ‘’ then showmessage(‘你輸入的帳號為 ’+ edit1.text+#10#13+’你輸入的密碼為 ‘ +edit2.text) else showmesssage(‘密碼不能空白’); Readonly:設定只能讀取 Modified:判斷edit的內容是否被修改過 建立button1、edit1及edit2,再於button1的click事件中加入 if edit1.modified then edit2.text:=edit1.text; selLength:取得使用者所選取的字串長度。 SelStart:取得使用者所選取字串的起始位置。 selText:取得使用者所選取的字串內容。 建立button1、edit1,再於button1的click事件中加入 str:=‘字串長度為 ’+ inttostr(edit1.selLength)+#10#13; str:=str+ ‘字串起始位置為 ’+ inttostr(edit1.selStart)+#10#13; str:=str+ ‘字串內容為 ’+edit1.selText; showmessage(str); CanUndo:設定是否有Undo的功能。 Clear:清除內容 selectAll:將全部內容選起來 OnEnter事件:當Tedit取得焦點時引發的事件 OnExit事件:當Tedit失去焦點時引發的事件 建立button1、edit1及edit2,再於edit1的OnEnter事件中加入 edit1.clear; 於edit1的OnExit事件中加入 edit2.text:=edit1.text; edit2.selectall;

TMaskEdit Editmask:設定輸入的格式 defaultblank 建立MaskEdit1,並設定editmask=‘!99_ll-aa;1’ ! 代表去除!之前的空白字元 9 代表只能輸入數字 l 代表只能輸入字母 a 代表只能輸入字母或數字 defaultblank

TMemo text:Tmemo的全部內容 lines:設定Tmemo的單行內容 append:附加資料到Tmemo LoadFromFile、SaveToFile:從檔案中存取資料 建立edit1、memo、button1、button2、button3及button4 於button1的click中加入memo1.lines.savetofile('c:\memotext'); 於button2的click中加入memo1.lines.loadfromfile('c:\memotext'); 於button3的click中加入memo1.lines.append(edit1.text); 於button4的click中加入memo1.clear;

TRichEdit defAttribute:設定字型 selAttribute :設定所選取字串的字型 建立edit1、RichEdit1、button1、button2、button3及button4、於button1的click中加入 with Richedit1.defAttributes do begin height:= height+2; color:=clBlue; style:= [FsBold,FsItalic,FsUnderline]; end; 於button2的click中加入 with Richedit1.selAttributes do size:= size+2; name:=‘Arial’; 於button3的click中加入 Richedit1.lines.LoadFromFile(‘c:\memotext’); 於button4的click中加入 Richedit1.lines.SaveToFile(‘c:\memotext’); 練習三(ex3)

TBitButton 與Tbutton相同,但可顯示小圖示 Kind 屬性:設定button的種類 (see page 8-6) Glyph屬性:設定自己的小圖示 Margin屬性:設定小圖示與邊界的距離 Spacing屬性:設定小圖示與文字的距離 Layout屬性:設定小圖示與文字的排列方式 blGlyphleft、 blGlyphRight、 blGlyphTop、 blGlyphButtom

TToolBar BorderWidth屬性:button與toolbar之間的垂直距離 Indent屬性:button與toolbar之間的水平距離 list屬性:button的承現方式 transparent屬性:決定toolbar 是否為透明 showcaptions屬性:決定是否顯示button的文字 Flat屬性:決定是否用“平平”的方式顯現 image屬性:設定所對應的圖片串列 建立一個ToolBar、ImageList,並於toolbar中加入五個按鈕及指定image 屬性為imagelist 按imagelist 兩下,加入“\borland\delphi5\demos\doc\ graphex”下的影像

TUpDown Orientation:顯示的方向(udHoriental,udVertical) Associate:設定要連結的物件 Increment:每次的改變量 Max/Min:允許的最大/最小值 Position:updown目前的值 練習四(ex4)

TListBox Items:資料項目 MultiSelect:決定是否可以多選 SelCount:使用者選取項目的總數 Selected:判斷某個資料項目是否被選取 建立一個Listbox1及button1,於listbox1的Items中加入星期一至星期日,再於button1的click中加入 str:=‘你共選取了 ’+inttostr(listbox1.selcount)+’個項目‘ +#10#13; for I:=0 to listbox1.items.count-1 do if listbox1.selected[I] then str:=str+listbox1.items[I]+#13#10; showmessage(str); Clear:清除所有資料項目 Add:加入一個資料項目於listbox的後面 Insert:加入一個資料項目於listbox的特定索引位置 Delete:刪除listbox特定索引位置的一個資料項目 Exchange:將兩個資料項目交換位置 建立Listbox1、edit1及button1、button2、button3,於listbox1的Items中加入星期一至星期日, 於button1的click事件中加入 listbox1.items.add(edit1.text); 於button2的click事件中加入 if listbox1.selected[I] then listbox1.items.delete(I); 於button3的click事件中加入 listbox1.clear; (於delete時會發生錯誤! Why?) 修改如下 i:=0; while i<= listbox1.items.count-1 do if listbox1.Selected[i] then begin listbox2.items.Add(listbox1.items[i]); listbox1.Items.delete(i); end else i:=i+1; 練習五 (ex5)

TCombobox 與ListBox相似,但只能選取一個項目 Text屬性:選取的內容 DropDownCount屬性:下拉時顯示的資料項目個數 Style屬性:決定使用者是否有輸入的權限,當Style設定為 csDropDown與csSimple時才允許輸入。 建立Listbox1、Combobox1及Combobox2,於combobox1的items 中加入星期一至星期日,於combox2的items 中加入Monday 至 Sunday, 再於combobox1的Onchange事件中加入 combobox2.itemindex:= combobox1.itemindex; listbox1.items.add(combobox1.text); 於combobox2的Onchange事件中加入 combobox1.itemindex:= combobox2.itemindex listbox1.items.add(combobox2.text);

TRadioButton checked屬性:判斷是否被選取 建立二個Radiobutton及一個button、 Radiobutton的Caption分別是‘男性’、‘女性’,再於Button1的click事件中加入 if Radiobutton1.checked then showmessage(‘性別 是’+ Radiobutton1.caption) else if Radiobutton2.checked then showmessage(‘性 別 是’+ Radiobutton2.caption) else showmessage(‘未知性別’);

TCheckbox 與radiobutton相似,但可複選 將上例的Radiobutton改成checkbox,checkbox的Caption屬性填入delphi,VB,Button1的click事件改為 str:='你選了 '; if (checkbox1.checked) then str:=str+checkbox1.caption; if (checkbox2.checked) then str:=str+checkbox2.caption; label1.caption:=str;

TRadioGroup Items:項目的標題名稱 Itemindex:被選取的項目 columns:顯示的欄位數 建立Radiogroup1、Radiogroup2、button1及label1,於Radiogroup1的items屬性中填入Delphi,VB,FoxPro,於Radiogroup2 items屬性中填入Informix,Oracle,Sybase,再於Button1的click事件中加入 label1.caption:=Radiogroup1.Items[Radiogroup1.itemindex] +','+Radiogroup2.Items[Radiogroup2.itemindex];

TdriveCombobox、TDirectoryListBox、TFileListBox、TFilterComboBox 建立如練習六(ex6)

Opendialog與SaveDialog Title屬性:對話框的標題 InitialDir屬性:對話框的起始目錄 Filename屬性:使用者所選的檔案名稱或對話框開啟時預設的檔名 Filter屬性:檔案的過濾條件 DefaultExt屬性:對話框預設的副檔名 建立Button1、opendialog1,於Button1的Click事件中加入 opendialog1.initialdir:='c:\temp'; if opendialog1.execute then memo1.lines.loadfromfile(opendialog1.filename); (自行練習 將上例增加一個savedialog)

OpenPictureDialog 與 SavePictureDialog 承續上例,建立OpenPictureDialog 1與 SavePictureDialog1,將memo物件改為image,並將button1的Click事件改為 openpicturedialog1.initialdir:='c:\windows'; if openpicturedialog1.execute then image1.picture.loadfromfile(openpicturedialog1.filename);

FontDialog font屬性:記錄對話框傳回的設定值 建立Button1、richedit1、fontdialog1,於Button1的Click事件中加入 if fontdialog1.execute then begin richedit2.defattributes.color:=fontdialog1.font.color; richedit1.defattributes.assign(fontdialog1.font); end;

ColorDialog Color屬性:記錄對話框傳回的設定值 接上例、再建立Colordialog1,於Button1的Click事件中再加入 if colordialog1.execute then richedit1.text:=colorToString(colordialog1.color); form1.color:= colordialog1.color;

TPageControl 新增一頁:選定PageControl後按右鍵選new Page ActicePage屬性:目前Active的Page HotTrack屬性:決定當滑鼠指到頁標題時,標題文字是否要變顏色 Image屬性:每頁顯示的圖型 Style屬性:頁標題的顯示方式 TabPosition屬性:頁標題顯示的位置 OnChanging及Onchange事件:當切換至另一頁時產生的事件, OnChanging 發生在切換前, OnChange 發生在切換後。 建立一個pagecontrol1並新增兩頁,修改Caption2為第一頁及第二頁,於Onchanging事件中加入 if messagedlg(‘真的要離開’ + pagecontrol1.activepage.caption, MtConfirmation,[mbYES,MBNO],0) =MRYES then allowchange:=true else allowchange:=false; 於Onchange事件中加入 showmessage(‘你已進入’+pagecontrol1.activepage.caption);

Datetimepicker date,time屬性 var d:Tdate; d:=datetimepicker1.date; showmessage(datetostr(d));

TProgressBar Max/Min屬性:執行範圍的最大/最小值。 step屬性:每次的增加量 stepit方法:啟動Progressbar一次 自定一個RunProgress的procedure如下 (要用progress需 uses comctrls) procedure TForm1.RunProgress(Total,StepQ: Integer); var ProgressBar1: TProgressBar; i: Integer; begin ProgressBar1 := TProgressBar.Create(Self); try ProgressBar1.Parent := Self; ProgressBar1.Align := alBottom; ProgressBar1.Min := 0; ProgressBar1.Max := Total; ProgressBar1.Step := StepQ; //重複的次數 for i := 1 to Total do ProgressBar1.Stepit; ShowMessage('執行完畢!!'); finally ProgressBar1.Free; //將TProgressBar物件Free end; 於button1的click事件中加入 RunProgress(strtoint(edit1.text),strtoint(edit2.text));

TStatusBar Panels屬性:在StatusBar下新增的Panel SimpleText:顯示的訊息。 建立一個StatusBar1,選定StatusBar1按右鍵,選擇Panel Editor後,新增兩個Panels,將此兩個Panel的Width設為150 於form1的mousemove事件中加入 statusbar1.panels[0].text:=‘滑鼠的位置’ + inttostr(x) +','+inttostr(y); statusbar1.panels[1].text:=format('滑鼠的位置%d ,%d',[x,y]); (format的語法請看On_line help)

動態產生元件 procedure TForm1.Button1Click(Sender: TObject); type labelarray=array[0..9] of Tlabel; var mylabel:labelarray; i:integer; begin for i:=0 to 9 do mylabel[i]:=tlabel.Create(self); mylabel[i].parent:=self; mylabel[i].Visible:=true; mylabel[i].width:=30; mylabel[i].Height:=10; mylabel[i].Left :=30*i; mylabel[i].caption:='label' + inttostr(i); end;

主功能表(MainMenu)的使用 加入MainMenu1元件,於Items屬性快點兩下即可加入項目 分別於Caption屬性中輸入showform1、showform2、-(輸入“ - ”代表分隔線)、及showform3。 於showform3中按Ctrl+ 往右鍵,可輸入子項目 將formstyle設為fsMDIForm,form1及form2的formstyle設為fsMDIChild 於showform1的Click事件中輸入 form1.show; form2.hide; 於showform2的Click事件中輸入 form2.show; form1.hide; 需於MDIChild的onclose事件中加入 action:=cafree; 否則無法關閉child視窗 加入actionlist,並加入standaction中的cascade、Title Horientially…..等標準的Action。 再於主視窗的mainmenu功能表中加入windows的功能表,並於action的數性中設定cascade、Title Horientially……等。 設定主視窗之windowmenu屬性,可於執行時動態的顯現已開啟的視窗

PopupMenu checked屬性 加入Richedit1及PopupMenu1元件,於Items屬性快點兩下即可加入項目 分別於Caption屬性中輸入Bold、Italic、Underline 於bold 的onclick屬性中輸入 if not (fsbold in richedit1.defattributes.style) then begin richedit1.defattributes.style: = richedit1.defattributes.style + [fsbold]; popupmenu1.items[0].checked:=true; end else begin richedit1.defattributes.style:=richedit1.defattributes.style - [fsbold] popupmenu1.items[0].checked:=true; end; end; 另一種寫法: with richedit1.defattributes do if not (fsbold in style) then style:=style+[fsbold] else style:=style-[fsbold] 指定form1的Popupmenu屬性為Popupmenu1 練習:將上例完成。(於Italic及Underline分別加入程式)

MDIForm 新增一個form1,並將其formstyle屬性設為fsMDIForm,於其上加入一個MainMenu (含有file、new等之功能表選項)。 新增一個form2,並將其formstyle屬性設為fsMDIChild。 設定use unit1; 於foromclose事件中加入 procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=cafree; form1child:=nil; end; 於form1中宣告一個變數form1child,並於Interface的use中加入 unit2; 於form1的Mainmenu的click事件中加入 if not assigned(Form1child) then form1child:=Tform1.Create(Application); form1child.show;

ShellExecute的使用 用來執行另一個檔案或打開一個檔案 需在uses 中加入 shellapi,要查用法可打開 win32.hlp檔案取查詢(需去尋找此檔案) shellexecute(handle,'open','http://www.seed.net.tw',nil,nil,sw_shownormal); shellexecute(handle,'open','project1.exe',nil,'c:\n_tier',sw_shownormal);

資料庫程式設計 用access建立資料庫class,內含class、teacher及publisher三個表格 目的:在form1上的DbEdit1如何連到class資料庫下的class表格的class_name欄位 1.access資料庫-->BDE-->table-->datasource -->DBEdit 2.於BDE中建立資料庫別名:class1 3.建立 Table1-->database name--> class1 table name-->class active-->true datasource1-->dataset-->table1 DBedit1-->datasource--> datasource1 datafield-->class_name 利用table1的fields editor來加入其它欄位的元件 加入DBNavigator來瀏覽 用ODBC的連結資料庫,建立一個class_odbc table的屬性 Active:是否為開始狀態 DatabaseName TableName IndexName:索引名稱 IndexFieldNames:索引欄位 BOF:資料指標指在第一筆 EOF:資料指標指在最後一筆 RecordCount:資料筆數 RecordSize:每筆資料的大小 FieldCount:欄位數 Fields、FiledValues:欄位值 label1.caption:=tabel1.fileds.fileds[第幾個]; label1.caption:=tabel1.filedvalues[欄位名稱]; 於button1的click事件中輸入 with Table1 do begin Str:='這個資料表格共有 '+IntToStr(RecordCount)+' 筆'+#10#13; Str:=Str+'每筆資料的大小為: '+IntToStr(RecordSize)+' bytes'+#10#13; Str:=Str+'每筆資料共有 '+IntToStr(FieldCount)+' 個欄位'+#10#13; Str:=Str+'這些欄位名稱如下:'+#10#13; for I := 0 to FieldCount - 1 do Str:=Str+' '+Fields[I].FieldName+#13#10; end; ShowMessage(Str); displayformat 屬性(只有datetime及數值欄位可以設定) (reference on_line help) CustomConstraint屬性:欄位限制(如 X>1000) ConstraintErrorMessage屬性:違反限制時的訊息 計算式欄位:建立一個課程收入total的欄位 於table1的fields editor按右鍵選 new field 於name中輸入“ total “,type中選integer 於Table1的oncaculate中輸入 table1total.value:=table1class_cost.value * table1student_num.value;

使用ADO連接資料庫 此種連接方式不必透過BDE, 所以client端不必安裝BDE,但要安裝ADO 2.1或更新板本

製作Navigator (table 的操作方法) open、close next:下一筆 prior :上一筆 last :最後一筆 First :第一筆 append:新增一筆空白記錄至檔尾 Insert:在指標位置新增一筆空白記錄 (若欄位有 not null的限制、可於OnNewRecord 事件中給予始初值) Edit:設定為修改狀態,此狀態下所修改的資料尚未寫入資料庫,需用Post的方法寫入,或用Cancel方法取消修改 delete:刪除指標位置上的那一筆記錄 fieldbyname:取得欄位資料,如 label1.caption:=tabel1.fieldbyname(‘class_id’).value 或 label1.caption:=table1class_id.value ClearfFields:將目前指標位置所指的記錄清為空白 IsEmpty:判斷記錄是否為空白。 Refresh:重新取得Table的記錄。 下一筆: if not table1.Eof then table1.Next; 上一筆: if not table1.bof then table1.prior; 欄位資料的驗證 於class_date 的dbedit3的onsettext事件中加入 try strtodate(Dbedit3.text); except showmessage(‘worng data format’); end; 新增一筆: 1.於table1的OnNewRecord中加入 with table1 do begin fieldbyname(‘class_id’).value:=‘999’; fieldbyname(‘teacher_id’).value:=‘1’; fieldbyname(‘publisher_id’).value:=‘1’; 2.於新增的button中加入 append; 3.於確定的button中加入 beign fieldbyname(‘class_id’).value:=Dbedit1.text; fieldbyname(‘class_name’).value:= Dbedit2.text; fieldbyname(‘class_date’).value:= strtodate(Dbedit3.text); fieldbyname(‘class_cost’).value:= strtoint(Dbedit4.text); ……(自行加入其它欄位) post; 4.於取消的button中加入 table1.cancel; 5.於刪除的button中加入 if application.messagebox(‘確定要刪除嗎?’, ‘確認’, MB_YESNO+MB_defbutton2+ MB_iconinformation+MB_systemModal) =IDYes then table1.delete else

DbGrid Title.caption、Title.color、 Title.font、 Title.Alignment 選擇顯示的欄位:於column editor中add、delete picklist 屬性:以combobox方式讓使用者輸入資料 buttonstyle屬性:每個欄位都有此屬性,當設定它為ellipse時,可出現一個小按鈕。 此按鈕的click事件即為dbgrid的OnEditButtonClick 事件。 table1.Edit; dbgrid1.Columns[1].Field.asstring:= inputbox('text','text','default'); table1.Post;

資料庫查詢方式一:Locate (單筆) [loCaseInsensitive]:不分大小寫搜尋 [loPartialKey]:部分搜尋 找到的話會將記錄指標移到找到的記錄上。 table1.locate(‘class_id’,’1’, [loCaseInsensitive]);

資料庫查詢方式二:lookup (單筆多欄) 會傳回一個Varaint 型態的資料。 找到的話不會將記錄指標移到找到的記錄上。 搜查單一欄位 Find_result:=table1.lookup(‘class_id’,’1’, ‘class_name;class_cost;class_date’); 搜查多個欄位 Find_result := table1.lookup(‘class_id ; class_cost’, VarArrayOf([‘1’,’3000’]) , ‘class_id;class_cost;class_date’); if not VarIsNull(find_result) then begin str:=‘找到的資料如下’+#10#13; str:=str+VarToStr(find_result[0])+#10#13; str:=str+VarToStr(find_result[1])+#10#13; str:=str+VarToStr(find_result[2])+#10#13; showmessage(str); 將上述的結果顯示在一個meno上

資料庫查詢方式三:Setkey,GotoKey 、GotoNearest (單筆資料) 需設一個索引欄位,此欄位須再資料庫中有定義為索引欄位,查詢速度較快。 with table1 do begin indexfieldnames:='class_id'; setkey; fieldbyname('class_id').value:='3'; gotokey; end;

資料庫查詢方式四:FindKey(單筆資料) 與gotokey 類似,但可用於複合索引 ( composite index)上,查詢速度亦快。 於button1的click事件輸入 if not table1.findkey([‘2’,’excel’]) then showmessage(‘not find!’) ;

資料庫查詢方式五:(多筆資料) filter、filtered屬性:於filter中輸入過濾條件,再將filtered屬性設為True。 於 filter中輸入 class_cost >5000 ,filtered設為True OnFilterRecord事件:處理教複雜的過濾條件 (OnFilterRecord的執行效率並不好,建議非不得已不要使用)

TQuery(用SQL 語法來查詢) Query1.open, Query1.Close; Query1.Clear:將Query 元件內的sql 敘述清除 Query1.Sql.Add: Query1.Prepare:將Sql敘述先做語法分析、最佳化處理及使用權限判定等。 於formcreate 時將table1所有欄位加入combobox1中 於button1的Click事件中加入 query1.close; query1.sql.clear; query1.sql.add(‘select ‘+combobox1.text+ ‘ from class'); query1.prepare; query1.open; 參數傳遞:於button1的click中加入 with query1 do begin sql.clear; aql.add(‘select * from class where class_cost between :v1 and :v2’); //定義參數 params[0].datatype:=fsinteger; params[0].paramsType:=ptinput; params[0].value:=StrToInt(edit1.text); params[1].datatype:=fsinteger; params[1].paramsType:=ptinput; params[1].value:=StrToInt(edit2.text); prepare open; end; 要修改query出來的資料,需將Query的requestlive的屬性設成True。

DBGroupRadio 製作一個DBGroupradio來修改teacher_id 的資料。 新增一個DBGroupradio 並設定其連上class表格的teacher_id,在其items屬性中加入1,2,3。

DBCheckBox valueChecked:被Checked時的值 valueUnChecked:UnChecked時的值 新增一個DBCheckBox 並設定其連上teacher表格的sex欄位,在其ValueChecked屬性中填入“ 男”,在其valueUnChecked屬性中填入“女”。

製作一個用Combobox1來查詢資料 於formcreate 中加入 table1.open; with table1 do for i:=0 to recordcount-1 do begin combobox1.items.add(fieldbyname('class_name').value); next; end; table1.first; 於Combobox1 的change 事件中加入table1.locate('class_name',combobox1.Items[combobox1.itemindex], [loCaseInsensitive] ); 練習將上例改為用 listbox來查詢。

DBCombobox 可用來顯示table中某一欄位的記錄,並可藉此修改資料。 製作一個可由DBCombobox來修改資料庫 將DBCombobox1連上class table的teacher_id 練習將上例改為dbCombobox? (會發生問題)

DblookupListbox 用來顯示外來鍵所關聯的表格資料。如在class表格中,若要輸入老師編號時,可用DblookupListbox來顯示老師名稱,由使用者點選老師名稱後,會自動填入老師編的值,使用者不需記住每個老師的編號 建立table1、table2,datasource1、datasource2及在table1的field editor中加入所有欄位,加入一個DBNagivator及DBlookupListbox table1連上 class表格、table2連上teacher表格, 設定DBlookupListbox的屬性如下 listsource--->datasource2 listfield--->teacher_name key field--->teacher_id datasource --->datasource1 data field ---> teacher_id 練習:利用DBlookupcombobox1來做。

sql 語法(sql server) (用unc表示法連結遠端資料庫)

master/detail form 設定兩個表格之間的1對多的關係 建立table1、table2,datasource1、datasource2、DBNavigator及Pagecontrol1,並在Pagecontrol上加入兩頁 在table1的field editor中加入所有欄位於第一頁 在table2的field editor中加入所有欄位於第二頁 設定table2的Master source為 source1 設定table2的Master field為 teacher_id <-->teacher_id

一個程式同時在不同地方執行 開發完成的程式若要到其他地方執行,除了將程式複製到Client 端之外,還需安裝BDE及建立BDE上的別名。 如何取得最新的資料:refresh; 在 navigator上的click 事件中加入 if button=nbpost then table1.refresh; //若按下確定鈕就更新資料 利用ODBC 連接資料庫的AP,每個Client端需有ODBC的dsn

DataBase(一) table1--->Database--->BDE 別名 Aliasname:設定與BDE連結的資料庫名稱 DatabaseName:與Ttable或Tquery連接的名稱 Name:元件名稱 LoginPrompt:設定執行應用程式前是否要出現密碼登錄的視窗

Database(二) StarTransaction:開始進入transaction狀態 InTransaction:是否在transaction狀態 Commit:結束transaction狀態 Rollback:回復成Transaction之前的狀態 Transaction屬性:tiDirtyRead、tiReadCommit 分別製作五個按鈕StartTransaction、Commit、Rollback,open ,close撰寫程式如下 procedure Tform1.btnStartTransactionclick(sender:Tobject) begin if database1.InTransaction then exit database1.StartTransaction; label1.caption:=‘IN …..’; end; procedure Tform1.btnCommitclick(sender:Tobject) if not database1.InTransaction then exit database1.Commit; label1.caption:=‘Off …..’; procedure Tform1.btnRollbackclick(sender:Tobject) database1.Rollback; 分別設定Transaction屬性為dirtyRead及ReadCommitted,試試看當一支程式進入Transaction時,另一支程式是否可以修改資料 試試看是否可以Rollback

DataModule 若有十個form,每個form都用到同一個Table,可用DataModule來統一建立一個Table,就不必於十個Form中都加入Table,將來若有修改,只要在DataModule中修改即可,不必於每個form中修改。 於file-->new-->DataModule 新增一個資料模組 於DataModule1中加入database1、table1及datasource1並設定其連結到D_class資料庫 新增一個Navigator1、DBGrid1,於Datasource屬性中填入DataModule1.datasource1

動態連結資料庫(自動抓取BDE的別名) 建立tablel1、datasource1、combobox1、combobox2、DBGrid1及DBnavigator1 設定DBGrid1及DBnavigator1的datasource為datasource1、 datasource1的dataset為table1 於form1的create事件中加入 //抓取BDE的資料庫別名給combobox1 session.getdatabasenames(combobox1.items); 於combobox1的onchange事件中加入 table1.active:=false; session.GetTableNames(combobox1.text,'',false,true,combo box2.items); table1.databasename:=combobox1.text; 於combobox2的onchange事件中加入 table1.active:=false; table1.tablename:=combobox2.text; table1.active:=true;

TreeView procedure TForm1.Button2Click(Sender: TObject); begin Treeview1.items.AddChildFirst(treeview1.TopItem,'root'); end; procedure TForm1.Button3Click(Sender: TObject); treeview1.Selected.Delete ; with adoquery1 do //未指定上課講師的課程 first; while not eof do treeview1.Items.AddChild(treeview1.items[1],fieldbyname('class_name').value); next;

報表製作 TQuickRep:共含頁首頁尾、表頭表尾、欄位標題、資料內容六個bend,可於bends的屬性中設定是否出現。 相關內容可快點兩下後於report settings 中設定 TQRSysData:系統的資訊元件,如系統時間、頁數等,可於其Data屬性中查到 TQRDBText:顯示資料庫資料的元件,可於DataSet、DataFeild中設定 分組小計的功能:製作一個列出每個老師上課時數的報表 新增一個Query1,於sql屬性中加入“select class.* ,teacher_name from class,teacher where class.teacher_id=teacher.teacher_id order by class.teacher_id”,再選query後按右鍵,選fields eidtor,再按右鍵,加入所有欄位。 新增一個Quickrep1,設定DataSet屬性為query1,於DetailBand1中加入QRDBtext1、 QRDBtext2、 QRDBtext3,分別設定其Dataset屬性為query1,其DataField屬性為class_name,class_data, class_hour‧ 加入一個QRGroup1,設定其expression為query1.teacher_id,再設定footerband為SummaryBand1 於QRGroup1中中加入一個QRExpr1,設定設定其expression為sum(query1.teacher_name),設定ReprintOnNewPage為True 於SummaryBand1中加入QRExpr2,QRExpr3,設定設定其expression分別為sum(query1.class_hour)、count,再設定其ResetAfterPrint為True 按preview執行看看是否成功。

統計圖表TChart 做一個所有老師上課時數的統計圖表 新增一個chart1,並於Chart1上新增一個series,將series的Title改為上課時數。 新增一個Query1,並於sql 屬性中加入 select teacher_name,sum(class_hour) as sum_hour,sum(student_num) as sum_student from class,teacher where class.teacher_id=teacher.teacher_id group by teacher_name order by sum(class_hour) 於formCreate中加入 chart1.title.text.strings[0]:='title'; chart1.leftaxis.title.caption:='class_hour'; chart1.bottomaxis.title.caption:='teacher_name'; query1.open; for i:=1 to 3 do begin series1.add(query1.FieldByName('sum_hour').value, query1.FieldByName('teacher_name').value,clred); query1.next; end; query1.close;

統計圖表TDBChart 同上例,將Tchart改成TDBChart,於TDBChart1上新增一個Series1,選擇piechart 設定Series1的Dataset為Query1 新增一個RadioGroup1,並於Items的屬性中加入“上課總時數”及“上課總人數 於RadioGroup1的Click事件中加入 Series1.xlabelsSource:=query1.fields[0].fieldname; Series1.yvalues.valuesource:=query1.fields[radiogroup1.itemindex+1].fieldname;

install shield

Datasset 的Cache Update 功能 當dataset active時,並沒有與後端的資料庫做即時的更新,等整批的資料異動完成時,再做一次整批的異動,以減少網路的傳輸。 呼叫ApplyUpdates 即可真正的將Cache的資料更新至資料庫 製作一個table1、datasource1、navigator1、dbgrid1,並將table1的cachedUpdated設為true,及連上class資料庫 同時執行兩支此應用程式,觀查當同時異動某一記錄值時會有什麼問題 可於table1的OnUpdateError事件中解決此問題,將UpdateAction的值設定如下 uafail:讓應用程式執行失敗,停止Cached update的動作,並產生一個例外 uaabort:讓應用程式執行失敗,停止Cached update的動作 uaretry:再試一次更新 可利用參數Dataset的Tfield的知新舊資料 dataset.fields[1].oldvalue:未異動的舊資料 dataset.fields[1].value:異動的資料 dataset.fields[1].newvalue:指定新的資料