Delphi-PRAXiS
Seite 26 von 35   « Erste     16242526 2728     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   himXML (gesprochen himix ML) (https://www.delphipraxis.net/130751-himxml-gesprochen-himix-ml.html)

himitsu 10. Okt 2010 21:04

AW: himXML (gesprochen himix ML)
 
@geskill:
Konnte deinen Fehler leider nicht reproduzieren.

Solange man nicht "manuell" im Quellcode die .Version setzt oder das Versions-Attribut verändert, sollte eigentlich beim Speichern niemal diese Fehlermeldung erscheinen können. :gruebel:
(beim Auslesen sollten nur bekannte XML-Version erkannt/zugelassen werden, weswegen beim Speichern eigentlich keine unbekannte Version vorliegen dürfte)

Könntest du mir eine Demoanwendung zukommen lassen, welche dieser Verhalten zeigt?



PS: .DefaultTextIndent legt die "Standard"-Einstellung für zukünftige Instanzen von TXMLFile fest.
.TextIndent repräsentiert die Einstellung der aktuellen Instanz.

Du wolltest also bestimmt
Delphi-Quellcode:
TextIndent := #9;
verwenden.

Medium 10. Okt 2010 22:28

AW: himXML (gesprochen himix ML)
 
Ahhh, mir wurde einiges klarer jetzt! Danke!

Nachdem ich mir dann mal genau aufgemalt habe was da wo hin gepointert wird, ist mir aufgefallen, dass Node.InnerPrev und Node.InnerPrev.InnerNext noch fehlen.
Ich habe zudem nach wie vor bei schon einmal verschobenen Nodes den Fehler bekommen, dass die Node nicht in der Liste sei. Node.SetParent(self) hat Abhilfe geschaffen :)

Hier mal meine Anpassungen:
Delphi-Quellcode:
      Function TXMLNodeList.Insert(Node, RNode: TXMLNode; previousR: Boolean = False): TXMLNode;
      var
        tmp: TXMLNode;
      Begin
        If not (Node is TXMLNode) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SInvalidNode);
        If (Assigned(_Parent) and (_Parent.InnerText <> '')) or (Assigned(_FirstNode)
            and ((_FirstNode.NodeType = xtCData) or (Node.NodeType = xtCData))) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SIsTextNode, _Parent.Name);
        If Assigned(RNode) and (not (RNode is TXMLNode) or (RNode.ParentList <> Self)) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SNodeNotInList);
        If Assigned(Node.ParentList) Then Node := Node.ParentList.Remove(Node);
        Inc(_NodesCount);
        If previousR Then Begin
          If not Assigned(RNode) Then RNode := _FirstNode;

          If not Assigned(_FirstNode) or (_FirstNode = RNode) Then _FirstNode := Node;
          If not Assigned(_LastNode) Then _LastNode := Node;
          If Assigned(RNode) Then Begin
            If Assigned(RNode.InnerPrev) Then RNode.InnerPrev.InnerNext := Node;
            Node.InnerPrev := RNode.InnerPrev;
            Node.InnerNext := RNode;
            RNode.InnerPrev := Node;
          End;
        End Else Begin
          If not Assigned(RNode) Then RNode := _LastNode;

          If not Assigned(_FirstNode) Then _FirstNode := Node;
          If not Assigned(_LastNode) or (_FirstNode = RNode) Then _LastNode := Node;
          If Assigned(RNode) Then Begin
            If Assigned(RNode.InnerNext) Then RNode.InnerNext.InnerPrev := Node;
            Node.InnerNext := RNode.InnerNext;
            tmp := Node.InnerPrev;
            Node.InnerPrev := RNode;
            RNode.InnerNext := Node;
            RNode.InnerPrev := tmp;
            if Assigned(tmp) then
              tmp.InnerNext := RNode;
            Node.SetParent(self);
            RNode.SetParent(self);
          End;
        End;
        Node.CheckCrypted(True);
        Result := Node;
        DoNodeChange(Result, xcAddetNode);
      End;
Ich habe nur den Zweig für previousR=false geändert, da die andere Variante bei benachbarten Nodes sehr lustige Verknotungen erzeugt (Node.InnerPrev zeigt wieder auf Node und so Dinge), und ich es nicht zwingend brauche. (Nach oben schieben lässt sich ja auch über runter schubsen des vorigen Nodes erreichen.)

Damit komme ich nun weiter, merci!!

Edit: Ach shit :(
Noch immer verschwinden RNodes, und zwar sobald das Node (also das direkt davor) vorher schon mal an einer Verschiebung beteiligt war. Ich habe jetzt 3 Seiten mit Pfeilen vollgekritzelt, und komme immer zu dem Ergebnis, dass diese Abfolge von Verbiegungen stimmen sollte:
Delphi-Quellcode:
            If Assigned(RNode.InnerNext) Then RNode.InnerNext.InnerPrev := Node;
            If Assigned(Node.InnerPrev) Then Node.InnerPrev.InnerNext := RNode;
            Node.InnerNext := RNode.InnerNext;
            RNode.InnerPrev := Node.InnerPrev;
            Node.InnerPrev := RNode;
            RNode.InnerNext := Node;
(Habe das "tmp" von oben eliminieren können, daher nochmals anders.)
Ich verzweifel langsam :\

Edit2
Das RNode verliert seinen Prev! Und zwar obwohl das Prev vom Node gültig ist. Aber WARUM!?
Wenn doch nur dieser sch**** Debugger in die Methode springen würde, WAHH! Auch DCU killen half nicht. Sowas liebe ich ja.

Edit3
Durch das vorige Remove von Node aus Node.ParentList werden die Next und Prevs genilt.
Hier die gesamte gepatchte Methode, wobei halt noch immer der Zweig für previousR unbehandelt ist:
Delphi-Quellcode:
      Function TXMLNodeList.Insert(Node, RNode: TXMLNode; previousR: Boolean = False): TXMLNode;
      var
        NPrev: TXMLNode;
      Begin
        If not (Node is TXMLNode) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SInvalidNode);
        If (Assigned(_Parent) and (_Parent.InnerText <> '')) or (Assigned(_FirstNode)
            and ((_FirstNode.NodeType = xtCData) or (Node.NodeType = xtCData))) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SIsTextNode, _Parent.Name);
        If Assigned(RNode) and (not (RNode is TXMLNode) or (RNode.ParentList <> Self)) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SNodeNotInList);
        NPrev := Node.InnerPrev;
        If Assigned(Node.ParentList) Then Node := Node.ParentList.Remove(Node);
        Inc(_NodesCount);
        If previousR Then Begin
          (*If not Assigned(RNode) Then RNode := _FirstNode;

          If not Assigned(_FirstNode) or (_FirstNode = RNode) Then _FirstNode := Node;
          If not Assigned(_LastNode) Then _LastNode := Node;
          If Assigned(RNode) Then Begin
            If Assigned(RNode.InnerPrev) Then RNode.InnerPrev.InnerNext := Node;
            Node.InnerPrev := RNode.InnerPrev;
            Node.InnerNext := RNode;
            RNode.InnerPrev := Node;
          End;*)
        End Else Begin
          If not Assigned(RNode) Then RNode := _LastNode;

          If not Assigned(_FirstNode) Then _FirstNode := Node;
          If not Assigned(_LastNode) or (_FirstNode = RNode) Then _LastNode := Node;
          If Assigned(RNode) Then Begin
            If Assigned(RNode.InnerNext) Then RNode.InnerNext.InnerPrev := Node;
            If Assigned(Node.InnerPrev) Then Node.InnerPrev.InnerNext := RNode;
            Node.InnerNext := RNode.InnerNext;
            RNode.InnerPrev := NPrev;
            Node.InnerPrev := RNode;
            RNode.InnerNext := Node;
            Node.SetParent(self);
            Node.SetOwner(self.Owner);
          End;
        End;
        Node.CheckCrypted(True);
        Result := Node;
        DoNodeChange(Result, xcAddetNode);
      End;
Edit #wasweissich
Wenn beim Insert der LastNode betroffen ist, muss der noch in der Liste mit geupdated werden. Sonst geht in darauf folgenden Add() mächtig was schief!

Edit ...
Das letzte aber voraussichtlich :). Wenn die beteiligten beiden Knoten keine Nachbarn sind, wird alles was zwischen den beiden war noch einseitig weggeschnitten. Node.Next.Prev und RNode.Prev.Next müssten noch behandelt werden.
Wenn man InnerNext und InnerPrev Setter spendieren würde, die gleich die Gegenrichtung mit anpassen, dürfte man sich viel Gehampel ersparen glaube ich.

himitsu 12. Okt 2010 01:30

AW: himXML (gesprochen himix ML)
 
Einer der Gründe, warum ich das Speichermanagement etwas fast komplett überarbeite. :oops:

Jens Hartmann 20. Dez 2010 17:54

AW: himXML (gesprochen himix ML)
 
Hallo himitsu,

ich versuche gerade Deine Klasse zu verwenden. In den Demos funktioniert das alles. Allerdings versuche ich die Klasse gerade in eine IntraWeb Anwendung einzubinden. Dabei kommt es zu einem Fehler. Vieleicht ist dir der Fehler ja schon bekannt, und du kannst mir einen Lösungsansatz geben.

Ich habe die "himXML" in mein Projekt eingebunden versuche nach der "TreeDemo" eine "IWTreeView" Komponente mit einer XML-Datei zu füllen. Beim kompilieren, bricht er allerdings an folgender Stelle deiner Klasse...

Delphi-Quellcode:
        End;
        If (L < 0) or (i > 0) Then Raise EXMLException.CreateEx(TXMLFile, 'Crypt_Base64Decode', @SCorupptedBase64);
      End;
Mit folgender Fehlermeldung ab..

Zitat:

[DCC Fehler] himXML.pas(1767): E2250 Es gibt keine überladene Version von 'CreateEx', die man mit diesen Argumenten aufrufen kann
Vieleicht kannst Du mir sagen, wo der Fehler liegt.:gruebel:

Gruß Jens

himitsu 20. Dez 2010 20:13

AW: himXML (gesprochen himix ML)
 
hmmmm :gruebel:

Wenn du hinter das CreateEx gehst und dort ein ( hinschreibst, was zeigt dann das CodeInsight an?

Jens Hartmann 20. Dez 2010 20:35

AW: himXML (gesprochen himix ML)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier die CodeInsight...

Vieleicht als Info. Ich nutze D2007Pro mit Win7/64. In einer normalen VCL-Anwendung geht es ohne Probleme. Es muss also irgendwie mit IntraWeb zusammenhängen.

Gruß Jens

Jens Hartmann 20. Dez 2010 20:47

AW: himXML (gesprochen himix ML)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ganze muss vermutlich an irgendeiner anderen Datei liegen die Du für die himXML nutzen tust. Da fehlt noch viel mehr.

himitsu 20. Dez 2010 22:41

AW: himXML (gesprochen himix ML)
 
Versuche mal bitte den neueren anderen Anhang (164).

Nja, ein Problem ist halt, daß ich dieses Projekt unter Delphi 2009 gestartet hatte und für die Abwärtskompatibilität kein D2007 zur Verfügung stand ... hatte als nächsten Vorgänger nur noch ein D2006 zur Verfügung.

GPRSNerd 7. Jan 2011 21:46

AW: himXML (gesprochen himix ML)
 
Hallo himitsu,

Delphi XE schmeisst (neben anderen) ein paar Warnungen beim Compilen von himxml.pas aus in Zeilen wie:
Delphi-Quellcode:
Integer(@X.Time)


[DCC Warnung] himXML.pas(3157): W1000 Symbol 'Time' ist veraltet
[DCC Warnung] himXML.pas(3312): W1000 Symbol 'Time' ist veraltet

Hast du ne Ahnung wie man das fixen kann? Es scheint generell mit TSearchRec.Time und FileAge u.ä. zu tun zu haben...
Habe im inet nichts genaueres dazu gefunden.

Gruß,
Stefan

himitsu 7. Jan 2011 22:04

AW: himXML (gesprochen himix ML)
 
Diese Veraltet-Meldungen kann man notfalls erstmal ignorieren.

Das Bedeutet nur, daß es eventuell neuere/andere Funktionen/Aufrufe gibt und daß die entsprechende veraltete Funktion vermutlich demnächst aus Delphi entfernt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.
Seite 26 von 35   « Erste     16242526 2728     Letzte »    

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