當前位置:首頁 » 花卉百科 » 鬱金香delphi外掛編程高級實例系列大型培訓視頻教程

鬱金香delphi外掛編程高級實例系列大型培訓視頻教程

發布時間: 2023-04-29 05:02:50

⑴ DELPHI基礎教程:Delphi開發資料庫應用程序概述(一)[4]

值得指出的是在絕大多數資料庫應用中 一般都是使用數據集部件TTable TQuery或TStoredProc與磁碟上的資料庫進行連接 用TDataSource部件連接數據控制部件和數據集部件 當然用戶也可以自定義數據集部件 用於資料庫應用當中 TTable TQuery 和TStoredProc部件中都包含一個不可見的TField類型的對象Fields Fields是一個串列表 它對應於資料庫表或一個查詢結果的列或欄位 Fields對象是伴隨著TTable TQuery 和TStoredproc部件的活動狀態動態地建立的 當資料庫表被關閉時 Fields 對象也隨之消失 它在程序設計和程序運行過程中都是不可見的

當然也可以利用Fields Editor建立永久性的Fields對象供Delphi應用程序使用 我們將在後面的內容中詳細闡述

TTable部件

利用TTable部件程序設計人員甚至可以不需要編寫任何程序便可對資料庫進行訪問 在一個應用程序窗體中放置一個TTable部件的過程如下

在部件選擇板上選擇Data Access頁

單擊Table圖標

在窗體內單擊滑鼠 獲得一個TTable部件

為TTable部件設置有關的屬性

DatabaseName屬性指定要訪問的資料庫所在的路徑名 路徑名可以用別名來表示

TableName屬性指定要訪問資料庫中具體的資料庫表

Active屬性設置為True時 表示打開要訪問的資料庫表 設置為False時 暫時不打開要訪問的資料庫表

預設情況下 TTtable部件中包含了要訪問的資料庫表中所有的欄位和記錄 用滑鼠雙擊TTable圖標時 會出現一個欄位編輯器(Fields Editor) 使用Fields Editor可以對TTable部件中包含的資料庫表中的欄位的顯示格式等屬性進行編輯 具體可以控制

● 建立一個永久性的欄位列表 包括欄位的順序 欄位的類型等 即使磁碟上實際的資料庫表的表結構發生了改變 我們建立的這個永久性的欄位列表也不會發生改變

● 為每個欄位指定一個便於閱讀和使用的名字

● 指定欄位顯示的順序

● 為每個欄位指定一個用於顯示的字元串

● 為欄位增加合法性檢驗

● 為了顯示的需要還可以建立新的欄位(如可計算的欄位)具體的使宏陵絕用方法見後面的內容

TQuery部件

TQuery部件是我們使用SQL語言開發資料庫應用程序的有力工具 因為使用SQL語言 我們可以非常方便靈活地對一個或多個資料庫表中的記錄進行訪問 所以利用TQuery我們可以查詢本地的資料庫如Pà?aradox和dBASE資料庫系統中的數據 我們還可以使用TQuery部件對一個遠地的資料庫SQL伺服器進行訪問 建立Client/Server模式的應用程序

在一個應用程序窗體中放置一個TQuery部件的過程蔽姿如下

在部件選擇板汪正上選擇Data Access頁

單擊Query圖標

在窗體內單擊滑鼠 獲得一個TQuery部件

為TQuery部件設置有關的屬性

DatabaseName屬性指定將要訪問的資料庫的路徑名

SQL屬性指定對資料庫表進行訪問SQL語句 它可以是一條查詢語句也可以是一條修改語句或插入語句等 在對象瀏覽器上 單擊SQL屬性時 會打開一個字元串編輯器供程序設計者輸入SQL語句

在這里要注意在TQuery部件中 不是用TableName 屬性來指定要訪問的資料庫中的資料庫表 而是在SQL屬性中 通過SQL語句來指定將要訪問的資料庫表

TDataSouece部件

TDataSource部件是連接數據集部件TTable TQuery TStoredProc 和數據控制部件TDBGrid TDBEdit等的橋梁 TTable TQuery TStoredProc部件通過BDE可以實現與磁碟上的資料庫連接即訪問 但它們本身不能顯示資料庫中的數據信息 而數據控制部件如TDBGrid TDBEdit等能夠提供可視化的界面 顯示資料庫中的數據信息 但它們不具備訪問磁碟資料庫的能力 正是TDataSource將這兩者有機地結合起來 使得用戶才能交互地對資料庫中的數據信息進行查詢 修改 插入 刪除等操作

在應用程序窗體中放置TDataSource部件的過程如下

在部件選擇板上選擇Data Access頁

單擊DataSource圖標

在窗體內單擊滑鼠 獲得一個TDataSource部件

為TDataSource部件設置有關的屬性

Dataset屬性指定一個數據集部件 可以是TTable TQuery或TStoredProc部件的名字

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25181

⑵ 誰有鬱金香delphi全套視頻教程,原版免key的,謝謝啊!

某寶上去買吧,好像5元一套。

⑶ DELPHI基礎教程:Delphi自定義部件開發(二)[4]

⑵ 定義處理過程類型

一旦你決定產生事件 就要定義事件如何被處理 這就是要決定事件處理過程的類型 在大多數情況下 定義的事件處理過程的類型是簡單的通知類型(TNotifyEvent)和已定義的事件類型

通知事件只是告訴你特定的事件發生了 而沒有描述什麼時候和什麼地方 通知事件使用時只帶一個TObject類型的參數 該參數是Sender 然而所有通知事件的處理過程都知道是什麼樣的事件發生和發生在那個部件 例如 Click事件是通知類型 當編寫Click事件的處理過程時 你知道的是Click事件發生和哪個部件被點按了 通知事件是單向過程 沒有提供反饋機制

