第一篇:Delphi 字符串類型淺析
Delphi 字符串類型淺析 收藏
參考資料《Delphi 5開發人員指南》“第2章Object Pascal語言” 《PASCAL精要》“第7章 字符串操作” “Delphi中String類型和Char類型的比較” “Object Pascal中String類型的內幕探討”
基本知識字符串類型
?AnsiString這是Pascal缺省的字符串類型,它由AnsiChar字符組成,其長度沒有限制,同時與null結束的字符串相兼容。
?ShortString保留該類型是為了向后兼容Delphi1.0,它的長度限制在255個字符內。
?WideString功能上類似于AnsiString,但它是由WideChar字符(UniCode字符集)組成的。引入這種類型,主要是為了支持OLE編程。
?PChar指向null結束的Char字符串的指針,類似于C的char*或lpstr類型。
?PAnsiChar指向null結束的AnsiChar字符串的指針。
?PWideChar指向null結束的WideChar字符串的指針。
字符類型
?AnsiChar,以 8 位表示(共有 256 個不同的符號)。
?WideChar,以 16 位表示(共有 64,000 個不同的符號)。
String類型
注意:以下是指Delphi2007以前的編譯器(包括Delphi2007)。
1、缺省情況下,如果用如下的代碼來定義字符串,編譯器認為是AnsiString字符串: var
S:string;//編譯器認為S的類型是AnsiString
2、編譯開關$H
“$H編譯開關”的值用來決定當變量聲明為string時,它是被當作AnsiString類型還是被當作ShortString類型。當“$H”值為負時,string變量是ShortString類型;當“$H”值為正時(缺省情況),string變量是AnsiString類型。下面的代碼演示了這種情況: var
{$H-}
S1:string;//S1是ShortString類型 {$H+}
S2:string;//S2是AnsiString類型
使用$H規則的一個例外是,如果在定義時特地指定了長度(最大在255個字符內),那么總是ShortString。var
S:string[63];//63個字符的ShortString字符串
Char類型
1、Delphi2007以前的編譯器(包括Delphi2007)缺省情況下認為Char是AnsiChar類型,PChar是PAnsiChar類型。
2、Delphi2009的編譯器缺省情況下認為Char是WideChar類型,PChar是PWideChar類型。請注意,沒有任何方法可變更這個新的編譯器預設設定。對于字符串類型而言,會以固定的硬式編碼方式將 Char 類型對應到特定的數據類型。
AnsiString類型
1、AnsiString是生存期自管理類型。
2、AnsiString字符串總是以null字符結束的,這使得AnsiString字符串能與Win32API中的字符串兼容。
3、AnsiString類型是一個指向在堆棧中的字符串結構的指針。可以使用Sizeof去讀取AnsiString類型的大小,不論字符串的實際長度是多少,Sizeof(AString)永遠是4。
4、AnsiString字符串在內存中分配的情況 注意:
在Delphi2.0以后版本中,不能再通過字符串的第0個元素來設置或得到字符串的長度,只能通過Length()函數來得到字符串的長度,通過SetLength()過程來設置字符串的長度。Borland并不保證String的內存結構在以后的Delphi版本中會保持不變。
(1)、Delphi5內存結構如下:
(2)、Delphi7內存結構如下:
AnsiString指向一塊內存起始偏移8字節處,前面8字節依次為引用計數和長度計數兩個整數。(3)、Delphi2009內存結構如下:-12-10-8-4
最后一位
字碼頁
字符大小
引用計數
字串長度
字串內容
0
除了字串長度及引用計數外,新的AnsiString格式包括字符大小及字碼頁。字符大小可用來區分 AnsiString 及UnicodeString,而字碼頁特別適用于 AnsiString 類型(可用于 Delphi 2009),UnicodeString 類型的字碼頁則固定為 1200,字碼包括UTF-
8、GBK等,例如“$03A8就是936,查MSDN 936sizeof(StrRec));
showmessage(Format('分配大小:%d 引用計數:%d 字串長度:%d', [P.allocSiz,P.refCnt,P.length]));end;
示例:delphi7字符串內存結構
代碼:
procedure TForm1.Button1Click(Sender: TObject);type
PStrRec = ^StrRec;
StrRec = packed record
refCnt: Longint;
length: Longint;
end;var
str: string;
P: PStrRec;
begin
str:='123';
P := Pointer(Integer(str)sizeof(StrRec));
showmessage(Format('字碼頁:%d 字符大小:%d 引用計數:%d [P.codePage,P.elemSize,P.refCnt,P.length]));end;
示例:widestring的長度
代碼:
字串長度:%d', procedure TForm1.Button1Click(Sender: TObject);
//---
function _WStrLen1(const S: WideString): Integer;
begin
if Pointer(S)= nil then
Result := 0
else
Result := PInteger(Integer(S)-4)^ div sizeof(WideChar);
end;var
str: widestring;
begin
str := '測試123';
showmessage(Format('字串長度:%d', [_WStrLen1(str)]));end;
本文來自CSDN博客,轉載請標http://blog.csdn.net/starsky2006/archive/2010/07/31/5778729.aspx
出處明:
第二篇: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 學
院:
專
業: 地理信息系統 班
級:
姓
名: 學
號:
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)點擊暫停縮放
操作部分核心代碼如下所示:
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 系統功能及效率分析
經過測試,系統總體的執行效率比較高。能夠滿足用戶的基本要求。總結
本論文主要是探討娛樂場所信息查詢服務的設計與實現問題。在系統設計之初,盡管作者做了調查,但依然缺少足夠的管理方面的經驗,在結構和功能方面尚有考慮不到的地方。
第四篇:字符串輸出格式
printf的格式控制的完整格式:
%-0m.nl或h格式字符
下面對組成格式說明的各項加以說明:
①%:表示格式說明的起始符號,不可缺少。
②-:有-表示左對齊輸出,如省略表示右對齊輸出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域寬,即對應的輸出項在輸出設備上所占的字符數。
n指精度,用于說明輸出的實型數的小數位數。為指定n時,隱含的精度為n=6位。
⑤l或h:l對整型指long型,對實型指double型。h用于將整型的格式字符修正為short型。
格式小結:
(1)最常用的格式是%d,含義是以10進制形式打印一個整數。
如果輸出的整數是負數,則輸出的第一個字符就是-號。
%d:按整型數據的實際長度輸出。
%md:m為指定的輸出字段的寬度。如果數據的位數小于m,則左端補以空格,若大于m,則按實際位數輸出。
%ld:輸出長整型數據。
(2)%u格式與%d格式類似,只不過要求打印無符號10進制整數。
以無符號十進制形式輸出整數。
對長整型可以用“%lu”格式輸出。同樣也可以指定字段寬度用“%mu”格式輸出。
(3)%o格式請求輸出8進制整數,以無符號八進制形式輸出整數。
對長整型可以用“%lo”格式輸出。同樣也可以指定字段寬度用“%mo”格式輸出。
(4)%x和%X格式請求輸出16進制整數。
%x格式中用小寫字母a,b,c,d,e,f來表示10到15之間的數,以無符號十六進制形式輸出整數。
對長整型可以用“%lx”格式輸出。同樣也可以指定字段寬度用“%mx”格式輸出。%X格式中用大寫字母A,B,C,D,E,F來表示10到15之間的數
共同點:8進制和16進制整數總是作為無符號數處理的。
(5)%s格式用于打印字符串,與之對應的參數應該是一個字符指針,待輸出的字符始于該指針所指向的地址,直到出現一個空字符(' 主站蜘蛛池模板: 日韩 无码 偷拍 中文字幕| 精品无码综合一区二区三区| 亚洲成av人在线观看网站| 不满足出轨的人妻中文字幕| 久久精品成人亚洲另类欧美| xxxxx欧美| 亚洲国产av高清无码| 亚洲精品一区国产欧美| 3p人妻少妇对白精彩视频| 国精无码欧精品亚洲一区| 国产女人高潮视频在线观看| 国产av午夜精品一区二区三区| 欧美人和黑人牲交网站上线| 亚洲综合无码精品一区二区| 噜噜吧噜吧噜吧噜噜网a| 51国产偷自视频区视频| 无码人妻少妇精品无码专区漫画| 国产麻豆亚洲精品一区二区| 国产日产精品一区二区三区四区的特点| 亚洲av午夜福利精品一区| 扒开双腿疯狂进出爽爽爽| 国产suv精品一区二区6| 久久精品一区二区三区四区| 久久亚洲日韩看片无码| 国产高清在线精品一区下载| 久久综合九色欧美综合狠狠| 动漫无遮挡羞视频在线观看| 秋霞最新高清无码鲁丝片| 人妻丝袜中文无码av影音先锋| 久久久久国色av免费观看性色| 欧美牲交a欧美牲交aⅴ| 久久青青草原一区二区| 十八禁视频在线观看免费无码无遮挡骂过| 国产日韩欧美亚洲精品中字| 亚洲欧美日韩二三区在线| 国产在线视频一区二区三区98| 人人妻人人藻人人爽欧美一区| 午夜视频体内射.com.com| 伊人久久大香线蕉av不变影院| 亚洲精品www久久久久久| 日本一区午夜艳熟免费|