⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 054.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<p>FixupReferences;</font><font face="宋体" lang="ZH-CN"></p><p></font><font face="Arial">finally</font><font face="宋体" lang="ZH-CN"></p><p></font><font face="Arial">EndReferences;</p><p>end;</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p>  </font><font face="Arial">ReadComponents</font><font face="宋体" lang="ZH-CN">首先用</font><fontface="Arial">AOwner</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">AParent</font><fontface="宋体" lang="ZH-CN">参数给</font><font face="Arial">Root,Owner</font><fontface="宋体" lang="ZH-CN">和</font><font face="Arial">Parent</font><font face="宋体"lang="ZH-CN">赋值,用于重建各部件的相互引用。然后用一个</font><fontface="Arial">While</font><font face="宋体" lang="ZH-CN">循环读取部件并用由</font><fontface="Arial">Proc</font><font face="宋体" lang="ZH-CN">传入的方法进行处理。在重建引用关系时,用了</font><fontface="Arial">BeginReferences</font><font face="宋体" lang="ZH-CN">、</font><fontface="Arial">FixUpReferences</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">EndReferences</font><font face="宋体" lang="ZH-CN">嵌套模式。</p><p>  </font><font face="Arial">ReadRootComponent</font><font face="宋体"lang="ZH-CN">方法从</font><font face="Arial">Reader</font><font face="宋体"lang="ZH-CN">对象的流中将部件及其拥有的部件全部读出。如果</font><fontface="Arial">Component</font><font face="宋体" lang="ZH-CN">参数为</font><fontface="Arial">nil</font><font face="宋体" lang="ZH-CN">,则创建一个相同类型的部件,最后返回该部件:</p><p> </p><p></font><font face="Arial">function TReader.ReadRootComponent(Root: TComponent):TComponent;</p><p></font> <font face="Arial"></p><p>function FindUniqueName(const Name: string): string;</p><p>begin</p><p></font><font face="宋体" lang="ZH-CN">…</p><p></font><font face="Arial">end;</p><p> </p><p>var</p><p>I: Integer;</p><p>Flags: TFilerFlags;</p><p>begin</p><p>ReadSignature;</p><p>Result := nil;</p><p>try</p><p>ReadPrefix(Flags, I);</p><p>if Root = nil then</p><p>begin</p><p>Result := TComponentClass(FindClass(ReadStr)).Create(nil);</p><p>Result.Name := ReadStr;</p><p>end else</p><p>begin</p><p>Result := Root;</p><p>ReadStr; { Ignore class name }</p><p>if csDesigning in Result.ComponentState then</p><p>ReadStr else</p><p>Result.Name := FindUniqueName(ReadStr);</p><p>end;</p><p>FRoot := Result;</p><p>if GlobalLoaded &lt;&gt; nil then</p><p>FLoaded := GlobalLoaded else</p><p>FLoaded := TList.Create;</p><p>try</p><p>FLoaded.Add(FRoot);</p><p>FOwner := FRoot;</p><p>Include(FRoot.FComponentState, csLoading);</p><p>Include(FRoot.FComponentState, csReading);</p><p>FRoot.ReadState(Self);</font><font face="宋体" lang="ZH-CN"></p><p></font><font face="Arial">Exclude(FRoot.FComponentState, csReading);</font><fontface="宋体" lang="ZH-CN"></p><p></font><font face="Arial">if GlobalLoaded = nil then</p><p>for I := 0 to FLoaded.Count - 1 do TComponent(FLoaded[I]).Loaded;</p><p>finally</p><p>if GlobalLoaded = nil then FLoaded.Free;</p><p>FLoaded := nil;</p><p>end;</p><p>GlobalFixupReferences;</p><p>except</p><p>RemoveFixupReferences(Root, '');</p><p>if Root = nil then Result.Free;</p><p>raise;</p><p>end;</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p>  </font><font face="Arial">ReadRootComponent</font><font face="宋体"lang="ZH-CN">首先调用</font><font face="Arial">ReadSignature</font><font face="宋体"lang="ZH-CN">读取</font><font face="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象标签。然后在</font><fontface="Arial">try</font><font face="宋体" lang="ZH-CN">…</font><font face="Arial">except</font><fontface="宋体" lang="ZH-CN">循环中执行读取任务。如果</font><font face="Arial">Root</font><fontface="宋体" lang="ZH-CN">参数为</font><font face="Arial">nil</font><fontface="宋体" lang="ZH-CN">,则用</font><font face="Arial">ReadStr</font><fontface="宋体" lang="ZH-CN">读出的类名创建新部件,并以流中读出部件的</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">属性;否则,忽略类名,并判断</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">属性的唯一性。最后用</font><fontface="Arial">Root</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">ReadState</font><fontface="宋体" lang="ZH-CN">方法读取属性和其拥有的拥有并处理引用关系。</p><p>  </font><font face="Arial">7. SetName</font><font face="宋体" lang="ZH-CN">方法和</font><fontface="Arial">OnSetName</font><font face="宋体" lang="ZH-CN">事件</p><p>  因为在</font><font face="Arial">OnSetName</font><font face="宋体"lang="ZH-CN">事件中,</font><font face="Arial">Name</font><font face="宋体"lang="ZH-CN">参数是</font><font face="Arial">var</font><font face="宋体" lang="ZH-CN">型的,所以可以用</font><fontface="Arial">OnSetName</font><font face="宋体" lang="ZH-CN">事件处理过程修改所读部件的名字。而</font><fontface="Arial">OnSetName</font><font face="宋体" lang="ZH-CN">事件处理过程是在</font><fontface="Arial">SetName</font><font face="宋体" lang="ZH-CN">方法中实现的。</p><p> </p><p></font><font face="Arial">procedure TReader.SetName(Component: TComponent; var Name:string);</p><p>begin</p><p>if Assigned(FOnSetName) then FOnSetName(Self, Component, Name);</p><p>Component.Name := Name;</p><p>end;</p><p></font> <font face="Arial"></p><p>SetName</font><font face="宋体" lang="ZH-CN">方法和</font><font face="Arial">OnSetName</font><fontface="宋体" lang="ZH-CN">事件在动态</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件的编程中有很重要的作用。</p><p>  </font><font face="Arial">8. TReader</font><font face="宋体" lang="ZH-CN">的错误处理</p><p>  </font><font face="Arial">TReader</font><font face="宋体" lang="ZH-CN">的错误处理是由</font><fontface="Arial">Error</font><font face="宋体" lang="ZH-CN">方法和</font><fontface="Arial">OnError</font><font face="宋体" lang="ZH-CN">事件的配合使用完成的。</font><fontface="Arial">OnError </font><font face="宋体" lang="ZH-CN">事件处理过程的</font><fontface="Arial">Handled</font><font face="宋体" lang="ZH-CN">参数是</font><fontface="Arial">var</font><font face="宋体" lang="ZH-CN">型的布尔变量,通过将</font><fontface="Arial">Handled</font><font face="宋体" lang="ZH-CN">设为</font><fontface="Arial">True</font><font face="宋体" lang="ZH-CN">或</font><font face="Arial">False</font><fontface="宋体" lang="ZH-CN">可影响</font><font face="Arial">TReader </font><fontface="宋体" lang="ZH-CN">的错误处理。</font><font face="Arial">OnError</font><fontface="宋体" lang="ZH-CN">事件处理过程是在</font><font face="Arial">Error</font><fontface="宋体" lang="ZH-CN">方法中调用的。</p><p> </p><p></font><font face="Arial">function TReader.Error(const Message: string): Boolean;</p><p>begin</p><p>Result := False;</p><p>if Assigned(FOnError) then FOnError(Self, Message, Result);</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p>  </font><font face="Arial">9. FindMethod</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">OnFindMethod</font><font face="宋体" lang="ZH-CN">事件</p><p>  有时,在程序运行期间,给部件的方法指针</font><fontface="Arial">(</font><font face="宋体" lang="ZH-CN">主要是事件处理过程</font><fontface="Arial">)</font><font face="宋体" lang="ZH-CN">动态赋值是很有用的,这样就能动态地改变部件响应事件的方式。在流中读取部件捍做到一点就要利用</font><fontface="Arial">OnFindMehtod</font><font face="宋体" lang="ZH-CN">事件。</font><fontface="Arial">OnFIndMethod</font><font face="宋体" lang="ZH-CN">事件是在</font><fontface="Arial">FindMethod</font><font face="宋体" lang="ZH-CN">方法中被调用的。</p><p> </p><p></font><font face="Arial">function TReader.FindMethod(Root: TComponent;</p><p>const MethodName: string): Pointer;</p><p>var </p><p>Error: Boolean;</p><p>begin</p><p>Result := Root.MethodAddress(MethodName);</p><p>Error := Result = nil;</font><font face="宋体" lang="ZH-CN"></p><p></font><font face="Arial">if Assigned(FOnFindMethod) then FOnFindMethod(Self,MethodName, Result, </p><p>Error);</p><p>if Error then PropValueError;</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p>  </font><font face="Arial">OnFindMethod </font><font face="宋体" lang="ZH-CN">方法除了可以给部件的</font><fontface="Arial">MethodName</font><font face="宋体" lang="ZH-CN">所指定的方法指针动态赋值外,还可修改</font><fontface="Arial">Error</font><font face="宋体" lang="ZH-CN">参数来决定是否处理</font><fontface="Arial">Missing Method</font><font face="宋体" lang="ZH-CN">错误。方法中调用的</font><fontface="Arial">MehtodAddress </font><font face="宋体" lang="ZH-CN">方法定义在</font><fontface="Arial">TObject</font><font face="宋体" lang="ZH-CN">中,它是个很有用的方法,它可以得到对象中定义的</font><fontface="Arial">public</font><font face="宋体" lang="ZH-CN">方法的地址。</font><fontface="Arial">FindMethod</font><font face="宋体" lang="ZH-CN">方法和</font><fontface="Arial">OnFindMethod</font><font face="宋体" lang="ZH-CN">事件在动态</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">的编程中有很重要的作用。</p><p> </p><p> </font><font face="Arial"></p><p>20.3 Delphi</font><font face="宋体" lang="ZH-CN">对象式数据管理应用实例</p><p> </p><p>  </font><font face="Arial">Delphi 2.0</font><font face="宋体" lang="ZH-CN">无论是其可视化设计工具,还是可视化部件类库</font><fontface="Arial">(VCL)</font><font face="宋体" lang="ZH-CN">,都处处渗透了对象存储技术,本节将从</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化设计内部机制、</font><fontface="Arial">VCL</font><font face="宋体" lang="ZH-CN">中的数据存储、</font><fontface="Arial">BLOB</font><font face="宋体" lang="ZH-CN">数据操作和动态生成部件的存储几方面介绍对象存储功能的实例应用。</p><p> </font><font face="Arial"></p><p>20.3.1 Delphi </font><font face="宋体" lang="ZH-CN">动态</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件及部件的存取在超媒体系统中的应用</p><p> </p><p>  </font><font face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">的可视化设计工具是同其部件类库紧密结合在一起的。</p><p>  每个部件只有通过一段注册程序并通过</font><font face="Arial">Delphi</font><fontface="宋体" lang="ZH-CN">的</font><font face="Arial">Install Component</font><fontface="宋体" lang="ZH-CN">功能,才能出现在</font><font face="Arial">ComponentPalette</font><font face="宋体" lang="ZH-CN">上;部件的属性才有可能出现在</font><fontface="Arial">Object Inspector</font><font face="宋体" lang="ZH-CN">窗口中;部件的属性编辑器才能被</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">环境使用。因为这种浑然天成的关系,</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件存取必然得到</font><fontface="Arial">VCL</font><font face="宋体" lang="ZH-CN">在程序上的支持。</p><p>  </font><font face="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件的部件存取是</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化设计环境中文件存取的中心问题。因为</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化设计的核心是窗体的设计。每个窗体对应一个库单元,是应用程序的模块,窗体在磁盘上的存储就是</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件。</p><p>  </font><font face="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件结构我们前面介绍过了。它实际上是存储窗体及其拥有的所有部件的属性。这种拥有关系是递归的。问题在于如何将这些属性数据与程序中的变量</font><fontface="Arial">(</font><font face="宋体" lang="ZH-CN">属性</font><font face="Arial">)</font><fontface="宋体" lang="ZH-CN">代码联系起来。</p><p>  在</font><font face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">中处理这种联系的过程分为两种情况:设计时和运行时。</font><fontface="Arial"></p><p></font><font face="宋体" lang="ZH-CN">在设计时,建立联系表现为读取</font><fontface="Arial">DFM </font><font face="宋体" lang="ZH-CN">文件,建立</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件中的部件及其属性与可视化设计工具

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -