Thema: Prism XML und "Class Helper"

Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#1

XML und "Class Helper"

  Alt 6. Jan 2004, 20:52
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.

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

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.

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.

......

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

[edit=Chakotay1308]Klassifiziert und Titel korrigiert. Mfg, Chakotay1308[/edit]
Angehängte Dateien
Dateityp: zip class_helper_concept.zip (27,8 KB, 19x aufgerufen)
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat