黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證
華為認證 | Java認證
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格
報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業資格 | 廣告師職業水平
駕駛員 | 網絡編輯
衛生資格 | 執業醫師 | 執業藥師 | 執業護士
會計從業資格考試會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師
注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師
質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師
設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師
城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲
您現在的位置: 考試吧(Exam8.com) > 計算機等級考試 > 計算機二級 > Delphi > 復習資料 > 正文

2011等考Delphi:開發Delphi對象式數據管理功能

來源:考試吧Exam8.com) 2010-10-30 9:21:41 考試吧:中國教育培訓第一門戶 模擬考場
在本章中將介紹Stream對象和Filer對象的實現原理、應用方法以及在超媒體系統中的應用。這對于運用Delphi 開發高級應用是很重要的。

  下面是存取操作的擴展示范:

  var

  FileStream: TStream;

  I: Integer;

  begin

  FileStream := TFileStream.Create('OverView.Crd', fmOpenWrite);

  With TWriter.Create(FileStream, 4096) do

  try

  for I := 0 to DesignWin.ControlCount - 1 do

  begin

  WriteInteger(MMID[i]);

  WriteRootComponent(DesignWin.Controls[i]);

  { 寫相應媒體擴展信息 }

  ……

  end;

  WriteListEnd;

  finally.

  Free;

  end;

  FileStream.Free;

  end;

  WriteInteger(MMID[i])語句是寫入媒體標識。

  下面是相應的讀擴展DFM的程序:

  var

  PropInfo: PPropInfo;

  Method : TMethod;

  FileStream: TStream;

  I: Integer;

  begin

  FileStream := TFileStream.Create('OverView.Crd', fmOpenRead);

  With TReader.Create(FileStream, 4096) do

  try

  while not EndOfList do

  begin

  case ReadInteger of

  IDText: begin

  Ctrl := TControl(ReadRootComponent(nil));

  PropInfo := GetPropInfo(Ctrl.ClassInfo, 'OnClick');

  Method.Code:= Self.MethodAddress(MethodName);

  Method.Data := Self;

  if Method.Code <> nil then

  SetMethodProp(Ctrl, PropInfo, Method);

  DesignWin.InsertControl(Ctrl);

  end;

  IDImage:

  ……

  end;

  ……

  WriteListEnd;

  end;

  finally.

  Free;

  end;

  FileStream.Free;

  end;

  SetMethodProp過程是用于重新聯接控制和它的事件處理過程。類似的功能還可以用TReader對象的OnFindMethod事件的處理過程來實現。

  實現腳本語言擴展的基本方法與存取擴展類似,但它還要加擴展媒體信息轉換為文本,并插入到部件的腳本描述中。

  20.3.2 數據庫BLOB字段應用

  Delphi VCL提供了TBlobStream對象支持對數據庫BLOB字段的存取。Delphi 的TBlobStream對象的作用在于一方面可以使Delphi應用程序充分利用多媒體數據庫的數據管理能力。另一方面又能利用Delphi Object Pascal的程序設計能力給關系型多媒體數據庫提供底層控制能力和全方位的功能擴展余地。

  20.3.2.1 TBlobStream的使用

  TBlobStream對象用一個TBlobField類型的對象作為參數來創建與BLOB字段相聯的BLOB流,接著就可用流的存取方法在BLOB字段中存取數據。

  var

  BlobStream: TBlobStream;

  I: Integer;

  begin

  BlobStream := TBlobStream.Create(TBlobField(CardTable.Fields[10], bmWrite);

  With TWriter.Create(BlobStream, 4096) do

  try

  for I := 0 to DesignWin.ControlCount - 1 do

  begin

  WriteInteger(MMID[i]);

  WriteRootComponent(DesignWin.Controls[i]);

  { 寫相應媒體擴展信息 }

  ……

  end;

  WriteListEnd;

  finally.

  Free;

  end;

  BlobStream.Free;

  CardTable.Post;

  end;

  Fields變量是表示數據庫記錄的字段數組,Fields[10]正是數據庫的BLOB 字段。CardTable的Post方法將數據庫的修改反饋到數據庫的物理存儲上。

  上面這段程序是超媒體卡片存儲的部分源程序,我們就是將卡片保存在數據庫BLOB字段中,實現將超文本和關系數據庫兩種數據管理方式結合起來。讀卡片的程序如下:

  var

  PropInfo: PPropInfo;

  Method: TMethod;

  Blobtream: TStream;

  I: Integer;

  begin

  BlobStream := TBlobStream.Create(TBlobField(CardTable.Fields[10]), bmRead);

  With TReader.Create(BlobStream, 4096) do

  try

  while not EndOfList do

  begin

  case ReadInteger of

  IDText: begin

  Ctrl := TControl(ReadRootComponent(nil));

  PropInfo := GetPropInfo(Ctrl.ClassInfo, 'OnClick');

  Method.Code:= Self.MethodAddress(MethodName);

  Method.Data := Self;

  if Method.Code <> nil then

  SetMethodProp(Ctrl, PropInfo, Method);

  DesignWin.InsertControl(Ctrl);

  end;

  IDImage:

  ……

  end;

  ……

  WriteListEnd;

  end;

  finally.

  Free;

  end;

  FileStream.Free;

  end;

  20.3.2.2 BLOB字段與圖形圖像

  在多媒體數據庫中處理得比較多的是圖形圖像,因此早期的多媒體數據庫在擴展關系數據庫時往往是增加一個圖像字段。BLOB字段是以二進制數據存儲方式,因此它完全可以表達圖形圖像數據。

  在TBlobField對象中提供了LoadFromBitMap和SaveToBitMap方法存取位圖數據。它們在實現上都是使用BlobStream對象。

  procedure TBlobField.LoadFromBitmap(Bitmap: TBitmap);

  var

  BlobStream: TBlobStream;

  Header: TGraphicHeader;

  begin

  BlobStream := TBlobStream.Create(Self, bmWrite);

  try

  if (DataType = ftGraphic) or (DataType = ftTypedBinary) then

  begin

  Header.Count := 1;

  Header.HType := $0100;

  Header.Size := 0;

  BlobStream.Write(Header, SizeOf(Header));

  Bitmap.SaveToStream(BlobStream);

  Header.Size := BlobStream.Position - SizeOf(Header);

  BlobStream.Position := 0;

  BlobStream.Write(Header, SizeOf(Header));

  end else

  Bitmap.SaveToStream(BlobStream);

  finally

  BlobStream.Free;

  end;

  end;

  procedure TBlobField.SaveToBitmap(Bitmap: TBitmap);

  var

  BlobStream: TBlobStream;

  Size: Longint;

  Header: TGraphicHeader;

  begin

  BlobStream := TBlobStream.Create(Self, bmRead);

  try

  Size := BlobStream.Size;

  if Size >= SizeOf(TGraphicHeader) then

  begin

  BlobStream.Read(Header, SizeOf(Header));

  if (Header.Count <> 1) or (Header.HType <> $0100) or

  (Header.Size <> Size - SizeOf(Header)) then

  BlobStream.Position := 0;

  end;

  Bitmap.LoadFromStream(BlobStream);

  finally

  BlobStream.Free;

  end;

  end;

  程序中按兩種方式存取數據,對于位圖數據,數據的起點是流的Potition為0處,對于圖形或其它類型的Blob數據,則以流的Position為SizeOf(Header) + 1處開始, 即多了個頭信息。

  20.3.2.3 BLOB字段與文本

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

  procedure TBlobField.LoadFromStrings(Strings: TStrings);

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStream.Create(Self, bmWrite);

  try

  Strings.SaveToStream(BlobStream);

  finally

  BlobStream.Free;

  end;

  end;

  procedure TBlobField.SaveToStrings(Strings: TStrings);

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStream.Create(Self, bmRead);

  try

  Strings.LoadFromStream(BlobStream);

  finally

  BlobStream.Free;

  end;

  end;

  20.3.2.4 BLOB字段與Stream對象

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

  procedure TBlobField.LoadFromStream(Stream: TStream);

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStream.Create(Self, bmWrite);

  try

  BlobStream.CopyFrom(Stream, 0);

  finally

  BlobStream.Free;

  end;

  end;

  procedure TBlobField.SaveToStream(Stream: TStream);

  var

  BlobStream: TBlobStream;

  begin

  BlobStream := TBlobStream.Create(Self, bmRead);

  try

  Stream.CopyFrom(BlobStream, 0);

  finally

  BlobStream.Free;

  end;

  end;

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

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

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

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

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

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

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

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

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

  procedure 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

  0: ( { 新版OLE對象 }

  Signature: Integer;

  DrawAspect: Integer;

  DataSize: Integer);

  1: ( { 舊版OLE對象 }

  PartRect: TSmallRect);

  end;

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

  var

  Stream : TMemoryStream;

  FileStream : TFileStream;

  begin

  Stream := TMemoryStream.Create;

  FileStream := TFileStream.Create('TEST.DOC', fmCreate) ;

  with OleContainer1 do

  if (State <> osEmpty) then

  SaveToStream(Stream);

  Stream.Seek(Sizeof(TStreamHeader), 0);

  FileStream.CopyFrom(Stream, Stream.Size - SizeOf(TStreamHeader));

  Stream.Free;

  FileStream.Free;

  end;

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

上一頁  1 2 3 4 5 6 7 8 9  下一頁
  相關推薦:2010年9月計算機等級考試試題及答案解析專題
       預告:名師解析2010年9月計算機等級考試試題答案
       2010年9月計算機等級考試成績查詢時間及入口
       2010年9月計算機等考成績查詢短信免費提醒開通
文章搜索
版權聲明:如果計算機等級考試網所轉載內容不慎侵犯了您的權益,請與我們聯系800@exam8.com,我們將會及時處理。如轉載本計算機等級考試網內容,請注明出處。
主站蜘蛛池模板: 欧美bbbbxxxx| 亚洲欧美成人综合 | 中国一级淫片bbb | 我色综合 | 欧美一级成人一区二区三区 | 亚洲欧美中日韩中文字幕 | 国产精品特黄毛片 | 日韩欧美视频 | 深夜a级毛片免费视频 | 男人下面疯狂进女人下部视频 | 免费日皮视频 | 日本一区二区在线不卡 | 污免费观看 | 麻豆国内精品欧美在线 | 午夜性爽快免费视频播放 | 波多野结衣中文字幕视频 | 一个人看www在线观看免费视频 | 亚洲欧美日韩综合精品网 | 午夜视频在线免费观看 | 好紧好湿好黄的视频 | 日韩理论视频 | 55夜色66夜色国产亚洲精品区 | 欧美日韩国产高清 | 蜜桃社极品尤物大尺度美女 | 久久亚洲私人国产精品 | 亚洲国产亚洲片在线观看播放 | 在线观看成人小视频 | 12345国产精品高清在线 | 欧美+日本+国产+在线观看 | 麻豆传煤一区免费入 | 手机看片日韩高清国产欧美 | 日韩免费 | 国产成人在线播放视频 | 网址在线观看你懂的 | 日本成人a视频 | 午夜性刺激免费视频观看不卡专区 | 国产免费怡红院视频 | 天天躁天天碰天天看 | 免费搞黄网站 | 亚洲天堂网站在线 | 天堂网中文在线 |