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(...
// nur das valid auf false setzen!

...
function FindNukerClass(...):TCLass;
// alle valid = false einträge beim suchen überspringen!

  
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