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]