在某些情況下 只知道什麼事件發生和發生在那個部件是不夠的 如果按鍵事件發生 事件處理過程往往要知道用戶按了哪個鍵 在這種情況下 需要事件處理過程包含有關事件的必要信息的參數 如果事件產生是為了響應消息 那麼傳遞給事件的參數最好是直接來自消息參數

因為所有事件處理過程都是過程 所以從事件處理過程中返回信息的唯一方法是通過var參數 自定義部件可以用這些信息決定在用戶事件處理過程執行後是否和怎樣處理事件

例如 所有的擊鍵事件(OnKeyDown OnKeyUp和OnKeyPressed)通過名為key的var參數傳遞鍵值 為了使應用程序看見包含在事件中的不同的鍵 事件處理過程可以改變key變數值

⑶ 聲明事件

一旦你決定了事件處理過程的類扒型型 你就要准備聲明事件的方法指針和屬性 為了讓用戶易於理解事件的功能 應當給事件一個有意義的名字 而且還要與部件中相似的屬性的名稱保持一致

Delphi中所有標准事件的名稱都以 On 開頭 這只是出於方便 編譯器並不強制它 Object Inspector是看屬性類型來決定屬性是否是事件 所有的方法指針屬性都被看作事件 並出現在事件頁中

⑷ 調用事件

一般說來 最好將調用集中在事件上 就是說在部件中創建一個虛方法來調用用戶的事件處理過程和提供任何預設處理 當調用事件時 應考慮以下兩點

● 必須允許空事件

● 用戶能覆蓋預設處理

不能允許使空事件處理過程產生錯誤的情況出現 就是說 自定義部件的正常功能不能依賴來自用戶事件處理過程的響應 實際上 空事件處理過程應當產生與無事件處理過程一樣的結果

部件不應當要求用戶以特殊方式使用它們 既然一個空事件春山猜處理過程應當與無事件處理過程一樣動作 那麼調用用戶事件處理過程的代碼應當象這樣

if Assigned(OnClick) then OnClick(Self)

{ 執行預設處理 }

而不應該有這樣的代碼

唯轎if Assigned(OnClick) then

OnClick(Self)

else

… { 執行預設處理 }

對於某些種類的事件 用戶可能想取代預設處理甚至刪除所有的響應 為支持用戶實現這種功能 你需要傳遞var參數給事件處理過程 並在事件處理過程返回時檢測某個值 空事件處理過程與無事件處理過程有相同作用 因為空事件處理過程不會改變任何var參數值 所以預設處理總是在調用空事件處理過程後發生

