第一篇:delphi 日常語法總結
Delphi總結
目錄
Delphi總結.......................................................................................................................................1
1:控件只能輸入數字................................................................................................................1 2:下拉框賦值............................................................................................................................1 3:初始化Cell.............................................................................................................................2 4:注冊Cell.................................................................................................................................2 5:華表居中 華表增加,刪除某一行......................................................................................2 6:設置增刪改查按鈕狀態........................................................................................................2 7:主鍵獲取方法........................................................................................................................3 8:獲取多條,返回容器............................................................................................................3 9:保存
修改
刪除
方法....................................................................................................4 10:遍歷下拉框的值..................................................................................................................5 11: TDBGridEh增加,修改后定位到某個..............................................................................5 12::json封裝,解析.................................................................................................................5 12:導出Excel文件(TsaveDialog控件).....................................................................................7 13:判斷奇偶數分別插入不同位置..........................................................................................7
14:從一個目錄復制文件到另一個目錄,刪除文件......................................................8
15:從下拉框多個值獲取ID.....................................................................................................8
16:Delphi 格式化日期.....................................................................................................8 17:華表某一列求和..........................................................................................................8
1:控件只能輸入數字
if not(key in ['0'..'9', #8])then key := #0;2:下拉框賦值
procedure TSickDistrtionsFrm.SetDoct();var
obj: TDoctInfoClass;
DoctInfo: THis_DoctInfo;
idx: Integer;begin
inherited;
obj := TDoctInfoClass.Create;
obj.GetAllDoctDB();
for idx := 0 to obj.iteminfo.Count1, cl1.Rows1, cl1.Rows1 do
begin
DoctInfo := THis_DoctInfo(cbbzgys.Items.Objects[idx]);
if DoctInfo.sDoct_ID + '.' + DoctInfo.sDoct_Name = BedDistrtion.sDirectorDoct then
begin
cbbzgys.ItemIndex := idx;
end;
end;11: TDBGridEh增加,修改后定位到某個
adors.Locate('sMlbm', CatalogueInfo.sMlbm, [loCaseInsensitive]);
12::json封裝,解析
Var
jo, jo1, jt, jfields: ISuperObject;//封裝明細
jo := SO();jt := SA([]);for idw := 0 to TJXMBInfo.iteminfo.Count1 do
begin
TJXMBInfo := TB_TJXMBInfo.Create;
TJXMBInfo.sbz := tt.O[i].s['sbz'];
TJXMBInfo.sxmmc := tt.O[i].S['mc'];
TJXMBInfo.sxmbh := tt.O[i].S['bh'];
TJXMBInfo.sKebh := tt.O[i].S['sKebh'];//
TJXMBInfo.sxmmx:= tt.O[i].S['sxmmx'];
TJXMBInfo.nxmjg := tt.O[i].d['XMJG'];
iteminfo.Add(TJXMBInfo);
end;
end
else
begin
TJXMBInfo := TB_TJXMBInfo.Create;
TJXMBInfo.sbz := jo.O['list'].s['sbz'];
TJXMBInfo.sxmmc := jo.O['list'].S['mc'];
TJXMBInfo.sxmbh := jo.O['list'].S['bh'];//
TJXMBInfo.sxmmx := jo.O['list'].S['sxmmx'];
TJXMBInfo.sKebh := jo.O['list'].S['sKebh'];
TJXMBInfo.nxmjg := jo.O['list'].d['XMJG'];
iteminfo.Add(TJXMBInfo);
end;
end;end;12:導出Excel文件(TsaveDialog控件)
{導出Excel }
if SaveDialog1.Execute then
begin
{命令執行}
{獲取文件名}
Cell1.DoExportExcelFile(SaveDialog1.FileName);
end;13:判斷奇偶數分別插入不同位置
for idx := 0 to PhyData.iteminfo.Count-1 do
begin
TJXMBjson := TB_TJXMBInfo(PhyData.iteminfo.Items[idx]);
if idx mod 2 = 0 then
//偶數
begin
row1 := row1 + 1;
cl1.DoSetCellData(0, row1, '□' + TJXMBjson.sxmmc);
cl1.DoSetCellTextStyle(0, row1, 1);
cl1.DoSetRowHeight(row1, cl1.DoGetRowBestHeight(row1)+ 15);
end
else if idx mod 2 = 1 then
//奇數
判斷列增加
begin
cl1.DoSetCellData(2, row1, '□' + TJXMBjson.sxmmc);
cl1.DoSetCellTextStyle(2, row1, 1);
cl1.DoSetRowHeight(row1, cl1.DoGetRowBestHeight(row1)+ 15);
end;
for idxC := 0 to 4 do
begin
cl1.DoSetCellAlignment(idxC, row1, 32);//居中顯示
end;
end;,14:從一個目錄復制文件到另一個目錄,刪除文件
CopyFile(PChar('D:A***920001X.xml'), PChar('D:B***920001X.xml'), false);
DeleteFile('D:B***920001X.xml');
15:從下拉框多個值獲取ID aInfo.sOpid :=THis_UserInfo(cbbczy.Items.Objects[cbbczy.ItemIndex]).sUser_ID;
16:Delphi 格式化日期
formatdatetime('yyyy-mm-dd',now);17:華表某一列求和
cl1.DoSetFormula(1, fpirow, 'sum(B' + IntToStr(3)+ ':B' + IntToStr(fpirow)+ ')');
第二篇:delphi復習資料
題型:
填空題20×1 簡答題5×6 程序填空題11×2 編程題2×14 資料整理的不是完全完整,結合這些重點可以在書上再仔細復習。希望好好復習,大家都能通過!
第一章Delphi簡介
1.1delphi概念 Delphi的主要特點: Borland公司的Pascal編譯器 Delphi以object Pascal為編程語言 Delphi充分發揮了windows的強大功能 Delphi提供了豐富的32位可視組件庫
Delphi在數據庫和網絡處理功能方面是同類產品中最強的
1.2delphi7集成開發環境
主窗口:包括菜單欄,工具欄及組件欄; 對象游覽器:包括屬性頁和事件頁; 對象樹性列表; 窗體設計器; 代碼編輯器;
1.3delphi程序的基本結構
擴展名為dpr的是項目文件;擴展名為pas的單元文件;擴展名為dfm的是窗體文件
單元文件的格式如下:
單元頭:該單元指定單元的名稱
接口部分:該部分從保留字interfact開始,到保留字implementation之前結束。接口部分可以有uses語句,還可以用來聲明常量,數據類型,變量,過程和函數等。其中uses語句必須緊跟在保留字interfact之后。在整個程序中都可以被訪問
實現部分:這些聲明可以在本單元中被訪問,不可以在其他單元中被訪問,類的方法必須在實現部分實現
初始化部分:從保留字implementation開始,到保留字finalization之前結束。一個單元中可以沒有該部分。
結束部分:一個單元中只有出現了初始化部分,才可以有結束部分
第二章Object Pascal語言基礎 2.1詞法符號 保留字
標識符:1標識符由字母,數字或下劃線組成 2標示符的第一個字符必須是字母或下劃線 3標識符的長度不應超過255個字符 4不能將保留字用作標識符 5標識符不區分大,小寫
標準標識符是可以重新定義的,而保留字卻不允許重新定義
因system單元是自動應用的,不必也不允許在引用部分列出system單元 Absolute指令字用于指示相同類型的另一標識符存放在同一段內存區域中 2.2常量和變量
布爾常量是指false和true這兩個值 用#引導一個整數,整數表示該字符的ASCII碼 用‘’‘’表示單引號字符 2.3簡單數據類型
數據類型分為簡單數據類型,字符串類型,結構類型,指針類型,過程與函數類型和可變類型等是一種常見的分類方法
有序數據類型特點:
1、數據的分布是離散的;
2、除了第一個元素外,其他任何元素都有一個前驅元素;
3、除了最后一個元素外,其他任何元素都有一個后繼元素
關系運算符號:=,<>,>≡,>,<≡,< 整型數的邏輯運算符:not,and,or,xor 左,右移位運算符:shl,shr 基本字型有ansichar和widechar Pascal語言提供的自變量為實型的標準函數由: 1絕對值函數abs(x):函數值為x的絕對值 2平方函數sqr(x):函數值為x的平方
3正弦函數sin(X):函數值為x的正弦,其中x的單位為弧度 4余弦函數cos(x):函數值為x的余弦,其中x的單位為弧度 5反正切函數arctan(x):函數值為x的正反切,函數值的單位為弧度 6指數函數exp(x):函數值為指數e 的x次方 7對數函數in(x):函數值為x的自然對數 8平方根函數sqrt(x):函數值為x的平方根
9舍入函數round(x):對實數x作四舍五入,結果為整數 10截尾取整函數trunc(x):截去實數x的小數部分,結果為整數 object pascal提供了豐富的日期時間處理函數,常用的有: 1date0:函數返回系統當前日期,無參數,返回數據是tdate time型 2time0:函數返回系統當前時間,無參數,返回數據是tdate time型 3now0:函數返回系統當前日期和時間,無參數,返回數據是tdate time型 4strtodte(日期字符串):字符串轉換為日期時間函數,返回數據是tdate time型
2.4結構類型 結構數據: —集合類型(set)—數組類型(arry)—記錄類型(record)—文件類型(file)—類類型(class)
—類引用類型(class reference)—接口類型(interfact)
object pascal中規定了基類型只能是不超過265個有序值的集合,集合元素的敘數值必須介于0~~255之間
集合運算有交(*),并(+),差(—),運算對象是兩個相同類型的集合,運算結果也是集合。例如,若有為[1,3,5],y為[3,4,5],則x*y為[3,5],x+y為[1,3,4,5],x-y為[1] 數組的定義:Type arry [indextype。。,indextypen] of basetype ①對于通用字符串類型string,指定其最大長度(0------255)。此時string型被視為shortstring型
②shortstring型不是以null(空字符#0)作為字符串的結果標志,而是將長度保存在字符串數組下標為0的儲存單元中 ③ansistring以full結束
記錄的定義: Type 記錄類型標識符=record 域1:類型1 域2:類型2。。。。域n:類型n 2.6語句流程 語法形式: 輸入語言
Read([文件變量]變量列表)
Readln([文本文件變量]變量列表)有回車 省略文本變量參數表示從鍵盤輸入中讀取數據 輸出語言
Write([文件變量]輸出項表)
Writeln([文本文件變量]輸出項表)有回車
注釋和編譯指令 //單行注釋內容 {注釋內容}(*注釋內容*)
Case語句的語法格式: Case選擇表達式of 常量1:語句1 常量2:語句2。。。。
常量n-1:語句n-1 [else語句n;] End;
保留字case后的選擇表達式,其值必須是有序類型,如整型,字符型,布爾型,枚舉型或子界型 P45頁程序
While語句的執行過程是:先計算布爾表達式的值,當值為true時,執行循環體中的語句序列,然后重新計算布爾表達式的值,若仍為true則再執行一遍循環體
While語句的特點是先判斷條件,當條件為true才執行。當第一次條件為false時,循環次數為0
Repeat語句的執行過程是:先執行repeat到until之間的語句,然后計算布爾表達式的值,若為false,則再執行repeat到until之間的語句,若為true則推出循環體
Break過程,可使程序的執行流程立即退出該層循環 Continue過程將使程序直接轉入下一次循環 2.7過程與函數
Procedure過程名(參數表)
Function函數名(參數表):返回數據類型 過程由過程首部、局部聲明部分和過程體組成。函數由函數首部、局部聲明部分和函數體組成。
參數的傳遞如下:
1值參數聲明時,形參前面無任何修飾
2變量參數聲明時 變參傳遞的是一個變量的地址,即實參把地址傳遞的是一個變量的地址,即實參把地址傳遞給變參,變參和實參指向的是同一地址空間。在過程和函數中對變參的修改直接影響實參 3常量參數聲明時,形參的前面用保留字const修飾
過程和函數重裁是指定義多個名稱相同,而參數列表不同的過程和函數。編譯器根據調用時實參表中的參數個數和類型,自動匹配一個重裁的過程或函數。重裁過程或函數使用默認參數可能會導致二義性錯誤 2.8程序與單元的結構 單元結構: 1單元首部
2接口部分:定義的這些標識符可以被引用該單元的程序訪問 3實現部分:在實現部分定義的標志符不能被其他單位或程序訪問 4初始部分 5終結部分
2.9標識符的作用域
標識符的作用域是指其在程序中起作用的范圍。
單元中接口部分定義的標識符包括數據類型,類,常數,變量,過程和函數導等 他們在引用該單元的程序(項目文件,其他單元)中都可以被訪問
第三章 Delphi中的面向對象 3.1面向對象程序設計概述
將具有相同屬性和行為的對象抽象為類,每個對象都屬于某個類。通過繼承關系構成類的層次結構,子類可以直接繼承父類的性質和功能。3.2類與對象
類是具有相同或相似屬性和行為的一組對象的共同描述,是對相似對象建立的模板。
對象由屬性和方法構成。屬性是描述對象靜態特征的一組數據想:方法描述了該類對象動態特征的一個操作序列,體現對象的行為特征或功能。定義類:type 類名=class 數據成員
成員函數或過程 End;
注意:在函數或過程名前必須帶有類名。Procedure Circle.Draw; 聲明對象一般形式為:var 對象名:類名; 訪問對象成員:對象名.成員
構造函數和析構函數的定義,作用和特點:
構造函數是專用的創建對象和初始化對象的成員函數。定義時用保留字constructor,函數名通常為create。在定義的構造函數中,不僅可以為類對象分配內存空間,而且可以打開文件或數據庫讀取數據或控制設備復位。析構函數是專用的刪除對象和為對象進行善后處理的成員函數。定義時用保留字destructor,函數名通常為Destroy。在析構函數中,不僅可以釋放相應的內存資源,還可以保存數據信息,關閉文件或者數據庫,控制設備復位并關機。3.3類成員的訪問權限
封裝是把一組數據和與這組數據有關的操作集合組裝在一起,形成一個能動的實體,也就是對象。
訪問權限分為:private:私有數據成員、成員函數、過程。不能被類所在單元以外的程序訪問,但本單元是可見的。
Protected:保護??。被該類及該類的所有派生類訪問,并成為派生類的私有成員。
Public:共有??。被該類以外的類訪問。
Published:公布??。在設計期間的對象觀察器窗口中可見。
Automated:自動??。用于響應對象鏈接與嵌入自動化類型信息的公共接口。3.4繼承
繼承的實質是在既有類的基礎上構造新的類,即新類從一個或者多個已有類中繼承數據和方法,同時增加或重新定義數據和方法,由此構造出一個新的類型,稱為派生類。已有的類稱為基類。繼承的主要目的是實現代碼的重用。派生類的定義:type 派生類=class(基類){派生類新增或改寫部分} End;
派生類的構造和析構函數:在派生類構造函數的開始部分,使用inherited保留字來調用基類的構造函數,首先初始化基類的成員,然后構造派生類的特有成員。在派生類的析構函數的結尾部分,使用inherited保留字來調用基類的析構函數,最后釋放基類的成員部分。
構造函數越上層越早被調用,析構函數越下層越早被調用。3.5多態性
多態性是指同一的操作,在不同的對象中具體實現過程不同。Object Pascal 支持兩種多態性和運行時的多態性。編譯時的多態性通過重載來實現,運行時的多態性用虛方法來實現。
重載函數或者過程用保留字overload來說明。例如:Function max(x:integer):integer;integer; 虛方法的定義如p79 虛方法與動態方法的區別:在運行時才能確定對象方法的調用地址,這種調用方法為動態聯編。虛方法與動態方法在功能上是等價的,不同在于虛方法額調用速度比較快,動態方法的代碼比較少。
抽象類與抽象方法:使用指令字abstract說明,則該方法稱為抽象方法,包含抽象方法的類稱為抽象類。定義:procedure 過程名;virtual;abstract;
第四章
4.1 VCL基礎
四種基本的組件類型:標準組件,自定義組件,圖形組件,非可視組件。圖形組件與標準組件的的區別在于:①標準組件可以獲得輸入焦點,即可用Tab鍵依次獲得焦點;圖形組件不能獲得輸入焦點。②標準組件可以包含其他組件,即可以是其他組件的父類;圖形組件不能包含其他組件。③標準組件具有一個WINDOWS句柄,圖形組件沒有WINDOWS句柄。
4.2窗體設計
窗體組件的屬性值設置為 組件名.屬性:=屬性值。重點看一下caption、visible、hint。
窗體的方法和事件詳見P91.4.3常用VCL組件
對于memo組件的編程填空要注意。列表框組件(listbox)的常用屬性見P104 4.4菜單設計
對菜單項可以指定其加速鍵,方法是在菜單項的Caption屬性中,在要作為加速鍵的字母前添加符號“&”,則運行時該字母帶有下劃線,按下Alt+加速字母鍵就執行此菜單項。
4.6對話框的使用
Showmessage過程:調用Showmessage過程會彈出一個簡單的對話框,對話框上顯示提示信息及“確定”按鈕,單擊該按鈕,就關閉對話框。
Inputbox函數:調用Inputbox函數顯示一個能夠接受喲娜防護輸入數據的對話框,并返回用戶輸入的數據值。
Inputquery函數:與Inputbox函數最大的不同是他的返回值是一個邏輯值。
第五章 5.1程序調試
錯誤的種類及處理方式:
1、語法錯誤:沒有遵守語言的語法規則而產生。
2、運行錯誤:程序在執行過程中發生了錯誤。程序試圖打開一個不存在的文件或試圖修改一個只讀文件,程序運行過程中出現除零錯誤或用戶輸入了非法數據等。
3、邏輯錯誤:運行的結果與設想的結果不同。
解決邏輯錯誤可以從三步驟來解決:猜測出程序可能出錯的地方,并在此設置斷點。讓程序執行到斷點停止運行,觀察所有中間變量及對象內容。讓程序單步運行,同時觀察每一個變量及對象內容的變化。
事件變量和相關數據的值:提示文本,watch list窗口,evaluate 窗口。5.2異常保護和處理
1、異常保護與try?finally?end;語句 Try ? //被保護的代碼塊 Finally ? //處理語句 End;
2、響應異常和try?except?end;語句 Try //以下為保護代碼塊 ?
If <異常條件> raise<異常對象> Except //以下為異常處理快
On <異常類1> do <處理過程1或語句1> On <異常類2> do <處理過程2或語句2> On ?
Else <其他處理過程或語句> End;
通過繼承類exception可以自定義新的異常類。
第6章 Delphi7與數據庫
6.1數據庫簡介 數據庫可以長期存儲、有組織、可共享的數據集合。
數據庫系統(database system,DBS)是指具有數據管理功能的計算機系統。它一般由數據庫、數據庫管理系統和應用系統構成。
數據庫系統根據的組織方式主要分為層次數據庫系統、網狀數據庫系統、關系型數據庫系統很面向對象數據庫系統等幾類
Delphi支持關系型數據庫,關系型數據庫由表組成。標的定義了事物的一組屬性數據,稱為記錄。表的列定義了事物的某種屬性,稱為字段。6.2 Delphi7的數據庫訪問機制
Borland推出了一個數據庫引擎(borland database engine,BDE)BDE管理器(BDE Administrator)是設置和管理BDE的工具,它可以用來管理BDE中的數據庫別名和驅動器。Datebase Desktop的使用:
1、定義數據庫別名
2、設置工作目錄及私有目錄
3、建立數據表結構
4、保存數據表文件
5、建立索引(1)建立主索引(2)建立次索引
6、設置有效性檢查
7、設置口令
8、設置參照完整性
9、輸入部分數據
數據庫游覽器可用于定義數據庫別名、查詢或編輯數據庫中的各類信息,如數據庫的參數設置、各類據表文件的結構及數據,也可以使用SQL語句進行查詢 6.3數據庫組件
使用TTable組件連接并顯示數據表的一般步驟
1、把一個TTable組件放到窗體上
2、TableName屬性指定要訪問的表
3、TDataSource組件放到窗體上,設置DataSet屬性指向該TTable組件
4、把數據控制組放到窗體上,設置TDataSource屬性指向該TDataSource組件
5、把TTable組件的Active屬性設為True Tablel.Fields[0].AsString:=Editl Edit.Text Editl.Text= Tablel Fields [0].AsString Editl.Text:= Tablel.FieldByName(‘Name’).AsString 當表結構改變引起字段索引號改變時,就要修改相應的程序,所以使用第二種方法比較好。
DataSet屬性:表明于當 前數據源組件相聯系的數據集組件對象的名字
Enabled屬性:如果Enabled屬性值為True(默認值),數據控制組件將顯示數據:如果Enabled屬性值為False,則所有與此數據源組件相連的數據控制組件都將不顯示任何數據。
Columna屬性用于指定TDBGrid對象中各欄目的特征 6.4 TField對象的使用
動態字段對象與永久字段對象的概念,區別,使用場合:Delphi會為數據中的每一個字段自動生成一個動態的字段對象。數據集的結構和其他信息改變,當應用程序重新打開這個數據集時,就會基于最近的結構和信息重建所有的字段對象。當數據集關閉時,這些對象也跟著取消。
動態對象的最大特點是適應性強,缺點是要想改變字段的顯示屬性、數據格式就要編寫代碼,不能把某些字段暫時隱去,也不能增加新的字段。
永久字段最大的好處是可以在設計時設置它的屬性。可以選擇部分字段,增加新的字段。再永久字段對象列表中刪除某些需要保護的字段,避免用戶訪問這些字段;在數據庫查詢或特定數據表的字段基礎上定義新的字段,代替現存的字段;改變原有的字段的顯示和編輯屬性。6.5 數據集的操作 數據集的打開與關閉:
1、設置Active屬性 Table.Active:=True;//打開數據集,數據集組件對數據表進行讀寫操作。Table.Active:=False;//關閉數據集,數據集組件不能對數據表進行讀寫操作。
2、調用Open和Close方法 Table1.Opene//打開數據集和 Table1.Close//關閉數據集。移動記錄指針:
1、Bof屬性:如果Bof為True,表明當前記錄指針所處的位置為數據集的第一條記錄;反之,則不是第一條記錄。
2、Eof屬性:如果Eof為True,表明當前記錄指針所處的位置為數據集的最后一天記錄;反之,則不為最后一條記錄。
3、First方法:將記錄指針移至數據集的第一條記錄處,并使之成為當前記錄,同時將Bof屬性值設置為True。
4、Last方法:將記錄指針移至數據集最后一條記錄處,并使之成為當前記錄,同時將Bof屬性設置為True。
5、Next方法:將記錄指針后移一條記錄,并使之成為當前記錄。如果記錄指針指向了數據集的最后一條記錄,將Eof屬性設置為True。
6、Prior方法:將記錄指針前移一條記錄,并使之成為當前記錄。如果記錄指針指向了數據集的第一條記錄,將Bof屬性設置為True。
7、MoveBy方法:將記錄指針從當前記錄開始向后或向前移動若干條記錄。格式如下:function MoveBy(Distance:Integer):Integer;
限制記錄集:
1、SetRangeStart方法和SetRangeEnd方法可以過濾記錄。SetRangeStart方法用來限制記錄集的開始,SetRangeEnd方法用來限制記錄集的結束,調用ApplyRange方法使限制生效,調用CancelRange方法取消為數據表設定的限制范圍。
2、使用數據集的Filter屬性
Filter屬性值是一個用來指明數據表過濾標準的字符串,Filter屬性決定了過濾器是否起作用。
查找記錄:
1、使用FindKey方法。使用Table的FindKey方法或FindNearest方法。
2、搜索特定記錄(Locate)。FindKey或FindNearest方法只能在TTable組件中使用,如果使用的是TQuery或TStoreProc組件,就要使用Locate方法來查找記錄。Locate函數適合于所有數據集組件,也適合于TTable組件。AppendRecord方法與InsertRecord方法:這里兩個方法分別與Append方法與Insert方法相似,都是用于在表中插入一條新紀錄,但AppendRecord方法與InsertRecord方法比Append方法與Inser t方法更簡單、更方便一些,不需要調用Post方法。過程形式如下:Procedure AppendRecord(Const Values:Array of Const);
Procedure InsertRecord(Const Values:Array of Const);
建立數據表的主從關系:設置表之間的主從關系是通過設置從表的MasterSource屬性和MasterField屬性來實現的,且從表必須按MasterField屬性中指定的字段建立了索引。
6.6TQuery組件
TQuery組件和TTable組件的比較:同屬于數據集組件。
不同之處為:TQuery組件主要功能是用來支持SQL語言訪問本地或遠程數據庫;TQuery組件允許用戶同時訪問多個表,而TTable組件一次只能訪問一個表格;TQuery組件訪問的是表格中的特定數據內容,而TTable組件只有在提供過濾或限定檢索范圍時才能訪問表格中的特定數據內容,否則訪問的將是表格中的全部數據。掌握P193 BDE綜合實例。
6.8 ADO技術
通過ADO不僅能夠訪問基于SQL Server的所有數據庫,而且可以通過ODBC訪問所有支持ODBC的數據庫。
ODBC是一種采用開放式結構進行數據庫鏈接的接口標準,是一種開放的獨立于廠商的API應用程序接口。掌握P208 ADO應用實例
第七章 Windows編程基礎
7.1動態鏈接庫(DLL)
Windows允許同時運行的多個程序共享一組函數的單一備份,于是引入了動態鏈接方式,將可共享的程序代碼以及各種數據資源編譯成單獨的模塊。
一般項目的格式如下: Program 程序標識符; Uses 單元列表; Begin 程序體; End.DLL項目文件的格式如下: Library 程序標識符號; Uses 單元列表;
Exports 過程和函數標識符列表; Begin 程序體; End.兩者的區別的原因在于:Delphi編譯器是一句項目文件頭的保留字是Program還是Library來決定編譯生成的是EXE文件還是DLL文件。若DLL 要輸出共其他應用程序調用的函數或過程,則需要在其項目文件的保留字exports之后一一列出,這些DLL函數或過程將被編譯成遠程地址調用。
Window系統自身包含三個DLL,分別是Kernel,User,GD1。DLL調用必須使用標準方式,其一是靜態引用,其二是動態引用。靜態引入:
加載引用的DLL文件是,庫文件的查找順序是:
1、當前路徑;
2、Windows系統的安裝目錄;
3、Windows的系統目錄system和system32;
4、列在環境變量PATH中的路徑。
引入方法:
1、最簡單的是名字引入;
2、使用索引引入;
3、若名字引入會引起標識符沖突,可以使用換名引入。
第三篇:Delphi之動態數組使用總結
Delphi之動態數組使用總結
傳統的Pascal 語言其數組大小是預先確定的,當你用數組結構聲明數據類型時,你必須指定數組元素的個數。專業程序員也許知道些許動態數組的實現技術,一般是采用指針,用手工分配并釋放所需的內存。
Delphi 4中增加了非常簡單的動態數組實現方法,實現過程效仿我前面講過的動態長字符串。與長字符串一樣,動態數組的內存動態分配并且引用記數,不過動態數組不支持 copy-on-write 技術。這不是個大問題,因為你可以把變量值設置為nil釋放數組內存。
這樣你就可以聲明一個不指定元素個數的數組,并用SetLength 過程給數組分配一個特定大小的內存,SetLength 過程還可以改變數組大小而不影響其內容,除此外還有一些字符串過程也可用于數組,如Copy 函數。
以下摘錄的代碼突出了一點,這就是:定義數組后必須先為它分配內存,然后才能開始使用:
procedure TForm1.Button1Click(Sender: TObject);var Array1: array of Integer;begin Array1 [1] := 100;// error SetLength(Array1, 100);Array1 [99] := 100;// OK...end;如果你只定義一個數組元素個數,那么索引總是從0開始。Pascal 中的普通數組既能用不為零的下標,也能用非整數的下標,但動態數組均不支持這兩種下標。象普通數組一樣,你可以通過Length、High和Low 函數了解到動態數組的狀況,不過對于動態數組,Low 函數返回值總是0,High函數返回數組大小減1,這意味著空的動態數組其函數High返回值是-1,這是一個很怪的值,因為它比Low的返回值還小。
圖 8.1: 例 DynArr 窗體
以上作了簡短的介紹,現在舉個簡例,例名DynArr,見圖8.1。例子實在是很簡單,其實動態數組沒有什么特別復雜地方。我想通過該例說明幾個程序員可能犯的錯誤。程序中聲明了兩個全程數組并在OnCreate 事件中初始化了第一個數組:
var Array1, Array2: array of Integer;procedure TForm1.FormCreate(Sender: TObject);begin // allocate SetLength(Array1, 100);end;這樣就把數組所有值設置為0。完成這段代碼你馬上就能讀寫數組元素的值,而不用害怕內存出錯,當然條件是你沒有試圖訪問超過數組上界的元素。為了更好地初始化,程序中添加了一個按鈕,執行數組元素賦值操作: procedure TForm1.btnFillClick(Sender: TObject);var I: Integer;begin for I := Low(Array1)to High(Array1)do
Array1 [I] := I;end;Grow 按鈕用于修改數組大小,但并不影響數組內容。單擊Grow 按鈕后,你可以用Get value按鈕進行檢驗:
procedure TForm1.btnGrowClick(Sender: TObject);begin // grow keeping existing values SetLength(Array1, 200);end;procedure TForm1.btnGetClick(Sender: TObject);begin // extract Caption := IntToStr(Array1 [99]);end;Alias 按鈕的OnClick 事件代碼稍復雜些,程序通過 := 算子把一個數組拷貝給另一個數組,從而有效地創建了一個別名(一個新變量,但引用內存中同一數組)。從中可見,如果你改變了其中一個數組,那么另一個同樣也會改變,因為它們指向同一個內存區:
procedure TForm1.btnAliasClick(Sender: TObject);
begin // alias Array2 := Array1;// change one(both change)Array2 [99] := 1000;// show the other Caption := IntToStr(Array1 [99]);
在btnAliasClick 事件中增加了兩部分操作內容。第一部分是數組等同測試,不過并不是測試實際的數組元素,而是測試數組所引用的內存區,檢測變量是不是內存中同一數組的兩個別名:
procedure TForm1.btnAliasClick(Sender: TObject);begin...if Array1 = Array2 then
Beep;// truncate first array Array1 := Copy(Array2, 0, 10);end;btnAliasClick 事件的第二部分內容是調用Copy 函數。該函數不僅把數據從一個數組移到另一個數組,而且用函數創建的新數組取代第一個數組,結果變量Array1 所引用的是11個元素的數組,因此,按Get value 和Set value 按鈕將產生一個內存錯誤,并且觸發一個異常(除非你把范圍檢查range-checking 選項關掉,這種情況下,錯誤仍在但屏幕上不會顯示異常)。雖然如此,Fill 按鈕仍能正常工作,因為需要修改的數組元素由數組當前的下標范圍確定。
自從有了動態數組,鏈表除了在教科書里出現外,已經很少在實際編程中被使用了,事實也是如此,數組的確比傳統鏈表快得多,而且也方便的多。
從 Delphi4起,開始了內建各種類型的動態數組支持。但是,對我們來說動態數組支持似乎做的不夠徹底,因為Delphi竟然連刪除、插入、移動連續元素的函數都沒有提供,讓人使用起來總覺得不夠爽!!J。作為一名程序員,我們當然要有自己解決問題的能力,下面就讓我們簡單介紹一下Delphi 下的動態數組。
在Delphi中,數組類型有靜態數組(a : array[0..1024] of integer)、動態數組(var a : array of integer)、指針數組(即指向靜態數組的指針)和開放數組(僅用于參數傳遞)。靜態數組、指針數組有速度快的好處,動態數組有大小可變的優勢,權衡之下就有了折衷的辦法,那就是定義的動態數組在必要時轉換為指針。
動態數組聲明之后,只有下面幾個函數可┎僮鰨?o:p>
1.設置數組大小,可以任意縮減或增加數組大小
Procedure SetLength(var S;NewLength : integer);
2.取出連續元素,復制給另一個數組變量
Function Copy(s;Index,Count : integer): array;
3.取得數組大小及上下限
Function Length(s):integer;
Function High(x):integer;
Function Low(x):integer;
值得注意的是,不加const或var修飾的動態數組會被作為形參傳遞,而動態數組用const修飾并不意味著你不能修改數組里的元素(不信你可以字自己在程序中試試。還有一點是High函數調用了Length 函數,所以我們在獲取數組上限時最好直接用 Length(s)函數。
動態數組在內存空間中占用4個字節.動態數組在內存中的分配表如下:
偏移量
內容
32-bit 引用計數
32-bit 數組長度
0..數組長度 *(元素尺寸)4)^;// 變量的長度,偏移量-4
if index >= len then //要刪除的位置超出范圍,退出
Exit;
MaxDelete := len-index;// 最多刪除的數量
Count := Min(Count, MaxDelete);// 取得一個較小值
if Count = 0 then // 不要求刪除
Exit;
Dec(len, Count);// 移動到要刪除的位置
MoveMemory(PChar(P)+index*elSize , PChar(P)+(index + Count)*elSize ,(len-index)*elSize);//移動內存
Dec(P);//移出 “數組長度”位置
Dec(P);//移出“引用計數” 位置
//重新再分配調整內存,len 新的長度.Sizeof(Longint)* 2 = 2*Dec(P)
ReallocMem(P, len * elSize + Sizeof(Longint)* 2);
Inc(P);// 指向數組長度
P^ := len;// new length
Inc(P);// 指向數組元素,開始的位置
PLongint(A):= P;end;
對上面的例子,我們需要注意的是 elSize 參數,它必須是 SizeOf(DyArray_Name),表示元素所占用的字節數。
相信看了上面的例子后,對于動態數組的拷貝,移動想必也可以自己實現了吧 J
后續:
其實,Delphi 對許多類型的內存分配都很相似,比如 string 類型,其實它和動態數組是很相似的,我們完全可以把它拿來當成動態數組。實質上 string 是 Pchar 的簡易版本。不管怎么說,了解一些內存的分配對我們這些開發人員來說還是有一些好處的。
第四篇:Delphi實習報告
實習報 告 書 專 用 紙
實習報 告 書
引言
題
目: Delphi 學
院:
專
業: 地理信息系統 班
級:
姓
名: 學
號:
2013年
6月日
實習報 告 書 專 用 紙
娛樂場所信息查詢軟件,軟件界面設計簡潔,美觀,其人性化的軟件流程,可以讓一般人方便的查詢娛樂場所,上手極易,不用打開多個窗口可重復查詢。系統需求分析
根據用戶的需求,對本系統做整體的需求分析,這是保證系統有效性和實用性的前提。
2.1 功能需求分析
在設計本系統之前,作者與相關工作人員進行了交流,并對此進行了歸納提煉,得出建立一個娛樂場所信息查詢應具備如下功能:
(1)娛樂場所信息查詢。可以對任何一個娛樂場所的詳細信息進行查詢,其中包括名稱、所處路名、ID等。
(2)娛樂場所所在地區的地圖顯示。(3)最短路徑的分析。(4)地圖打印。
2.2 數據需求
根據功能需求的要求,需要有一系列的數據來支撐,本系統需要的數據包括所處地區的地圖模板、道路信息、娛樂場所信息等 系統設計
為確保系統順利的實施,本系統遵循軟件工程原理和方法,對系統進行總體設計和詳細設計;其次,應滿足先進性原則,依照國際標準,借鑒主流系統的體系結構,保證系統具有較長的生命力和擴展能力;此外,還應滿足成熟性原則、實用性原則、高可靠性原則等。根據需求分析的結果,本著以上原則展開對本系統的設計。
3.1 界面設計
為了界面設計,增強系統的美觀性、靈活性,使系統易于操作,采用了很多優秀的
實習報 告 書 專 用 紙
3.1.1 登錄界面
該系統需要輸入用戶名、密碼才可運用,具有較好的保護性
3.1.2 關于界面
3.2 技術路線
本系統采用Embarcadero Delphi XE3作為開發工具。Delphi,是Windows平臺下著名的快速應用程序開發工具,最早的版本由美國Borland(寶蘭)公司于1995年開發。
實習報 告 書 專 用 紙
Delphi是一個集成開發環境(IDE),使用的核心是由傳統Pascal語言發展而來的Object Pascal,以圖形用戶界面為開發環境,通過集成開發環境、VCL工具與編譯器,配合連結數據庫的功能,構成一個以面向對象程序設計為中心的應用程序開發工具。
“真正的程序員用C,聰明的程序員用Delphi”,這句話是對Delphi最經典、最實在的描述。Delphi最大的特點是簡單易學、執行高效而且功能強大。和Microsoft Visual Studio C++ 相比,Delphi更易于掌握,學習周期也比較短,而在功能上卻絲毫不遜色;而與Visual Basic相比,Delphi功能更強大、更實用,尤其在開發數據庫方面,它的特點更是體現得淋漓盡致。這正是作者選用Delphi作為開發工具的原因。
Delphi發展至今,從Delphi 1到現在的Delphi XE2,不斷添加和改進各種特性,功能越來越強大。Delphi 2010內置了Direct 2D模塊及開發庫,其新加的功能包括:○1○1支持64位Windows操作系統的開發;○2○2稱為FireMonkey的新的跨平臺框架;○3○3在Windows上開發,用來編譯Max OS X的交叉編譯器;④FireMonkey支持iOS(Apple iPad及iPhone)的開發;⑤LiveBindings的新的數據綁定功能,允許你將任何可視對象綁定到任何使用表達式的源對象。系統實現
4.1 概述
在完成了需求分析、系統設計和技術路線的選定后,按照前期工作的思路,逐步的實現商品管理系統。本系統以Delphi XE3為開發環境,實現了連云港娛樂場所信息查詢功能。
4.2 功能模塊實現
4.2.1 登錄模塊
實習報 告 書 專 用 紙
操作部分核心代碼如下所示:
procedure TForm2.Button1Click(Sender: TObject);begin
ClientDataSet1.Close;ClientDataSet1
.CommandText
:='select
*
from
Table01
where name='''+edit1.Text+''' and “PASSWORDs” ='''+edit2.text+'''';ClientDataSet1.Open;if ClientDataSet1.RecordCount=0 then begin ShowMessage('口令錯誤');end else begin ModalResult:=mrOk;end;end;4.2.2 圖層管理
實習報 告 書 專 用 紙
操作部分核心代碼如下所示:
procedure TForm1.FormCreate(Sender: TObject);var denglu: TForm2;begin pShpLayer := TGIS_LayerSHP.Create;pShpLayer.path := 'D:delphi連云港.shp';ttkViewer1.Add(pShpLayer);pShpLayer := TGIS_LayerSHP.Create;pShpLayer.path := 'D:delphi道路.shp';ttkViewer1.Add(pShpLayer);pShpLayer := TGIS_LayerSHP.Create;pShpLayer.path := 'D:delphi娛樂.shp';pShpLayer.Params.Labels.Field := '名稱';pShpLayer.Params.Labels.color := clred;ttkViewer1.Add(pShpLayer);ttkViewer1.FullExtent;pShpLayer1 := ttkViewer1.items[0] as TGIS_LayerVector;pShpLayer2 := ttkViewer1.items[1] as TGIS_LayerVector;pShpLayer3 := ttkViewer1.items[2] as TGIS_LayerVector;denglu := TForm2.Create(Self);denglu.showmodal;
實習報 告 書 專 用 紙
denglu.Free;end;4.2.3 圖層的放大縮小(1)點擊縮放
操作部分核心代碼如下所示
procedure TForm1.Button2Click(Sender: TObject);begin ttkViewer1.mode := giszoomex;end;
(2)點擊暫??s放
操作部分核心代碼如下所示:
procedure TForm1.Button3Click(Sender: TObject);begin ttkViewer1.mode := gisSelect;end;4.2.4點擊地圖平移
實習報 告 書 專 用 紙
操作部分核心代碼如下所示:
procedure TForm1.Button5Click(Sender: TObject);begin ttkViewer1.mode := gisdrag;end;4.2.5點擊屬性查詢
實習報 告 書 專 用 紙
操作部分核心代碼如下所示:
procedure TForm1.Button4Click(Sender: TObject);begin ttkViewer1.mode := gisSelect;end;4.2.6路名顯示 點擊路名顯示
操作部分核心代碼如下所示:
procedure TForm1.Button8Click(Sender: TObject);begin pShpLayer1.Params.Labels.Visible := false;pShpLayer3.Params.Labels.Field := '名稱';pShpLayer2.Params.Labels.Field := '路名';ttkViewer1.FullExtent;end;4.2.7最短路徑分析 點擊最短路徑查詢
實習報 告 書 專 用 紙
操作部分核心代碼如下所示:
procedure TForm1.Button6Click(Sender: TObject);var ii, jj: Integer;I: Integer;aa, bb: string;begin presultlayer := TGIS_LayerVector.Create;presultlayer.CS := ttkViewer1.CS;presultlayer.Params.Line.color := clred;presultlayer.Params.Line.Width := 40;presultlayer.HideFromLegend := True;ttkViewer1.Add(presultlayer);
proadlayer := ttkViewer1.Items[1] as TGIS_LayerVector;
pgeocoding := tgis_geocoding.Create(proadlayer);pgeocoding.RoadName := 'GIS_UID';(ttkViewer1.Get('TGIS_Geocoding')
as
實習報 告 書 專 用 紙
TGIS_LayerVector).HideFromLegend := True;
pshortespath := TGIS_ShortestPath.Create(ttkViewer1);pshortespath.LoadTheData(proadlayer);pshortespath.RoadName := 'GIS_UID ';pshortespath.UpdateTheData;pshape := proadlayer.FindFirst(proadlayer.Extent, '路名=''' + Edit1.Text + '''');aa := pshape.GetField('gis_uid');ii := pgeocoding.Parse(aa);if ii > 0 then begin pstartpoint := pgeocoding.Point[0];Edit1.Text := pgeocoding.Query[0];pgeocoding.AddPoint(pstartpoint, 3 / ttkViewer1.Zoom, nil);end else begin ShowMessage(Edit1.Text + ' 是無效地名');Exit;end;
pshape := proadlayer.FindFirst(proadlayer.Extent, '路名=''' + Edit2.Text + '''');bb := pshape.GetField('gis_uid');jj := pgeocoding.Parse(bb);if jj > 0 then begin pstoppoint := pgeocoding.Point[0];Edit2.Text := pgeocoding.Query[0];pgeocoding.AddPoint(pstoppoint, 3 / ttkViewer1.Zoom, nil);end else
實習報 告 書 專 用 紙
begin ShowMessage(Edit2.Text + ' 是無效地名');Exit;end;
pshortespath.UpdateTheData;if pshortespath.Find(pstartpoint, pstoppoint)then begin presultlayer.RevertAll;for I := 0 to pshortespath.ItemsCount-1 do begin pshape pshortespath.Items[I].Layer.GetShape(pshortespath.Items[I].Uid);if pshape <> nil then presultlayer.AddShape(pshape);end;ttkViewer1.VisibleExtent := presultlayer.Extent;ttkViewer1.Zoom := ttkViewer1.Zoom * 0.8;ttkViewer1.Update;end else begin ShowMessage(' 此路不通 ');end;end;4.2.8打印 點擊打印
:=
實習報 告 書 專 用 紙
操作部分核心代碼如下所示:
procedure TForm1.Button9Click(Sender: TObject);begin ttksimple.preview;end;4.2.9定點查詢 點擊定點查詢
操作部分核心代碼如下所示:
procedure TForm1.Button1Click(Sender: TObject);var pshape: TGIS_Shape;
實習報 告 書 專 用 紙
pLayer: TGIS_LayerVector;begin pLayer := ttkViewer1.items[2] as TGIS_LayerVector;pshape := pLayer.FindFirst(pLayer.Extent, '名稱=''' + Edit3.Text + '''');if pshape <> nil then begin ttkViewer1.Center := pshape.Centroid;pshape := pshape.MakeEditable;pshape.IsSelected := true;ttkattrib.ShowShape(pshape);ttkattrib.Visible := true;ttkViewer1.Update;end;end;4.2.9關于模板
4.3 系統功能及效率分析
經過測試,系統總體的執行效率比較高。能夠滿足用戶的基本要求??偨Y
本論文主要是探討娛樂場所信息查詢服務的設計與實現問題。在系統設計之初,盡管作者做了調查,但依然缺少足夠的管理方面的經驗,在結構和功能方面尚有考慮不到的地方。
第五篇:JSP語法總結
JSP語法(1)——HTML注釋
HTML 注釋 在客戶端顯示一個注釋.JSP 語法 例子 1 在客戶端的HTML源代碼中產生和上面一樣的數據: 例子 2 在客戶端的HTML源代碼中顯示為: 描述 這種注釋和HTML中很像,也就是它可以在“查看源代碼”中看到。唯一有些不同的就是,你可以在這個注釋中用表達式(例子2所示)。這個表達示是不定的,由頁面不同而不同,你能夠使用各種表達式,只要是合法的就行。
JSP語法(2)——隱藏注釋
隱藏注釋 寫在JSP程序中,但不是發給客戶。JSP 語法 <%--comment--%> 例子: <%@ page language=“java” %>
A Test of Comments
<%--This comment will not be visible in the page source--%>