gpt4 book ai didi

Delphi:为什么类变量会影响方法的结果?

转载 作者:行者123 更新时间:2023-12-03 15:03:45 24 4
gpt4 key购买 nike

这是我的代码的完全简化,但即使如此,当类 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:\temp\example.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 存在时,一切都会被破坏,如果它被注释掉,一切就OK了。它发生在这里,发生在我真实而广泛的项目中。

最佳答案

问题在于,从语法上来说,class var引入了一个类字段block而不是单个类字段,这意味着如果您使用class var code>,同一可见性部分中的所有后续字段声明也将是类变量。 所以现在,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.
  • MainNode 前面加上 var 关键字(同样,它引入了一个 block ,特别是当前当前节点中的实例字段 block )可见性部分):

    public
    class var
    ID_COUNTER: Integer;
    // any other class variables
    var
    MainNode: IDomNode;
    // any other instance variables
    constructor Create(... etc.

关于Delphi:为什么类变量会影响方法的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24625190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com