例如在處理Key Press事件 用戶可以通過將var參數key的值設置為空字元(# )來壓制部件的預設處理 代碼如下

if Assigned(OnkeyPress) then OnkeyPress(Self key)

if key <> # then { 執行預設處理 } ;

實際的代碼將與這稍有不同 因為它只處理窗口消息 但處理邏輯是相同的 在預設情況下 部件先調用任何用戶賦予的事件處理過程 然後執行標准處理 如果用戶的事件處理過程將key設為空 則部件跳過預設處理

處理消息

在傳統Windows編程中 一個很關鍵的方面是處理Windows發送給應用程序的消息 Delphi已經幫你處理了大多數的普通消息 但是在創建部件的過程中有可能Delphi沒有處理方法 得由自己處理消息 也可能創建了新的消息需要處理它們

學習掌握Delphi的消息處理 要掌握以下三個方面

● 理解消息處理系統

● 修改(改變)消息處理方法

● 建立新的消息處理方法

理解消息處理系統

所有的Delphi對象內部具有處理消息的機制 如調用消息處理方法或消息處理過程 消息處理的基本思想是對象接收某種消息並派送它們 這是通過調用與接收的消息相應的方法來實現的 如果沒有相應於消息的指定的方法 那就調用預設處理 下面的圖解表示消息派送系統

Delphi部件庫定義了將所有Windows消息(包括用戶自定義消息)直接轉換到對象方法調用的消息派送系統 一般沒有必要改變這種消息派送系統 只要建立消息處理方法

⑴Windows消息中有什麼?

Windows消息是包含若干有用的域的數據記錄 記錄中最重要的是一個整型大小的值 該值標識消息 Windows定義了大量的消息 庫單元Messages聲明了所有消息的標識 消息中其它的有用信息包括兩個域參數和結果域 兩個參數分別是 位和 位的 Windows代碼總是以wParam和lParam來引用它們

最初 Windows程序員不得不記住包含的每一個參數 現在 微軟公司已經命名了這參數 這樣理解伴隨這些消息的信息就更簡單了 例如 WM_KEYDOWN消息的參數被稱為vkey和keydata 這就比wParam和lParam給出了更多的描述信息

Delphi為不同類型的消息定義了指定的記錄類型 如滑鼠消息在long參數中傳遞滑鼠事件的x y座標 一個在高字 一個在低字 使用滑鼠消息記錄 你不需要自己關心哪個字是哪個座標 因為引用這些參數時通過名子Xpos和Ypos取代了lParamLo和lParamHi

⑵ 派送方法

當應用程序創建窗口時 在Windows Kernel中注冊了一個窗口過程 窗口過程是處理窗口消息的函數 傳統上 窗口過程包括了Case表達式 表達式的每個入口是窗口要處理的每一條消息 當你每次創建窗口時 必須建立完整的窗口過程

Delphi在下列三方面簡化了消息派送

● 每個部件繼承了完整的消息派送系統

● 派送系統具有預設處理 用戶只需定義想響應的消息的處理方法

● 可以修改消息處理的一部分 依靠繼承的方法完成大多數處理

這種消息派送系統的最大優點是用戶能在任何時候安全地發送任何消息給任何部件 如果部件沒有為該消息定義處理方法 那預設處理方法會解決這個問題 通常是忽略它

Delphi為應用程序每種類型的部件注冊了名為MainWndProc的方法作為窗口過程 MainWndProc包含了異常處理塊 它完成從Windows到名為WndProc的虛方法傳送消息記錄 並且通過調用應用程序對象的HandleException方法處理異常

MainWndProc是靜態方法 沒有包含任何消息的指定處理方法 定製過程發生在WndProc中 因為每個部件類型都能覆蓋該方法以適合特定的需要

WndProc方法為每個影響它們處理的任何條件進行檢查 以捕捉不要的消息 例如 當被拖動時 部件忽略鍵盤事件 因此 inControl的WndProc只在沒有拖動時傳送鍵盤事件 最後WndProc調用Dispatch方法 該方法是從TObject繼承來的靜態方法 決定什麼方法來處理消息

Dispatch使用消息記錄的Msg域來決定怎樣派送特定消息 如果部件已經給該消息定義了處理方法 則Dispatch調用該方法 反之 Dispatch調用預設處理方法

改變消息處理方法

在改變自定義部件的消息處理方法之前 先要弄清楚你真正想要做什麼 Delphi將大多數的Windows消息轉換成部件編寫者和部件用戶都能處理的事件 一般來說 你應當改變事件處理行為而不是改變消息處理行為

為了改變消息處理行為 要覆蓋消息處理方法 也能提供捕獲消息防止部件處理該消息

⑴ 覆蓋處理方法

為了改變部件處理特定消息的方法 要覆蓋那個消息的處理方法 如果部件不處理該消息 你就需要聲明新的消息處理方法

為了覆蓋消息處理方法 要在部件中以相同的消息索引聲明新的方法 不要使用override指令 你必須使用Message指令和相應的消息索引

例如 為了覆蓋一個處理WM_PAINT消息的方法 你要重聲明WMPaint方法

type

TMyComponent=class(…)

procere WMPaint(var Message: MPaint) message WM_PAINT;

end;

⑵ 使用消息參數

在消息處理方法內部 自定義部件訪問消息記錄的所有參數 因為消息總是var參數 如果需要的話 事件處理過程可以改變參數的值 Result域是經常改變的參數 Result是Windows文檔中所指的消息的返回值 由SendMessage返回

因為消息處理方法的消息參數的類型隨著被處理的消息的變化而變化 所以應當參考Windows消息文檔中的參數的名字和含義 如果出於某種原因要使用舊風格的消息參數(wParam lParam) 可以配合通用類型TMessage來決定Message

⑶ 捕獲消息

在某種情況下 你可能希望自定義部件能忽略某種消息 就是說 阻止部件將該消息派送給它的處理方法 為了那樣來捕獲消息 可以覆蓋虛方法WndProc

WndProc方法在將消息傳給Dispatch方法前屏蔽該消息 它依次決定哪一個方法來處理消息 通過覆蓋WndProc 部件得到了派送消息之前過濾它們的機會

通常 象下面這樣覆蓋WndProc:

procere TMyControl WndProc(var Message: TMessage)

begin

{ 決定是否繼續處理過程 }

inherited WndProc (Message)

end;

下面的代碼是TControl的WndProc的一部分 TControl定義整個范圍內的滑鼠消息 當用戶拖動和放置控制時 它們將被濾過

procere TControl WndProc(var Message:TMessage)

begin

if (Message Msg >= WM_MOVSEFIRST) and

(Message Msg <= WM_MOUSELAST) then

if Dragging then

DragMouseMsg(MMOUSE(Message)) { 處理拖動 }

else

… { 正常處理其它 }

… { 否則正常處理 }

end;

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25120

⑷ DELPHI基礎教程:數據訪問部件的應用及編程(三)[4]

增加欄位部件

欄位編輯器Fields Editor中的Add Fields菜單項用於向數據集部件中增加欄位部件的 單擊Add Fields菜單項時便會打開增加欄位部件對話框 如圖 所示 Available Fields列表框中顯示出數據集部件TTable或TQuery中當前可以用於創建永久欄位部件的全部的欄位 也就是說Available Fields列表框中顯示欄位是資料庫表中實際存在的欄位 而且還沒有為這些欄位創建相應的永久性的欄位部件 在預設狀態下所有的欄位都被選擇用於創建相應的永久性的欄位部件 用滑鼠單擊其中的欄位名可以有選擇地創建其相應的永久性的欄位部件 選擇好有關的欄位名之後 單擊OK按鈕便可以創建永久性的欄位部件

欄位編輯器的增加欄位部件對話框

刪除欄位部件

用欄位編輯器Fields Editor為數據集部件創建好的欄位部件都會顯示在欄位編輯器的Fields列表框中 如果用戶認為其中的一些欄位部件不合適或不再需要時 可以單擊這些不需要的欄位部件 然後單擊滑鼠右鍵彈出一佣彈出式菜單 從彈出式菜單中選擇Delete菜單項 便可刪除相應的欄位部件 如果在彈出式菜單中單擊Select All菜單項 然後選擇Delete菜單項 這樣會刪除已創建好的所有的欄位部件 某一個欄位部件被刪除以後 通過單擊Add Fields菜單項可以重新創建 只是先前為該欄位部件設定的一些屬性將不復存在

定義新的欄位部件

欄位編輯器Fields Editor中的彈出式菜單中New Fields菜單項是用來為數據集部件TTable或TQuery創建用於顯示目的的新的欄位部件 我們可以用它來為資料庫表中實際存在的欄位創建新的欄位部件(如改變欄位的數據類型 使它的欄位值被顯示時不再需有關的類型轉換) 但是我們使用New Fields菜單項創建新的欄位部件主要是創建計算欄位 計算欄位並不與資料庫表中實際存在的欄位對應 它的欄位值是根據表中其它的欄位值計算而來的 具體的計算表達式由用戶為TTable部件或TQuery部件的OnCalCFields事件編寫程序代碼時決定

定義(創建)計算欄位的過程如下

單擊欄位編輯器中的New Fields菜單項 定義欄位對話框如圖 所示

在FieldName編輯框中輸入新欄位部件的名字 或者從下拉式列表框中選擇一個已存在的欄位部件的名字

在FieldType列表框中為新欄位部件選擇一個欄位類型

單擊Calculated檢查框 確認定義的新欄位部件是計算欄位

單擊ok按鈕 創建上述定義的計算欄位部件 此時該欄位部件的名字會自動地加入到字滾搭段編輯中的Fields列表框中

創建新的計算欄位

新的計算欄位創建好了之後 它是沒有任何欄位值的 我們必須要編寫相應的程序代碼 根據資料庫表中實際存在的欄位的欄位值為計算欄位的寶定義欄位值 我們為計算欄位所在數據集部件的OnCalcFields事件編寫代碼來為計算欄位賦值 其步驟如下

選擇數據集部件TTable或TQuery

單擊數據集部件的事件頁

雙擊OnCalcFields事件為TTable或TQuery部件編寫事件處理過程

TReport部件及其應用

在一般的資料庫應用程序中都包含著為最終用戶提供輸出報表的功能 使用Delphi開發資料庫應用程序時 可以使用一個叫TReport的部件來執行報表功能的 報表的具體格式和內容是由Delphi提供的一個專用報表生成工具ReprotSmith創建的 它報表的具體格式彎備虛和內容生成一個報表文件 然後為TReport部件設置相應的屬性埋燃參數 由TReport部件執行報表功能

我們可以在設計階段雙擊TReport部件 調用ReportSimith工具或者在Delphi程序組內雙擊ReportSmith圖標來調用ReportSmith工具來創建一個報表文件 具體的操作步驟和設計方法請參看ReportSimth工具的使用說明

我們在使用TReport部件執行報表功能時 要設置TReport部件的一些的一些屬性 這些屬性是

ReportName屬性 說明報表文件的名字 就是用ReportSmith創建的報表文件

ReportDir屬性 說明報表文件所在的途徑名

PreView屬性 這是一個布爾型屬性 若它的值為True 那麼在執行報表功能時 只是在屏幕上顯示報表 若它的值為False 則報表內容將在預設的列印機列印出來

AutoUnload屬性 布爾型屬性 它的值為True時 在執行完一個報表功能後 自動地從內存中卸出ReportSmith工具 它的值為False時 在運行完一個報表功能後 不從內存中卸出ReportSmith工具 一般情況下 如果應用程序只有一個報表或者只有較少的報表要輸出時 應設置AutoUnload屬性為True 如果應用程序一次要輸出多個報表 那麼要應設置AutoUnload屬性為False

InitialValues屬性 這是一個字元串類型的屬性 它是說明報表文件中使用的變數 每一條說明一個變數 如

ReportVAR := Value;

要詳細了解創建和使用報表變數的過程請參看創建報表一節

TReport部件要真正執行報表功能以輸出一個報表需要調用Run方法 如下所示

Report Run;

TReport部件所具有的重要方法如表 所示

表 TReport部件的方法

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

方法 功 能

────────────────────────────

Run 執行報表功能 輸出報表

RunMacro 發送一個宏命令給Reportimith工具

Connect 預先連接報表文件和資料庫 在輸出報表時不需要登錄到資料庫

SetVariable 改變說明的報表變數

ReCalcReport 當報表變數改變以後 重新輸出報表

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

還有一些其他的數據訪問部件如TBatchMove部件 它主要用在兩個資料庫表之間移動或拷貝帆數據記錄 具體的使用請參看本地SQL伺服器的使用

應用舉例 多個窗體顯示同一個資料庫表

在應用當中 我們常常需要以不同的視圖顯示同一個資料庫表中的內容 例如要在兩窗體中同時顯示一個資料庫表中一個記錄的不同欄位時 我們必須要想辦法使兩個窗體中的數據瀏覽部件同步地顯示資料庫表中的同一條記錄的不同欄位的值 要想做到以不同的視圖顯示同一個資料庫表中的記錄 下面兩條規則是很重要的

● 多個TDataSource部件能夠同時訪問同一個數據集部件

● 在多個窗體中顯示同一個表時 必須為每個窗體設置一個TDataSource部件 只須為其中的一個窗體設置一個TTable部件

例如 如果想在窗體Form 和Form 中同時顯示一個資料庫表的記錄 最簡單可行的辦法是 為Form 和Form 各設置一個TDataSource部件叫DataSource DataSource 並在Form 中設置一個TTable部件Table 連接Form 中的Datasource 和Table 在程序運行過程中設置Form 中的DataSource 的DataSet屬性為Form 中的Table 代碼如下

Format DataSource Dataset := Form Table ;

這樣 當Table 被打開時 兩個窗體中便可以同步地顯示資料庫表中的同一條記錄了

一個名叫OForms DPR的例子在C:DelphiDEMosDBTwoForms中(如果Delphi安裝在其它的磁碟驅動器中 從相應的磁碟驅動器中可以找到該例子) 它演示了在兩個窗體中顯示同一個資料庫表的記錄 應用程序在第一個窗體中打開Contry DB表 並在窗體中顯示Name Captial和Continent欄位 在第二個窗體中顯示Area和Population欄位 在第一個窗體中有一個按鈕用於打開第二個窗體 兩個窗體中都有TDBNavigator部件 用於記錄的導航

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25156

⑸ DELPHI基礎教程:開發Delphi對象式數據管理功能(五)[4]

BLOB欄位與文本

Delphi BLOB欄位中增加了大型文本的處理能力 可以在TBlobField和Strings中自由地交換數據

procere TBlobField LoadFromStrings(Strings: TStrings)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmWrite)

