Es geht noch etwas hin und her
Ich habe mich doch noch etwas näher mit den Expertenschnittstellen beschäftigt.
Grundsätzlich sind die nicht verkehrt...
Ich komme jedoch mit den Interfaces noch nicht klar. Und zwar möchte ich in meinen eigenen Komponenten Referenzen auf jeweils ein bestimmtes Knoteninterface verwalten.
Das sieht etwa so aus:
Delphi-Quellcode:
TxmlCtrl = class(TComponent)
private
FXmlNode: IXmlNode;
...
procedure SetXmlNode(const Value: IXmlNode);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
...
property XmlNode : IXmlNode read FXmlNode write SetXmlNode;
end;
procedure TxmlCtrl.SetXmlNode(const Value: IXmlNode);
begin
if FXmlNode <> Value then
begin
FXmlNode := Value;
{
if Assigned(XmlNode) then // nicht hilfreicher Test
XmlNode._AddRef;
}
InvalidateData;
end;
end;
Im Projekt definiere ich dann die Wurzelschnittstelle und weise sie meiner Komponente zu.
Delphi-Quellcode:
var
te: IXMLTournamentEvent;
// im DataModule global definiert
...
te := GetTournamentEvent(
xml);
// nach Projektstart, xml ist mein TXmlDocument
..
procedure TFormOlympic.Button1Click(Sender: TObject);
// Test der Schnittstelle
var
ix: IXmlNode;
begin
Caption := te.
Name;
// funktioniert: Caption = 'Test'
ix := te;
// kein Promlem, zum Test mal eingerichtet
Caption := Caption + '
!' + ix.NodeName;
// funktioniert: Caption = 'Test !TournamentEvent'
// te._AddRef; // (wirkungsloser Versuch)
xmlEditTournamentEventName.xmlCtrl.XmlNode := te;
// funktioniert grundsätzlich
// mit dem Knoten und Wert wird auch korrekt gearbeitet
// beim Programmende meckert jedoch FASTMM (siehe Anlage)
end;
Lasse ich den letzten Punkt weg, gibt es keine Probleme. Ich möchte aber meinen Komponenten jeweils einen bestimmten Knoten zuweisen.
Das xmlCtrl ist in diesem Fall eine Subkomponente meiner xmlEdit und greift direkt auf den Knotenwert zu.
Ich denke, dass beim Freigeben der xmlEdit bzw. deren xmlCtrl beim Projektende automatisch meine
xml (TXmlDocument) freigegeben wird!?
Kann das sein?
Wie kann ich das verhindern und in meinen Komponenten ohne Nebenwirkungen Referenzen auf die enthaltenen IXmlNode speichern?
_AddRef hat mir in verschiedenen Versuchen noch nichts gebracht.
Auch ein
FXmlNode := nil
im
TxmlCtrl.Destroy
half nicht.
Danke für jede Hilfe!!