Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Schwierig Typumwandlung
Nuker - Di 01.07.03 13:58
Titel: Schwierig Typumwandlung
Halli Hallo
Ich hab folgendes Problem :
Ich besitze Delphi 6 Enterprise Edition. Darin enthalten ist die Komponenten TXMLDocument.
Des weiteren wird der Typ IXMLNode als Interface Typ und TXMLNode als
TInterfacedObject mit dem Interface IXMLNode.
Ich will entweder TXMLNode oder IXMLNode mit der Prozedur RegisterClass() registrieren, allerdings benötigt diese Prozedur die Klasse TPersistent. Wie kann ich IXMLNode bzw. TXMLNode umwandeln ?? Der Operator "as" funzt nicht und versuch ichs mit einer normalen Typumwandlung "TPersistentClass( TXMLNode )" gibts eine Zugriffsverletzung.
Bitte helft mir !!!
Bis dann,
C YA @ll - [ BD ]Nuker
maximus - Di 01.07.03 14:51
Moin...
hmm...vielleicht geht
Quelltext
1:
| TPersistent( TXMLNode ) |
?
Aber vielleicht ist es sinnvoller, deine eigene register-routine, für die XMLs, zu schreiben. Kannste einfach n array nehmen und alles nötige selbst verwalten...?
Nuker - Di 01.07.03 15:21
Nein, so einfach gehts leider nicht...
Da kommt wieder eine riesen Zugriffsverletzung.
Einen simplen Array kann ich leider auch nicht machen, weil ich ja auch die ganzen Einstellungen und Attribute von IXMLNode verwende, so wie ParentNode, etc..
maximus - Di 01.07.03 15:37
| Nuker hat folgendes geschrieben: |
...Einen simplen Array kann ich leider auch nicht machen, weil ich ja auch die ganzen Einstellungen und Attribute von IXMLNode verwende, so wie ParentNode, etc..
|
da hast du mich falsch verstanden...natürlich nicht als ersatz für XML (wär ja albern), sondern als ersatz für die registerClass funktion von delphi. Die macht ja auch nix anderes, als sich eine klasse, mit dem dazugehörigen namen, zu merken.
zB.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| type TClassRec = record name : string[128]; class : TClass; valid : boolean; end; TClassArr : array of TClassRec;
vat classReg:TClassArr ; ... procedure registerNukerClass(aName:string;aClass:TClass); var n:integer; begin n := length(classReg); setLength(classReg,n+1); classReg[n].name := aName; classReg[n].class := aClass classReg[n].valid := true; end;
procedure UnRegisterNukerClass(...
... function FindNukerClass(...):TCLass;
end; |
Is echt easy :wink: hoffe du hast meinen ansatz verstanden?
Nuker - Mi 02.07.03 09:11
Ach sooooo :-) ....
Da hab ich dich wirklich falsch verstanden :-)...
Hmm... ich werds mal ausprobieren !! THX !!
C YA @LL
AndyB - Mi 02.07.03 09:36
| maximus hat folgendes geschrieben: |
| sondern als ersatz für die registerClass funktion von delphi. Die macht ja auch nix anderes, als sich eine klasse, mit dem dazugehörigen namen, zu merken. |
Ein bisschen mehr macht sie schon, sonst würde es keine AV geben, wenn man einen Klasse in TPersistent typecastet, die gar nicht von TPersistent abgeleitet ist.
RegisterClass benutzt eine TList und kein Array.
maximus - Mi 02.07.03 10:14
Das ist korrekt! Delphi hat eine eigene klasse, um diese zu verwalten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| TRegGroups = class private FGroups: TList; FLock: TRTLCriticalSection; FActiveClass: TPersistentClass; function FindGroup(AClass: TPersistentClass): TRegGroup; public constructor Create; destructor Destroy; override; procedure Activate(AClass: TPersistentClass); procedure AddClass(ID: Integer; AClass: TPersistentClass); function GetClass(const AClassName: string): TPersistentClass; function GroupedWith(AClass: TPersistentClass): TPersistentClass; procedure GroupWith(AClass, AGroupClass: TPersistentClass); procedure Lock; procedure RegisterClass(AClass: TPersistentClass); procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string); function Registered(AClass: TPersistentClass): Boolean; procedure StartGroup(AClass: TPersistentClass); procedure Unlock; procedure UnregisterClass(AClass: TPersistentClass); procedure UnregisterModuleClasses(Module: HMODULE); property ActiveClass: TPersistentClass read FActiveClass; end; |
er kann sich natürlich hinsetzen und diese funktionen für seine klassen schreiben...doch den ganzen sche*** braucht er vermutlich nicht! Deshalb eine lösung die einfach ist und funktioniert :wink:
Nuker - Mi 02.07.03 13:25
:cry: :cry: :cry: :cry:
Tja ... das ist das Problem Jungs ... habs grad gemerkt ...
Ich brauch doch einige dieser Funktionen und ich hab keine Lust das alles neu zu machen :cry: :cry: :cry:
GetClass, AddClass, Unregister, usw... brauch ich alles ...
:cry: :cry: :cry: :cry:
maximus - Mi 02.07.03 13:59
Wo is da das prob?
muss ja keine klasse sein und wenns nur die drei funktionen sind, dann dürfe der anfang, von oben (mit array) doch recht schnell gemacht sein.
wenn du nett fragst, dann schreib ich dir den rest schnell runter :wink:
PS: was meinst du mit usw?
Nuker - Mi 02.07.03 14:14
Nein, Nein ... so ein fauler Hund bin ich auch nicht :wink:
Habs jetzt mitlerweile auch geschafft... mit einer Übergangslösung...
Hab einen Script Parser geschrieben und hab dafür die registrierten Klassen benötigt. Hab mir selbst eine Übergangsklasse für IXMLNode geschrieben und dies wird dann zur Laufzeit in IXMLNode umgewandelt und dann wieder ganz normal behandelt.
Trotzdem ein RIESEN DANKE an euch :D :D :D
C YA @LL - [BD]Nuker|Project:Zeus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!