try

Strings SaveToStream(BlobStream)

finally

BlobStream Free;

end;

end;

procere TBlobField SaveToStrings(Strings: TStrings)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmRead)

try

Strings LoadFromStream(BlobStream)

finally

BlobStream Free;

end;

end;

BLOB欄位與Stream對象

因為Delphi中 BLOB欄位是通過BLOB流來訪問的 所以可以很容易地在BLOB欄位和Stream對象之間傳遞數據 為此 TBlobField對象提供了LoadFromStream和SaveToStream方法

procere TBlobField LoadFromStream(Stream: TStream)

var

伏姿旅BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmWrite)

try

BlobStream CopyFrom(Stream )

finally

BlobStream Free;

end;

end;

procere TBlobField SaveToStream(Stream: TStream)

var

BlobStream: TBlobStream;

begin

BlobStream := TBlobStream Create(Self bmRead)

try

Stream CopyFrom(BlobStream )

finally

BlobStream Free;

end;

end;

存取嵌入在OleContainer對象中的OLE伺服器的數據

對象鏈接和嵌入(Object Linking and Embedding 簡稱OLE) 是一組服務功能 它提供了一種用來源於不同應用程序的信缺凳息創建復合文檔的強有力方法

通過把圖像 圖形 表格 聲音 註解 文件和其它表示手段描述成對象 用它能在不同軟體廠家提供的應用程序中更為容易地交換合成和處理數據它是應用程序的集成更為容易 OLE 支持直觀編輯 用戶不需切換到不同窗口就能在文檔中直接對對象進行操作 改進了操作環境 用戶不用再關注應用程序和操作環境 只需關注於使用對象技術的數據和文件 便能完成全部工作

OLE已成為操作系統功能上的一大標准 各大軟商紛紛在開發工具中支持OLE 規范 Delphi 提供了OleContainer對象支持OLE窗戶應用程序的開發

盡管通過OLE可以用來源於不同應用程序的信息創建復合文檔 充分體現以任務 以文檔為中心的思想 但是很難分解來自其它應用程序中的嵌入數據 以進行特殊的處理

例如 一套多媒體電子文檔管理系統 系統需要資料庫管理功能文檔編輯功能 全文檢索功能等 在文檔編輯功能的實現上 如果能利用中文Word 或寫字板之類的強大的編輯排版功能 就可以省卻重新開發一個文檔編輯的費用 使用具有直觀編輯的OLE復合文檔嵌入Word的DOC數據或RTF數據當然是最佳的選擇冊賣 但問題在於全文檢索系統要求能直接在文檔中搜索關鍵字 因此要求將文檔數據從OLE嵌入數據或文檔中的本地數據中分離出來

Delphi 的OleContainer部件支持存儲OLE對象數據 OLE對象數據包括兩部分 OLE類描述信息和OLE伺服器嵌入數據 一般說來 OLE伺服器嵌入數據是以伺服器支持的數據格式存儲的 比方說 中文Word 的嵌入數據的格式就是Word 文檔的格式 因此 要將文檔數據從OLE 嵌入式文檔中分離出來就是要訪問第二部分數據

我們分析了Delphi 的OleContainer對象存取復合文檔的程序 得到分離數據的方法

讓我們來看一段OleContainer對象存儲數據的程序

procere TOleContainer SaveToStream(Stream: TStream)

var

DataHandle: HGlobal;

Buffer: Pointer;

Header: TStreamHeader;

R: TRect;

……

begin

……

try

……

if FOldStreamFormat then

begin

R := BoundsRect;

Header PartRect Left := R Left;

Header PartRect Top := R Top;

Header PartRect Right := R Right;

Header PartRect Bottom := R Bottom;

end else

begin

Header Signature := StreamSignature;

Header DrawAspect := FDrawAspect;

end;

Header DataSize := GlobalSize(DataHandle)

Stream WriteBuffer(Header SizeOf(Header))

Buffer := GlobalLock(DataHandle)

try

Stream WriteBuffer(Buffer^ Header DataSize)

finally

GlobalUnlock(DataHandle)

end;

finally

ReleaseObject(TempStorage)

ReleaseObject(TempLockBytes)

end;

end;

程序中 OleContainer對象執行了兩次往流中寫數據的操作

Stream WriteBuffer(Header Size(Header))

Stream WriteBuffer(Buffer^ Header DataSize)

前一語句是寫入OLE類描述信息 後一句語句是寫入OLE伺服器的嵌入數據 Header是TStreamHeader記錄類型的變數 TStreamHeader記錄的定義如下

TStreamHeader = record

case Integer of

: ( { 新版OLE對象 }

Signature: Integer;

DrawAspect: Integer;

DataSize: Integer)

: ( { 舊版OLE對象 }

PartRect: TSmallRect)

end;

因此讀OLE伺服器嵌入數據時 要跳過文件頭的TStreamHeader記錄 下面就是如何分離OLE伺服器嵌入數據的程序

var

Stream : TMemoryStream;

FileStream : TFileStream;

begin

Stream := TMemoryStream Create;

FileStream := TFileStream Create( TEST DOC fmCreate) ;

with OleContainer do

if (State <> osEmpty) then

SaveToStream(Stream)

Stream Seek(Sizeof(TStreamHeader) )

FileStream CopyFrom(Stream Stream Size SizeOf(TStreamHeader))

Stream Free;

FileStream Free;

end;

OleContainer 包含的伺服器對象是中文Word 程序中將分離出的數據存儲在磁碟文件 TEST DOC 上 如果希望存儲在不同的媒介上 可以使用相應的Stream對象 分離的方法類似 但是 這種方法並非對所有的OLE伺服器數據都適用 如Windows 附件中的寫字板(WordPad)就不行

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25091

⑹ 求delphi 入門教程 或者 視頻

幫你找了幾個,激宏看看吧,下載的則鉛悔時候要是不能直接下,就用迅雷等下載

洪恩編程之道 delphi7-視頻教程
http://znccw.com/Article/pc/biancheng/200703/2267.html
Delphi 2005 視頻教程 設計師版
http://znccw.com/Article/pc/biancheng/200703/2266.html
Delphi經典編程入門 電子書
http://znccw.com/Article/pc/biancheng/200703/2240.html
《Delphi7從入門到精通》中文版 電子書
http://znccw.com/Article/pc/biancheng/200703/2239.html
delphi7.0視頻教程 視頻教孫正程
http://znccw.com/Article/pc/biancheng/200703/2237.html
Delphi編程入門篇視頻教程 編程之道
http://znccw.com/Article/pc/shujuku/200703/2233.html
DELPHI程序設計視頻教程 中山大學
http://znccw.com/Article/pc/biancheng/200703/2235.html

