Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Prism XML und "Class Helper" (https://www.delphipraxis.net/14318-xml-und-class-helper.html)

sakura 6. Jan 2004 19:52


XML und "Class Helper"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

einige von Euch mögen sich vielleicht noch an diesen Beitrag erinnern: Ändern der Klassenhierarchie. Daran möchte ich hier und jetzt anschließen.

Mit Delphi 8 for .NET hat uns Borland die Möglichkeit gegeben sogenannte class helper zu programmieren. Es ist nicht exakt das gleiche, wie die Klassenhierarchie zu ändern, allerdings, behaupte ich mal, um weites einfacher und mächtiger.

Mit class helpern kann man bestehende Klassen und Objekte anderer Assemblies, zu denen man den Source Code nicht besitzt, einfach erweitern und neue Funktionen hizufügen.

Chakotay hatte mal eine Frage zum Thema XML Attribute und machte es mir recht einfach, da ich eine meiner geliebten XML Funktionen einfach als Antwort posten konnte. Diese Funktion (GetAttributeValue) und ihr Gegenstück (SetAttributeValue) möchte ich in diesem Beitrag der .NET Klasse System.Xml.XmlNode hinzufügen und dann auch einsetzen. :-D

Dazu zeige ihc als erstes erst einmal die Deklaration eines solchen class helper

Delphi-Quellcode:
uses
  System.Xml;

type
  TXmlNodeHelper = class helper for XmlNode
  public
    function GetAttributeValue(AttributeName, DefaultValue: String;
        ReturnDefaultOnEmpty: Boolean = True): String;
    function SetAttributeValue(AttributeName, Value: String): Boolean;
  end;
Hier wird auch schon der Unterschied zu einer "normalen" Klasse deutlich. TXmlNodeHelper = class helper for XmlNode Unsere "Klasse" TXmlNodeHelper ist definiert als eine Erweiterung der Klasse XmlNode, welche im Assembly System.Xml definiert ist.

Anschließend muss man nur noch den Code einfügen, als würde man mit einer normalen Klasse arbeiten. Hier mal das Beispiel für SetAttributeValue.

Delphi-Quellcode:
function TXmlNodeHelper.SetAttributeValue(AttributeName,
  Value: String): Boolean;
var
  Attribute: XmlNode;
begin
  if Self = nil then
  begin
    Result := False;
    Exit;
  end else begin
    Attribute := Attributes.GetNamedItem(AttributeName);
    if Attribute <> nil then
    begin
      Attribute.Value := Value;
    end else begin
      Attribute := OwnerDocument.CreateNode(XmlNodeType.Attribute, AttributeName,
          '');
      Attribute.Value := Value;
      Attributes.SetNamedItem(Attribute);
    end;
    Result := True;
  end;
end;
Jetzt sind wir schon fertig mit den Vorbereitungen. Um diesen class helper zu nutzen, müssen wir unsere Unit nur in die Uses-Klausel der Units aufnehmen, wo wir diesen auch brauchen. Einfacher gehts nicht :stupid:

Hier mal ein Beispiel:

Delphi-Quellcode:
uses
  ..., System.Xml, uXmlHelper;

type
  TWinForm = class(System.Windows.Forms.Form)
  ...
  private
    FTestNode: System.Xml.XmlNode;
  ...
  end;

procedure TWinForm.btnSetThree_Click(sender: System.Object; e: System.EventArgs);
begin
  MessageBox.Show('Value was set: ' + System.Convert.ToString(
      FTestNode.SetAttributeValue('three', '*wuppdi*')));
end;
In diesem Stück Code füllen wir in der Xml-Node FTestNode das Attribute three mit den Wert *wuppdi*. Was auffällt ist, daß FTestNode vom Microsoft Typ System.Xml.XmlNode ist, dieser definiert allerdings nicht die Methode SetAttributeValue, diese haben wir mit Hilfe des class helper selbst definiert und können sie nutzen als wäre diese im Original verfügbar. :cyclops:

Der Rest des Codes ist im Anhang. Zum Testen muss natürlich das MS .NET Framework v1.1 installiert sein, ausserdem muss die Datei sample.xml im gleichen Verzeichnis liegen. Hier deren Inhalt.

XML-Code:
<root>
   <sample one="" two="has a value"/>
</root>
Viel Spaß mit den class helpern.

...:cat:...

P.S.: class helper scheinen wohl sprach-spezifisch zu sein :-)

[edit=Chakotay1308]Klassifiziert und Titel korrigiert. Mfg, Chakotay1308[/edit]

choose 6. Jan 2004 20:26

Re: [.NET] XML und "Class Helper"
 
Hallo sakura,

als ich vor einiger Zeit in diesem BDN-Artikel über das Konzept der Class Helper gelesen habe, hatte ich den Eindruck, dass der Verwendung dieses Lösung einmal mehr von der Compiler-Magic des Delphi.NET-Compilers abhängt. Schließlich basiert die transparente Nutzung des Helpers auf dem zusätzlichen "unsichtbaren Parameter"...
Kannst Du etwas darüber sagen, ob ich Helper Classes in Assemblies veröffentlichen und aus anderen .net-Sprachen verwenden kann?

sakura 6. Jan 2004 20:34

Re: [.NET] XML und "Class Helper"
 
Zitat:

Zitat von choose
Compiler-Magic des Delphi.NET-Compilers

Gut möglich, ich dachte vorhin, ich hätte was in MS C# und diesen "class helper" gelesen. Kann es aber nicht wieder finden :-(

Zitat:

Zitat von choose
Kannst Du etwas darüber sagen, ob ich Helper Classes in Assemblies veröffentlichen und aus anderen .net-Sprachen verwenden kann?

Bis an die Assemblies habe ich mich noch nicht rangemacht. *ich vermute mal* Aber wenn es wirklich ein Delphi-Lösung ist (schön wie diese auch ist), wird es wohl leider nicht gehen.

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 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