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

📄 054.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<p>begin</p>
<p>ReadSignature;</p>
<p>Component := ReadComponent(nil);</p>
<p>Proc(Component);</p>
<p>end;</p>
<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><font
face="Arial">AOwner</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">AParent</font><font
face="宋体" lang="ZH-CN">参数给</font><font face="Arial">Root,Owner</font><font
face="宋体" lang="ZH-CN">和</font><font face="Arial">Parent</font><font face="宋体"
lang="ZH-CN">赋值,用于重建各部件的相互引用。然后用一个</font><font
face="Arial">While</font><font face="宋体" lang="ZH-CN">循环读取部件并用由</font><font
face="Arial">Proc</font><font face="宋体" lang="ZH-CN">传入的方法进行处理。在重建引用关系时,用了</font><font
face="Arial">BeginReferences</font><font face="宋体" lang="ZH-CN">、</font><font
face="Arial">FixUpReferences</font><font face="宋体" lang="ZH-CN">和</font><font
face="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><font
face="Arial">Component</font><font face="宋体" lang="ZH-CN">参数为</font><font
face="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><font
face="宋体" 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><font
face="Arial">try</font><font face="宋体" lang="ZH-CN">…</font><font face="Arial">except</font><font
face="宋体" lang="ZH-CN">循环中执行读取任务。如果</font><font face="Arial">Root</font><font
face="宋体" lang="ZH-CN">参数为</font><font face="Arial">nil</font><font
face="宋体" lang="ZH-CN">,则用</font><font face="Arial">ReadStr</font><font
face="宋体" lang="ZH-CN">读出的类名创建新部件,并以流中读出部件的</font><font
face="Arial">Name</font><font face="宋体" lang="ZH-CN">属性;否则,忽略类名,并判断</font><font
face="Arial">Name</font><font face="宋体" lang="ZH-CN">属性的唯一性。最后用</font><font
face="Arial">Root</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">ReadState</font><font
face="宋体" lang="ZH-CN">方法读取属性和其拥有的拥有并处理引用关系。</p>
<p>  </font><font face="Arial">7. SetName</font><font face="宋体" lang="ZH-CN">方法和</font><font
face="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><font
face="Arial">OnSetName</font><font face="宋体" lang="ZH-CN">事件处理过程修改所读部件的名字。而</font><font
face="Arial">OnSetName</font><font face="宋体" lang="ZH-CN">事件处理过程是在</font><font
face="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><font
face="宋体" lang="ZH-CN">事件在动态</font><font face="Arial">DFM</font><font
face="宋体" 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><font
face="Arial">Error</font><font face="宋体" lang="ZH-CN">方法和</font><font
face="Arial">OnError</font><font face="宋体" lang="ZH-CN">事件的配合使用完成的。</font><font
face="Arial">OnError </font><font face="宋体" lang="ZH-CN">事件处理过程的</font><font
face="Arial">Handled</font><font face="宋体" lang="ZH-CN">参数是</font><font
face="Arial">var</font><font face="宋体" lang="ZH-CN">型的布尔变量,通过将</font><font
face="Arial">Handled</font><font face="宋体" lang="ZH-CN">设为</font><font
face="Arial">True</font><font face="宋体" lang="ZH-CN">或</font><font face="Arial">False</font><font
face="宋体" lang="ZH-CN">可影响</font><font face="Arial">TReader </font><font
face="宋体" lang="ZH-CN">的错误处理。</font><font face="Arial">OnError</font><font
face="宋体" lang="ZH-CN">事件处理过程是在</font><font face="Arial">Error</font><font
face="宋体" 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><font
face="Arial">OnFindMethod</font><font face="宋体" lang="ZH-CN">事件</p>
<p>  有时,在程序运行期间,给部件的方法指针</font><font
face="Arial">(</font><font face="宋体" lang="ZH-CN">主要是事件处理过程</font><font
face="Arial">)</font><font face="宋体" lang="ZH-CN">动态赋值是很有用的,这样就能动态地改变部件响应事件的方式。在流中读取部件捍做到一点就要利用</font><font
face="Arial">OnFindMehtod</font><font face="宋体" lang="ZH-CN">事件。</font><font
face="Arial">OnFIndMethod</font><font face="宋体" lang="ZH-CN">事件是在</font><font
face="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><font
face="Arial">MethodName</font><font face="宋体" lang="ZH-CN">所指定的方法指针动态赋值外,还可修改</font><font
face="Arial">Error</font><font face="宋体" lang="ZH-CN">参数来决定是否处理</font><font
face="Arial">Missing Method</font><font face="宋体" lang="ZH-CN">错误。方法中调用的</font><font
face="Arial">MehtodAddress </font><font face="宋体" lang="ZH-CN">方法定义在</font><font
face="Arial">TObject</font><font face="宋体" lang="ZH-CN">中,它是个很有用的方法,它可以得到对象中定义的</font><font
face="Arial">public</font><font face="宋体" lang="ZH-CN">方法的地址。</font><font
face="Arial">FindMethod</font><font face="宋体" lang="ZH-CN">方法和</font><font
face="Arial">OnFindMethod</font><font face="宋体" lang="ZH-CN">事件在动态</font><font
face="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><font
face="Arial">(VCL)</font><font face="宋体" lang="ZH-CN">,都处处渗透了对象存储技术,本节将从</font><font
face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化设计内部机制、</font><font
face="Arial">VCL</font><font face="宋体" lang="ZH-CN">中的数据存储、</font><font
face="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><font
face="宋体" 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><font
face="宋体" lang="ZH-CN">的</font><font face="Arial">Install Component</font><font
face="宋体" lang="ZH-CN">功能,才能出现在</font><font face="Arial">Component
Palette</font><font face="宋体" lang="ZH-CN">上;部件的属性才有可能出现在</font><font
face="Arial">Object Inspector</font><font face="宋体" lang="ZH-CN">窗口中;部件的属性编辑器才能被</font><font
face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">环境使用。因为这种浑然天成的关系,</font><font
face="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件存取必然得到</font><font
face="Arial">VCL</font><font face="宋体" lang="ZH-CN">在程序上的支持。</p>
<p>  </font><font face="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件的部件存取是</font><font
face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化设计环境中文件存取的中心问题。因为</font><font
face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化

⌨️ 快捷键说明

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