⑺ DELPHI基礎教程:開發Delphi對象式數據管理功能(二)[4]

Truncate方法

該方法是通過調用BDE API函數實現的 其實現如下

procere TBlobStream Truncate;

begin

if FOpened then

begin

Check(DbiTruncateBlob(FDataSet Handle FRecord FFieldNo FPosition))

FModified := True;

end;

end;

該方法從BLOB流的當前位置起刪除所有數據 並設置修改漏乎標志FModified為True 在Delphi VCL中許多部件特別是資料庫應用方面的部件都用BDE API函數完成對資料庫的訪問 如Data Access和Data Control部件 各種資料庫部件都是BDE API函數外層的包裝簡化了對資料庫的訪問操作 BDE API中還提供了避開BDE配置工具在程序中直接處理Alias(建立 修改 刪除等)的函數支持 這也是部件所沒有提供的 在Delphi資料庫應用安裝程序中 這些Alias操作函數無疑是相當重要的 有關BDE API函數的詳細介紹 可閱讀Delphi Client/Server Suite所帶的BDE API 幫助文件

讀寫對象的實現原理和應用

讀寫對象(Filer)包括TFiler對象 TReader對象和riter對象 TFiler對象是文件讀寫的基礎對象 在應用程序中使用的主要是TReader和riter TReader和riter對象都直接從TFiler對象繼承 TFiler對象定義了Filer對象的基本屬性和方法

Filer對象主要完成兩大功能

● 存取窗體文件和窗體文件中的部件

● 提供數據緩沖 加快數據讀寫操作

TFiler對象

TFiler對象是TReader和riter的抽象類 定義了用於部件存儲的基本屬性和方法 它定義了Root屬性 Root指明了所讀或寫的部件的根對象 它的Create方法將Stream對象作為傳入參數以建立與Stream對象的聯系 Filer對象的具體讀寫操作都是由Stream對象完成 因此 只要是Stream對象所能訪問的媒介都能由Filer對象存取部件 TFiler 對象還提供了兩個定義屬性的方法悶孫 DefineProperty和DefineBinaryProperty 這兩個方法使對象能讀寫不在部件published部分定義的屬性

因為Filer對象主要用於存取Delphi的窗體文件和窗體文件中的部件 所以要清楚地理解Filer對象就要清楚Delphi 窗體文件(DFM文件)的結構

DFM文件是用於Delphi存儲窗體的 窗體是Delphi可視化程序設計的核心 窗體對應Delphi應用程序中的窗口 窗體中的可視部件對應窗口中的界面元素 非可視部件如TTable和TOpenDialog 對應Delphi應用程序的某項功能 Delphi應用程序的設計實際上是以窗體的設計為中心 因此 DFM文件在Delphi應用設計中也占很重要的位置 窗體中的所有元素包括窗體自身的屬性都包含在DFM文件中

在Delphi應用程序窗口 界面元素是按擁有關系相互聯系的 因此樹狀結構是最自然的表達形式 相應地 窗體中的部件也是按樹狀結構組織 對應在DFM文件中 也要表達這種關系 DFM文件在物理上 是以二進制方式存儲的 在邏輯上則是以樹狀結構安排各部件的關系 Delphi編輯窗口支持以文本方式顯示DFM文件 從該文本中可螞搜鏈以看清窗體的樹狀結構 下面是DFM文件的文本顯示

Object Form : TForm

Left =

Top =

ActiveControl = DBIMage

Object Panell: TPanel

Left =

Object DBLabel : TDBText

end

Object DBImage : TDBImage

end

end

Object Panel : TPanel

Left =

Object Label : TLable

end

end

Object Panel : TPanel

Left =

Object DBLabel : TDBText

end

end

end

關於DFM文件中存儲屬性值的規則 請參見自定義部件開發這一章

對照TFiler對象的屬性 Root屬性就表示部件樹的根──窗體 Filer對象的許多方法都是讀從根起始的樹中所有的部件 Ancestor屬性表示根的祖先對象 IgnoreChildren屬性則是讀部件時忽略根的子結點

下面介紹Filer對象的屬性和方法

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25103

⑻ DELPHI基礎教程:SQL編程(一)[4]

利用參數編輯器(Parameter Editor)來為參數賦值

具體方法是 選中TQuery部件 單擊滑鼠右鍵 然後從中選擇Define Parameters 便可以打開參數編輯器

例如 在TQuery部件的SQL屬性中我們設置如下的SQL語句

Setect * From Customer Where CustNO=:Number;

TQuery的DatabaseName屬性為DBDEMOS 其中Number為參數變數 我們便可以為參數Number賦值 在Datetype組合框中選擇該參數的數據類型為整數Integer 在Value編輯框中可以為參數Number賦一個值 也可以單擊Null Value檢查框為參數Number賦一個空值Null 給參數賦值之後 單擊OK按鈕 這樣TQuery部件中的SQL 查詢便准備好了 而且參數值也被賦給了動態SQL語句中相應的參數 此時當把TQuery 部件的Active屬性設置成True時 在與TQuery部件相連的數據瀏覽部件中會顯示出查詢結果 通過參數編輯器為參數賦值 這種方式缺乏應有的靈活性 在實際應用中用得較少 在實際應用中程序設計人員希望用更靈活方便的方式為參數賦值 那就是我們接下來要介紹的另一種途徑

在運行過程中 通過程序為參數賦值

用這種方式為參數賦值有三種方法

①根據參數在SQL語句中出現的順序 設置TQuery部件的Params屬性值為參數賦值

②直接根據SQL語句中各參數的名字 調用ParamByName方法來為各參數賦值

③將TQuery部仔銀遲件的DataSource屬性設置為另一個數據源 這樣將另一個數據源中與當前TQuery部件的SQL語句中的參數名相匹配的欄位值賦給其對應的參數

這三種方法我們將在下面的三小節中具體地介紹

使用Params屬性為參數賦值

TQuery部件具有一個Params屬性 它們在設計時不可用 在程序運行過程中可用 並且是動態建立的 當為TQuery部件編寫動態SQL 語句時 Delphi 會自動地建立一個數組Params 數組Params是以 下標開始的 依次對應動態SQL 語句中的參數 也就是說動態SQL語句中第一個參數對應Params[ ] 第二個參數對應params[ ] 依此類推

例如 一個TQuery部件Query 我們為它編寫的動態SQL語句是

Insert Into Customer(CustNo Name Country)

Values(念李 CustNo :Name : Country)

對於上述這條動態SQL語句中的參數 我們可以利用TQuery部件的params 屬性為參數賦值

Query params[ ] AsString := ;

Query params[ ] AsString := Lichtenstein ;

Query params[ ] AsString := USA ;

上述語句將把 賦給參數 Cuse_No Lichtenstein 賦給參數 Name USA 賦給參數 Country

使用ParamByName方法為參數賦值

ParamByName是一個函數 用動態SQL語句中的參數作為調用ParamByName函數的參數 這樣便可以為它們賦值 使用這種賦值方法 必須要知道動態SQL語句參數的名字

例如在 節中的例子中 也可以用下述方法給參數賦值

Query ParamByName( CustNo ) AsString := ;

Query ParamByName( Name ) AsString := Lichtenstein ;

Query ParamByName( Country ) AsString := USA ;

使用這種方法同樣可以為各參數賦值 而且更加直觀一些

使用Datasource屬性為參數賦值

上述兩種方法的共同特點是 我們在為各參數賦值時 我們是知道各參數對應的具體參數值的 而在具體的應用程序中 有些參數值常常是無法確定的 例如參數值來自於另搏宴一個查詢結果 對於這種情況 Delphi提供了使用Datasource屬性為動態SQL 語句中尚存在沒有賦值的參數時 Delphi 會自動檢查 TQuery 部件的 Datasource 屬性 如果為Datasource屬性設置了屬性值(該屬性的值是另一個TDatasource部件的名字) Delphi 會把沒有賦值的參數與TDatasource部件中的各欄位比較 Delphi 會將相應的欄位值賦給與其相匹配的參數 利用這種方法也能實現所謂的連接查詢 我們在學習使用TTable部件時 便會創建主要 明細型資料庫應用 用TQuery部件創建的連接查詢與主要 明細型應用是相似的

例如 在如圖 所示的應用中 設置了下列部件

● 一個TTable部件

名字為Cust 它的DatabaseName屬性為DEMOS TableName屬性為Customer

● 一個TDatasource部件

名字為Custsource 其Dataset屬性被設置為Cust

● 一個TQuery部件

名字為ORDERS 其DatabaseName被設置為DEMOS SQL屬性值為

Select Orders CustNo Orders OrderNo Orders SaleDate FROM Orders

WHERE Orders CustNo =: CustNo

ORDERS的DataSouce屬性被設置為CustSource

● 一個TDatasource部件

名字為OrderSource 其DataSet屬性被設置為Orders

● 兩個TDBGrid部件

它們分別連接CustSource和OrderSource

TQuery部件Orders中的動態SQL語句中的參數 CustNo在程序設計過程中沒有給它賦值 當該應用程序運行時Delphi會自動地到其Datasource屬性中說明的數據源CustSource中查找與參數 CustNo匹配的欄位 而CustSource中正好有一個名字為 CustNo 的欄位與參數 CustNo匹配 這樣Customer表中的CustNo欄位值被賦給了參數 : CustNo 而當每移動Customer表中的記錄指針 參數 CustNo的值會隨之改變 而參數 CustNo的值發生改變時 Orders中的動態SQL語句會根據新的參數值重新查詢 從資料庫表中獲取相應的訂單數據 這樣也變實現了類似於主要 明細型應用 即連接查詢

Prepare方法的使用

在使用動態SQL語句編程時 常常用到一個很重要的方法prepare 調用prepare 方法之後 Delphi會將帶參數的SQL語句傳送給與其對應的資料庫引擎 對動態SQL語句進行語法分析和優化 雖然在用動態SQL語句編程時 調用prepare方法並不是必須的 但是這里我們要極力推薦調用prepare方法 因為調用prepare方法後 會大大提高動態SQL 語句的執行性能 特別是當要反復多次執行同一條動態SQL語句時 其優越性會更加明顯 如果在應用程序中執行一條SQL語句之前並沒有顯式地調用prepare方法 每次在執行SQL 語句時 Delphi會隱含地調用propare方法以准備這個查詢

TQuery部件還有一個prepare屬性 這是一個布爾型屬性 當其屬性值為True時 表明該查詢已被准備好了( SQL 語句已被傳送到資料庫引擎中 ) 當我們使用參數編輯器Parameters Editor來為動態SQL語句中的參數賦值時 當設置完相應的參數值並退出參數編輯器時 Delphi會隱含地調用prepare方法以准備好查詢

當SQL語句執行完之後 要想准備下一個查詢 首先必須調用close方法 然後才能調用prepare方法准備下一個查詢 一般來說 在一個應用程序中應該調用一次prepare方法 常常在窗體的OnCreate事件處理過程中調用prepare方法 然後用上述介紹的方法為參數賦值 最後調用Open方法或ExecSQL方法執行SQL語句 以完成查詢

當然在調用prepare方法准備好一個查詢時 會消耗一些資料庫資源 因而每當一個查詢執行完畢之後 要養成調用Unprepare方法以撤消查詢的好習慣 在運行程序過程中 通過程序改變TQuery部件的SQL屬性值時 Delphi會自動地調用Close方法和Unprepare 方法 以撤消查詢

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25147

⑼ DELPHI基礎教程:Delphi開發資料庫應用程序概述(二)[4]

Sybase和MicroSoft SQL Server資料庫

在建立Sybase或MicroSorft SQL Server的SQL Link時除了需要下列文件外 應用程序還需要Sybase資料庫管理系統的客戶端的連接產品與網路協議介面

表 建立Sybase資料庫的SQL Link所需的文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

文件名 描 述

───────────────────────────

SQLD_SS DLL BDE SQL Link for Sybase的驅動程序

SQLD_SS HLP 聯機幫助文件

SQL_SS CNF Sybase驅動程序的BDE配置文件

W DBLIB DLL Sybase/MC SQL Server客戶端的DLL文件

DBNMP DLL Sybase/MC SQL Server客戶端的DLL文件

SYDC LD Sybase語言驅動程序

SYDC LD Sybase語言驅動程序

━━━━━━━━━━━━━━━━━━━━━━━━━━━

Informix資料庫

在建立Informix的SQL Link時除了需要下列侍慶中文件外 應用程序還需要Informix資料庫管理系統的客戶端的連接產品與網路協議介面

表 建立Informix 資料庫的SQL Link所需的文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

文件名 描 述

───────────────────────────

SQLD_ss DLL BDE SQL Link for Informix的驅動程序

SQLD_INF HLP 聯機幫助文件

SQL_INF CNF Informix驅動程序的BDE配置文件

LDLLSQLW DLL Informix客戶端的DLL文件

ISAM IEM Informix錯誤信息文件

OS IEM Informix錯誤信息文件

RDS IEM Informix錯誤信息文件

SECURITY IEM Informix錯誤信息文件

SQL IEM Informix錯誤信息文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

InterBase 資料庫

在建立InterBase的SQL Link時除了需要下列文件外 應用程序還需要InterBase資料庫管理系老山統的客戶端的連接產品與網路協議介面

表 建立InterBase資料庫的SQL Link所需的文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

文件名 描 述

───────────────────────────

SQLD_IB DLL BDE SQL Link for InterBase的驅動程序

差哪SQLD_IB HLP 聯機幫助文件

SQL_IB CNF InterBase驅動程序的BDE配置文件

CONNECT EXE InterBase連接測試診斷工具

CONNECT HLP InterBase連接測試診斷工具的幫助文件

GDS DLL InterBase API DLL

REMOTE DLL InterBase與網路的介面的DLL文件

INTERBASE MSG InterBase錯誤信息文件

━━━━━━━━━━━━━━━━━━━━━━━━━━━

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25179

⑽ DELPHI基礎教程:Delphi圖形圖像編程(一)[3]

響應滑鼠事件

滑鼠常被用作繪圖的工具 應用程序利用滑鼠位置的變化來繪制各種不同的圖形 滑鼠有三個動作 滑鼠按鈕按下 滑鼠移動 滑鼠按鈕彈起 在Delphi中 對應三個動作有三個不同的事件 OnMouseDown OnMouseMove OnMouseUp

當Dlephi應用程序探測到一個滑鼠動枝慧作時 它傳遞五個參數 並調用相應的事件響應

程序員可利用這些參數來定義事件程序 五個參數如下表 :

表 滑鼠事件的五個參數

━━━━━猛顫答━━━━━━━━━━━━━━━━━━━━━━

參數 含義

──────────────────────────

Sender 探測滑鼠動作的對象

Button 涉及的滑鼠按鈕 左鍵 中鍵 右鍵

Shift 滑鼠動作時 Alt Ctrl Shift按鈕的狀態

X Y 事件發生時滑鼠的坐標

━━━━━━━━━━━━━━━━━━━━━━━━━━━

當滑鼠按下時發生OnMouseDown事件 舉一個簡單例子來說明程序如何對該事洞磨件進

行響應 假如我們想在滑鼠按下的地方出現 Here

響應滑鼠的OnMouseDown事件

可在該事件中調用TextOut方法

procere TForm FormMouseDown(Sender: TObject Button: TMouseButton;

Shift : TShifState; X Y : Integer)

begin

Canvas TextOut(X Y Here! )

end;

用戶放鬆滑鼠鍵時發生OnMouseUp事件 該事件發生時 滑鼠到達的對象並不一定是滑鼠鍵按下時滑鼠所在的對象 例如 用戶可在窗體之外畫一條線段 (滑鼠在窗體外 線段在窗體內) 下面的代碼可用滑鼠繪制直線

procere TForm FormMouseDown(Sender:TObject)

begin

Moveto(x y)

end;

procere TForm FormMouse Up(Sender:Tobject)

begin

Lineto(X Y)

end;

返回目錄 DELPHI基礎教程

編輯推薦

Java程序設計培訓視頻教程

J EE高級框架實戰培訓視頻教程

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

ORACLE G資料庫開發優化指南

Java程序性能優化 讓你的Java程序更快 更穩定

C嵌入式編程設計模式

Android游戲開發實踐指南

lishixin/Article/program/Delphi/201311/25249

熱點內容
紫藍魁牡丹 發布:2025-07-31 17:10:57 瀏覽:393
大盆的盆栽 發布:2025-07-31 17:08:33 瀏覽:998
荷花油畫家 發布:2025-07-31 17:07:33 瀏覽:678
畫櫻花顏料 發布:2025-07-31 16:52:36 瀏覽:303
淄博星辰花藝 發布:2025-07-31 16:50:06 瀏覽:98
麥飯石與蘭花 發布:2025-07-31 16:49:58 瀏覽:639
日本盆栽理念 發布:2025-07-31 16:35:13 瀏覽:184
g鶴望蘭花語 發布:2025-07-31 16:27:55 瀏覽:142
唯伊花藝店 發布:2025-07-31 16:27:04 瀏覽:39
百旺花卉 發布:2025-07-31 16:16:16 瀏覽:987