Delphi:为什么类变量会影响方法的结果?
发布时间:2020-12-15 09:49:43 所属栏目:大数据 来源:网络整理
导读:这是我的代码的完全简化,但即使如此,当类var ID_COUNTER存在时它也不起作用,在这段代码中我不使用类var,但是在我的实际代码中是的,但只是这个类的存在变量 使’s’的结果不同.这是我见过的最奇怪的事情. 这是一个简化,但仍然不起作用,一个单位在75行. unit U
这是我的代码的完全简化,但即使如此,当类var ID_COUNTER存在时它也不起作用,在这段代码中我不使用类var,但是在我的实际代码中是的,但只是这个类的存在变量
使’s’的结果不同.这是我见过的最奇怪的事情. 这是一个简化,但仍然不起作用,一个单位在75行. unit Umain; interface uses Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,XMLIntf,XmlDoc,IOUtils,XMLDom,System.Generics.Collections; type TStore = class public class var ID_COUNTER: Integer; MainNode: IDomNode; constructor create(node:IDomNode); function getNode():IDomNode; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public FMain: TStore; function Recursive(node:IDomNode):TStore; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var Doc:IXMLDocument; content: WideString; html: IDomNode; s: String; begin Doc := TXMLDocument.Create(Application); Doc.LoadFromFile('C:tempexample.xml'); Doc.Active := true; html := Doc.DOMDocument.getElementsByTagName('html').item[0]; FMain := Recursive(html); s := FMain.getNode().nodeName; end; function TForm1.Recursive(node: IDOMNode):TStore; var i: Integer; store: TStore; nodeName,nodeValue:String; begin store := TStore.create(node); if(not node.hasChildNodes)then Exit(store); for i := 0 to node.childNodes.length-1 do begin Recursive(node.childNodes.item[i]); end; Exit(store); end; constructor TStore.create(node: IDOMNode); begin self.MainNode := node; end; function TStore.getNode:IDomNode; begin Result := self.MainNode; end; end. 一些说明: example.xml只是一个简单的HTML文档. 解决方法
问题在于,在语法上,类var引入了一个类字段而不是单个类字段,这意味着如果使用类var,则同一可见性部分中的所有后续字段声明也将是类变量.所以现在,MainNode也变成了一个类变量,这可能会导致你遇到的问题.重新格式化代码可以更清楚地显示:
public class var ID_COUNT: Integer; MainNode: IDomNode; constructor Create(... etc. 你的选择是: >向下移动一行ID_COUNT: public MainNode: IDomNode; class var ID_COUNTER: Integer; constructor Create(... etc. >为MainNode创建一个特殊部分: public class var ID_COUNTER: Integer; public MainNode: IDomNode; constructor Create(... etc. >前缀带有var关键字的MainNode(同样,它引入了一个块,特别是当前可见性部分中的实例字段块): public class var ID_COUNTER: Integer; // any other class variables var MainNode: IDomNode; // any other instance variables constructor Create(... etc. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |