知识大全 开发Delphi对象式数据管理功能(五)[3]
Posted 媒体
篇首语:曾无好事来相访,赖尔高文一起予。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 开发Delphi对象式数据管理功能(五)[3]相关的知识,希望对你有一定的参考价值。
DELPHI基础教程:开发Delphi对象式数据管理功能(五)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
procedure TMainForm FileOpen(Sender: TObject)
begin
if OpenDialog Execute then
begin
DesignWin := TMDIChild Create(Application)
ReadComponentResFile(OpenDialog FileName DesignWin)
DesignWin Init;
FileName := OpenDialog FileName;
DesignWin Caption := FFileName;
end;
end;
DesignWin是在TMainForm中定义的TMDIChild类型的窗体部件 是卡片设计平台 FFileName是私有变量 用来保存当前编辑的卡片文件名 DesignWin的Init方法实现如下
procedure TMDIChild Init;
var
I: Integer;
Ctrl: TControl;
begin
BackGround BringToFront;
with BackGround do
for I:= to ControlCount do
if Controls[I] Name <> then
ObjectIns ObjectList Items AddObject(Controls[I] Name Controls[I])
end;
BackGround是TPanel类型的部件 所有的动态创建对象都插入到BackGround中 所以 后面调用BackGround InsertControl(Ctrl) ObjectIns是个仿Delphi 的媒体属性编辑器
动态DFM文件的存储过程是这样的
procedure TMainForm FileSave(Sender: TObject)
begin
if DesignWin CurControl <> nil then
DesignWin CurControl Enabled := True;
WriteComponentResFile(FFilename DesignWin)
DesignWin Caption := FileName;
end;
end;
因为在DesignWin的Init方法中调用了InsertControl方法 所以在关闭DesignWin窗口时要相应地调用RemoveControl 否则在关闭DesignWin窗口时会产生内存错误
procedure TMDIChild FormCloseQuery(Sender: TObject; var CanClose: Boolean)
var
I: Integer;
Ctrl: TControl;
Removed: Boolean;
begin
if Modified = True then
if MessageDlg( Close the form? mtConfirmation
[mbOk mbCancel] ) = mrCancel then
CanClose := False;
if CanClose = True then
begin
repeat
removed := False;
I := ;
repeat
if BackGround Controls[I] Name <> then
begin
BackGround RemoveControl(BackGround Controls[I])
Removed := True;
end;
I := I +
until (I >= BackGround ControlCount) or (Removed = True)
until (Removed = False)
SendMessage(ObjectIns Handle WM_MDICHILDCLOSED )
end;
end;
动态DFM文件应用之二 超媒体系统脚本语言设计
超媒体脚本语言设计是超媒体系统设计的重要内容 脚本语言必须能够表达卡片中的多种媒体对象 必须是可编程 可理解的 必须是可执行的 应该可以由脚本语言生成超媒体系统中的卡片和链
DFM文件可以看作是超媒体系统的卡片 DFM脚本能够表达DFM文件中的多种控制 也就是说能够表达卡片中的多种媒体对象 再加上DFM脚本的对象式表达 可编辑性 可转换为DFM文件 因此用作超媒体系统脚本语言较好的形式
ObjectBinaryToText和ObjectTextToBinary过程提供了在部件和DFM脚本之间相互转化的功能 ObjectResourceToText和ObjectTextToResoure过程提供了DFM文件和DFM脚本之间相互转化的功能 这样就可以在应用程序中自如实现超媒体卡片和超媒体脚本语言相互转化
下面是卡片和脚本语言相互转化的程序
procedure TMDIChild CardToScript;
var
In Out: TStream;
begin
In := TMemoryStream Create;
Out := TMemoryStream Create;
try
In WriteComponentRes(Self ClassName Self)
ObjectResourceToText(In out)
ScriptForm ScriptEdit Lines LoadFromStream(Out)
finally
In Free;
Out Free;
end;
end;
ScriptEdit是个文本编辑器 它的Lines属性是TStrings类型的对象
procedure TScriptForm ScriptToCard;
var
In Out: TStream;
begin
In := TMemoryStream Create;
Out := TMemoryStream Create;
try
ScriptForm ScriptEdit Lines SaveToFromStream(In)
ObjectTextToResource(In out)
In ReadComponentRes(DesignWin)
finally
In Free;
Out Free;
end;
end;
这两段程序是对整个卡片 即窗体级 进行转换的 ObjectBinaryToText和ObjectTextToBinary过程可以细化到部件级的转换 因此超媒体脚本语言的编辑可以细化到媒体对象级
超媒体编辑和表现系统与动态DFM文件的扩展
超媒体系统的媒体编辑与卡片管理有其特殊的需求 比如链接需求 这时采用已有的窗体部件和媒体部件并按常规的DFM文件处理就显得力不从心了 解决这个矛盾有两套方案
● 利用Delphi部件开发技术 继承和开发新的部件增加新的超媒体特有的属性和处理方法
● 扩展DFM文件结构 使之能按自己的需要任意地存取和转换部件和DFM文件
前者是充分利用Delphi的面向对象部件开发技术 在存取和转换等处理上仍旧与常规DFM文件相同 而后者需要DFM的存取和转换上作比较大的改动 下文介绍扩展DFM文件的思路
扩展动态DFM文件的总体思路是降低处理操作的数据的颗粒度 即从原先窗体级降低到部件级
下面是存取操作的扩展示范
var
FileStream: TStream;
I: Integer;
begin
FileStream := TFileStream Create( OverView Crd fmOpenWrite)
With riter Create(FileStream ) do
try
for I := to DesignWin ControlCount 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 ) 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事件的处理过程来实现
实现脚本语言扩展的基本方法与存取扩展类似 但它还要加扩展媒体信息转换为文本 并插入到部件的脚本描述中
数据库BLOB字段应用
Delphi VCL提供了TBlobStream对象支持对数据库BLOB字段的存取 Delphi 的TBlobStream对象的作用在于一方面可以使Delphi应用程序充分利用多媒体数据库的数据管理能力 另一方面又能利用Delphi Object Pascal的程序设计能力给关系型多媒体数据库提供底层控制能力和全方位的功能扩展余地
TBlobStream的使用
TBlobStream对象用一个TBlobField类型的对象作为参数来创建与BLOB字段相联的BLOB流 接着就可用流的存取方法在BLOB字段中存取数据
var
BlobStream: TBlobStream;
I: Integer;
begin
BlobStream := TBlobStream Create(TBlobField(CardTable Fields[ ] bmWrite)
With riter Create(BlobStream ) do
try
for I := to DesignWin ControlCount do
begin
WriteInteger(MMID[i])
WriteRootComponent(DesignWin Controls[i])
写相应媒体扩展信息
……
end;
WriteListEnd;
finally
Free;
end;
BlobStream Free;
CardTable Post;
end;
Fields变量是表示数据库记录的字段数组 Fields[ ]正是数据库的BLOB 字段 CardTable的Post方法将数据库的修改反馈到数据库的物理存储上
上面这段程序是超媒体卡片存储的部分源程序 我们就是将卡片保存在数据库BLOB字段中 实现将超文本和关系数据库两种数据管理方式结合起来 读卡片的程序如下
var
PropInfo: PPropInfo;
Method: TMethod;
Blobtream: TStream;
I: Integer;
begin
BlobStream := TBlobStream Create(TBlobField(CardTable Fields[ ]) bmRead)
With TReader Create(BlobStream ) 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;
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 := ;
Header HType := $ ;
Header Size := ;
BlobStream Write(Header SizeOf(Header))
Bitmap SaveToStream(BlobStream)
Header Size := BlobStream Position SizeOf(Header)
BlobStream Position := ;
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 <> ) or (Header HType <> $ ) or
(Header Size <> Size SizeOf(Header)) then
BlobStream Position := ;
end;
Bitmap LoadFromStream(BlobStream)
finally
BlobStream Free;
end;
end;
程序中按两种方式存取数据 对于位图数据 数据的起点是流的Potition为 处 对于图形或其它类型的Blob数据 则以流的Position为SizeOf(Header) + 处开始 即多了个头信息
cha138/Article/program/Delphi/201311/25090相关参考
DELPHI基础教程:开发Delphi对象式数据管理功能(五)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(五)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
开发Delphi对象式数据管理功能(五) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(三)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(四)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[5] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快