AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TXMLDocument freigeben

Ein Thema von Martin W · begonnen am 16. Jan 2015 · letzter Beitrag vom 16. Jan 2015
Antwort Antwort
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#1

TXMLDocument freigeben

  Alt 16. Jan 2015, 16:43
Delphi-Version: XE3
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:

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

Viele Grüße,
Martin

Geändert von Martin W (16. Jan 2015 um 20:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: TXMLDocument freigeben

  Alt 16. Jan 2015, 16:46
Ich habe vielleicht etwas übersehen, aber sollte Doc nicht als IXMLDocument deklariert sein? Und eigentlich gehört das Create ja vor das try.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: TXMLDocument freigeben

  Alt 16. Jan 2015, 16:54
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?

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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: TXMLDocument freigeben

  Alt 16. Jan 2015, 16:56
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: TXMLDocument freigeben

  Alt 16. Jan 2015, 17:01
Oh, ja, klar, das war ein Flüchtigkeitsfehler, absolut korrekt.

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

Geändert von Martin W (16. Jan 2015 um 17:05 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

AW: TXMLDocument freigeben

  Alt 16. Jan 2015, 17:11
Oh, ja, klar, das war ein Flüchtigkeitsfehler, absolut korrekt.

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.
Michael Justin
habarisoft.com

Geändert von mjustin (16. Jan 2015 um 17:14 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: TXMLDocument freigeben

  Alt 16. Jan 2015, 19:18
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...
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: TXMLDocument freigeben

  Alt 16. Jan 2015, 20:37
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?

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.

Geändert von Martin W (16. Jan 2015 um 20:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz