加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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文档.
当ID_COUNTER存在时,一切都被打破,如果被注释,一切都好.它发生在这里和我真实的广泛项目中.

解决方法

问题在于,在语法上,类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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读