Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TXMLDocument freigeben (https://www.delphipraxis.net/183520-txmldocument-freigeben.html)

Martin W 16. Jan 2015 15:43

Delphi-Version: XE3

TXMLDocument freigeben
 
Hi,

folgender Code:

Delphi-Quellcode:
var
  RootNode: IXMLNode;
  Doc: TXMLDocument;
begin

  // Erzeuge ein Dokument
  Doc := TXMLDocument.Create(nil);

  try

    Doc.Active := True;

    // Root Node
    Doc.AddChild('DynamicUserForm');
    // Parent node
    RootNode := Doc.DocumentElement;

    (... Dinge tun ...)

    Doc.SaveToXML(Result);

    Doc.Active := False;

  finally

    Doc := nil;

  end;

end;
Kann ich hierbei auch auf das finalisiernde Doc := nil; zur Freigabe verzichten? Dephi gibt hierbei den Hinweis:

Delphi-Quellcode:
[dcc32 Hinweis] xxx.pas(760): H2077 Auf 'Doc' zugewiesener Wert wird niemals benutzt


Viele Grüße,
Martin

DeddyH 16. Jan 2015 15:46

AW: TXMLDocument freigeben
 
Ich habe vielleicht etwas übersehen, aber sollte Doc nicht als IXMLDocument deklariert sein? Und eigentlich gehört das Create ja vor das try.

Martin W 16. Jan 2015 15:54

AW: TXMLDocument freigeben
 
Zitat:

Zitat von DeddyH (Beitrag 1286757)
Ich habe vielleicht etwas übersehen, aber sollte Doc nicht als IXMLDocument deklariert sein?

Sollte es? Also so wie im Code funktioniert es tadellos... Was ist denn der Vor/Nachteil?

Zitat:

Zitat von DeddyH (Beitrag 1286757)
Und eigentlich gehört das Create ja vor das try.

Oh, ja stimmt, ist er eigentlich auch, ist mir gerade beim aufräumen des Codes für das Forum passiert.

DeddyH 16. Jan 2015 15:56

AW: TXMLDocument freigeben
 
Objekte gibt man frei, indem man deren Free-Methode aufruft, Interfaces, indem man sie auf nil setzt (sofern es sich um die einzige/letzte Referenz handelt). Da Du die Variable als Instanz- und nicht als Interfacevariable deklariert hast, bringt das Setzen auf nil nichts, da hat der Compiler schon Recht.

Martin W 16. Jan 2015 16:01

AW: TXMLDocument freigeben
 
Oh, ja, klar, das war ein Flüchtigkeitsfehler, absolut korrekt. :duck:

Aber mal generell: Sollte ich lieber ein IXMLDocument oder TXMLDocument verwenden?

mjustin 16. Jan 2015 16:11

AW: TXMLDocument freigeben
 
Zitat:

Zitat von Martin W (Beitrag 1286762)
Oh, ja, klar, das war ein Flüchtigkeitsfehler, absolut korrekt. :duck:

Aber mal generell: Sollte ich lieber ein IXMLDocument oder TXMLDocument verwenden?

Man sollte das Interface anstatt der konkreten Klasse verwenden. (Im Fachjargon: 'gegen das Interface programmieren').

Vorteil: wenn für den Variablentyp das Interface statt der konkreten Klasse verwendet wird, kann die Klasse leichter gegen eine andere ausgetauscht werden, falls sie dasselbe Interface implementiert. Und man kann nicht versehentlich Methoden oder Properties benutzen, die nicht Teil des Interfaces sind.

Der schöne Günther 16. Jan 2015 18:18

AW: TXMLDocument freigeben
 
Und da du dir so den try..finally-Block komplett schenken kannst. Beim Verlassen der Methode wird das IXmlDocument dann automatisch freigegeben.


PS: Wozu ist das "Active" eigentlich gut? Ich habe das noch nie verwendet...

Martin W 16. Jan 2015 19:37

AW: TXMLDocument freigeben
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1286776)
Und da du dir so den try..finally-Block komplett schenken kannst. Beim Verlassen der Methode wird das IXmlDocument dann automatisch freigegeben.

Genau das war die initiale Frage. Meine Gedanken waren:

Variable ist nur innerhalb der Methode gültig -> Daher sollte das Interface beim Verlassen der Methode keinen gültigen Zeiger mehr haben -> Interface wird aufgeräumt, auch ohne Doc := nil, korrekt?

Zitat:

Zitat von Der schöne Günther (Beitrag 1286776)
PS: Wozu ist das "Active" eigentlich gut? Ich habe das noch nie verwendet...

Hatte mich da strikt an die RAD Studio VCL Reference gehalten:

Zitat:

Specifies whether the XML document has been parsed so that the DOM interfaces are available to examine or change its contents.

Before you can use IXMLDocument to examine or change the contents of an XML document, it must be active. Setting Active to true results in the parsing of the XML document specified by the FileName property or by the XML property. If both FileName and XML are empty strings, Setting Active to true causes IXMLDocument to represent an empty document.

Active must be true before you can access the DOMDocument or DocumentElement properties.
http://docwiki.embarcadero.com/Libra...ocument.Active

Verwendet man anstelle von TXMLDocument.Create direkt NewXMLDocument, dann kann man sich das .Active auch sparen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz