AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Prism XML und "Class Helper"
Tutorial durchsuchen
Ansicht
Themen-Optionen

XML und "Class Helper"

Ein Tutorial von sakura · begonnen am 6. Jan 2004 · letzter Beitrag vom 6. Jan 2004
Antwort Antwort
Benutzerbild von sakura
sakura
Registriert seit: 10. Jun 2002
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)
Ich bin nicht zurück, ich tue nur so
 
choose

 
Delphi 2006 Architect
 
#2
  Alt 6. Jan 2004, 20:26
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?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 11 Alexandria
 
#3
  Alt 6. Jan 2004, 20:34
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 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.

......
Daniel W.
  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 09:15 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