Delphi-PRAXiS
Seite 15 von 35   « Erste     5131415 161725     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)

xZise 31. Aug 2009 20:06

Re: himXML (gesprochen himix ML)
 
Ach ich dachte nicht das CData ein eigener Node ist. Danke :P

MfG
xZise

franktron 8. Sep 2009 11:47

Re: himXML (gesprochen himix ML)
 
Ich habe ein seltsames Problem.

Und zwar bekomme ich unter Linux (Wine) immer eine Zugriffverletzung (Runtimer error 216) wenn in einem Project deine XML lib drin ist, sie muss auch nur eingebunden sein um das zu verursachen..

Was kann das sein.

himitsu 8. Sep 2009 12:21

Re: himXML (gesprochen himix ML)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dann wird es wohl ein Problem in der Initialisierung sein. :gruebel:

Da ich kein Linux bei mir und auch keine Erfahrungen mit Wine hab...

Könntest du es irgendwie debuggen?



Da es schon alleine beim Einfügen probleme gibt, dürfte das Problem wohl in der Prozedur TXMLFile.Initialize (in himXML.pas) zu suchen sein.

Dort werden im Problemfall einige Windows Funktionen verwendet.


Von den dort verwendeten Funktionen sollten TRTLCriticalSection, CopyMemory, ZeroMemory und CompareMem wohl keine Probleme machen und auch unter Wine laufen

CharLowerBuffW dürfte hottendlich auch keine Probleme machen, aber wenn es da Probleme beim Unicode (also bei den konvertierten Zeichen) gibt, wird versucht eine Log-Datei auf dem Desktop anzulegen,
wofür SHGetSpecialFolderLocation, SHGetPathFromIDList, CoTaskMemFree verwendet wird (um den Desktop zu finden).

Vielleicht weiß ja wer, ob es mit einigen der genannten Funktionen Probleme gibt.

Die Zugriffsverletzung könnte ja darauf hindeuten, daß es z.B. beim AssignFile oder schon bei der Ermittlng des Desktop-Verzeichnisses irgendwas nicht stimmt. (schon klar, da Linux ja 'nen anderen Ordneraufbau hat ... und ich schreibe ja für Windows :roll: )




*überleg* ich versuch mal ein kleines Testprojekt zu basteln, wird aber noch ein paar Minütchen dauern.


[add]
im Anhang ein Testprojekt - ist 'ne Konsolenanwendung, welche nur die Initialisierung enthält



[add]
ansonten kann ich nur erwähnen ... ich weiß aber nicht, wie lande ich noch benötigt ... daß ich fast das ganze Projekt grad umstelle und viele stellen überarbeite bzw. neu schreibe.

Das Interface der meißten Klasse bleibt aber soweit erhalten und es sollten demnach in der Verwendung keine großen Änderungen geben (hoff ich mal)

franktron 8. Sep 2009 12:44

Re: himXML (gesprochen himix ML)
 
Das ist das Ergebnis

:1
:2
:3
:4
:5
Exception: Initialize 1

pertzschc 8. Sep 2009 13:05

Re: himXML (gesprochen himix ML)
 
Hallo himitsu,
kannst Du abschätzen, ob und wann Du es noch für eine D7 verfügbar machen kannst?
Danke+Gruß,
Christoph

himitsu 8. Sep 2009 13:46

Re: himXML (gesprochen himix ML)
 
Also das mit dem Wine war es dann erstmal (in der aktuellen Version werde ich das nicht mehr ändern)
werde aber versuchen es in Nächsten zu umgehen

Der Fehler tritt also hier auf und das weißt das woll auf eine kranke/bescheuerte/defekte UnicodeTabelle seiten Linux oder Wine hin.
Genauer gesagt auf eine Doppel/-belegung oder anders ausgerückt Groß- und Kleinschreibung stimmen nicht überein.
Delphi-Quellcode:
// copy uppercase chars + check for lower/upper collisions + create check char list
// + fill non-upper/lower chars (#0)
For C := Low(Chars) to High(Chars) do Begin
  If Chars2[C] <> C Then
    If Chars[C] = 0 Then Chars[C] := Chars2[C]
    Else Raise Exception.Create('Initialize 1');
  Chars2[C] := C;
  If Chars[C] = 0 Then Chars[C] := C;
End;

Aber nochmal zu dem Runtimfehler 216:
hast du die SysUtils vor himXML in dein Projekt eingefügt, oder erst danach, bzw. garnicht?


Und das mit dem Delphi 7 werd' ich dann sehn, aber jedenfalls werden (wenn es denn klappt) dort einige Funktionen verschwinden, da ich nicht alles so umschreiben kann/will, daß es dann auch da läuft (das wäre einfach zuviel Aufwand).

franktron 8. Sep 2009 13:48

Re: himXML (gesprochen himix ML)
 
SysUtils ist als erstes im Project

P.S. wenn ich disen Block raus nehme läuft alles

himitsu 8. Sep 2009 13:59

Re: himXML (gesprochen himix ML)
 
Zitat:

Zitat von franktron
P.S. wenn ich disen Block raus nehme läuft alles

Das Problem ist nur, daß über diese Blöcke die Groß-/Kleinschreibung im Projekt geregelt wird
und ohne diese die Stringvergleiche nicht mehr richtig arbeiten.

Ausdiesem Grunde wird ja auch in dieser Init-Prozedur so viel Verglichen und vorallem kontrolliert,
da es sonst zu unvorhersehbaren Problemen kommen kann,
wenn die Vergleichstabellen fehlerhaft sind.

Daß heißt ich muß erstmal eine alternative schaffen, da die Unicode-Tabelle definitiv defekt ist und sich auf diesen Wege da also nix machen läßt.

Das Einzige, welches du solange machen kannst, wäre zumindestens die fehlerhalften Werte zu übernehmen,
dann läuft dann wenigstens ein Großteil noch,
Delphi-Quellcode:
If Chars[C] = 0 Then Chars[C] := Chars2[C]
;//Else Raise EXMLException.CreateEx(....
aber wenn du dann eines der fehlerhaften Zeichen in deinen Texten hast (wie z.B. im Node-Text oder den Node-/Attribut-Namen), dann beschwere dich bitte nicht, wenn dort dann z.B. Einiges nicht gefunden wird oder es andersweitige Vergleichsprobleme gibt.

himitsu 8. Sep 2009 17:56

Re: himXML (gesprochen himix ML)
 
OK, hier mal eine Protierung der neuen Prozedur (ich hoffe es läuft auch so)
Delphi-Quellcode:
.
    Class Procedure TXMLFile.Initialize;
      Procedure OpenLog(Var F: TextFile);
        Var i: Integer;
          PIDL: Pointer;
          Path: Array[1..MAX_PATH] of Char;

        Begin
          If Succeeded(SHGetSpecialFolderLocation(0, 0{CSIDL_DESKTOP}, PIDL)) Then Begin
            If SHGetPathFromIDList(PIDL, @Path) Then Begin
              Try
                i := Length(ParamStr(0));
                While (i > 0) and (ParamStr(0)[i] <> '\') do Dec(i);
                AssignFile(F, String(PChar(@Path)) + '\' + Copy(ParamStr(0), i + 1, 888) + '.log');
                Try
                  {$i+}
                  Rewrite(F);
                Except
                  Raise EXMLException.Create(Self, 'Initialize', @SInternalError, [3]);
                End;
              Finally
                CoTaskMemFree(PIDL);
              End;
            End Else Begin
              CoTaskMemFree(PIDL);
              Raise EXMLException.Create(Self, 'Initialize', @SInternalError, [2]);
            End;
          End Else Raise EXMLException.Create(Self, 'Initialize', @SInternalError, [1]);
        End;

      Const toHex: Array[0..15] of Char = '0123456789ABCDEF';

      Var Chars, Chars2: Array[Word] of Word;
        C: Word;
        F: TextFile;
        i: Integer;

      Begin
        __DefaultOptions       := XMLDefaultOptions;
        __DefaultTextIndent    := ' ';
        __DefaultLineFeed      := sLineBreak;
        __DefaultValueSeperator := '=';
        __DefaultValueQuotation := '"';
        __PathDelimiter        := '\';

        InitializeCriticalSection(__ArrC_Lock);

        // create lower char list
        ZeroMemory(@Chars, SizeOf(Chars));
        For C := Low(Chars) to High(Chars) do Chars2[C] := C;
        CharLowerBuffW(@Chars2, Length(Chars));
        // copy lower blocks
        CopyMemory(@__LowerBlock0, @Chars2[Low(__LowerBlock0)], SizeOf(__LowerBlock0));
        CopyMemory(@__LowerBlock1, @Chars2[Low(__LowerBlock1)], SizeOf(__LowerBlock1));
        CopyMemory(@__LowerBlock2, @Chars2[Low(__LowerBlock2)], SizeOf(__LowerBlock2));
        CopyMemory(@__LowerBlock3, @Chars2[Low(__LowerBlock3)], SizeOf(__LowerBlock3));
        CopyMemory(@__LowerBlock4, @Chars2[Low(__LowerBlock4)], SizeOf(__LowerBlock4));
        CopyMemory(@__LowerBlock5, @Chars2[Low(__LowerBlock5)], SizeOf(__LowerBlock5));
        CopyMemory(@__LowerBlock6, @Chars2[Low(__LowerBlock6)], SizeOf(__LowerBlock6));
        CopyMemory(@__LowerBlock7, @Chars2[Low(__LowerBlock7)], SizeOf(__LowerBlock7));
        CopyMemory(@__LowerBlock8, @Chars2[Low(__LowerBlock8)], SizeOf(__LowerBlock8));
        CopyMemory(@__LowerBlock9, @Chars2[Low(__LowerBlock9)], SizeOf(__LowerBlock9));
        CopyMemory(@__LowerBlockA, @Chars2[Low(__LowerBlockA)], SizeOf(__LowerBlockA));
        // copy lowercase chars
        For C := Low(Chars) to High(Chars) do Begin
          If Chars2[C] <> C Then Chars[C] := Chars2[C];
          Chars2[C] := C;
        End;
        // create upper char list
        For C := Low(Chars) to High(Chars) do Chars2[C] := C;
        CharUpperBuffW(@Chars2, Length(Chars));
        // copy uppercase chars + check for lower/upper collisions + create check char list
        // + fill non-upper/lower chars (#0)
        For C := Low(Chars) to High(Chars) do Begin
          If Chars2[C] <> C Then
            If Chars[C] <> 0 Then Begin
              __CompareBlock0[Low(__CompareBlock0)] := #0;
              OpenLog(F);
              Try
                WriteLn(F, '>>> himXML - initialize error <<<');
                WriteLn(F, 'please contact the software distributor');
                WriteLn(F, 'file:');
                WriteLn(F, ' ', ParamStr(0));
                WriteLn(F, 'date:');
                WriteLn(F, ' ', DateTimeToStr(Now));
                WriteLn(F, 'info:');
                WriteLn(F, ' C        = #', Ord(C));
                WriteLn(F, ' Chars2[C] = #', Ord(Chars2[C]));
                WriteLn(F, ' Chars[C] = #', Ord(Chars[C]));
                WriteLn(F);
                WriteLn(F, '*end*');
              Finally
                CloseFile(F);
              End;
              Exit;
            End Else Chars[C] := Chars2[C];
          Chars2[C] := C;
          If Chars[C] = 0 Then Chars[C] := C;
        End;
        // copy upper/lower blocks
        CopyMemory(@__CompareBlock0, @Chars[Low(__CompareBlock0)], SizeOf(__CompareBlock0));
        CopyMemory(@__CompareBlock1, @Chars[Low(__CompareBlock1)], SizeOf(__CompareBlock1));
        CopyMemory(@__CompareBlock2, @Chars[Low(__CompareBlock2)], SizeOf(__CompareBlock2));
        CopyMemory(@__CompareBlock3, @Chars[Low(__CompareBlock3)], SizeOf(__CompareBlock3));
        CopyMemory(@__CompareBlock4, @Chars[Low(__CompareBlock4)], SizeOf(__CompareBlock4));
        CopyMemory(@__CompareBlock5, @Chars[Low(__CompareBlock5)], SizeOf(__CompareBlock5));
        CopyMemory(@__CompareBlock6, @Chars[Low(__CompareBlock6)], SizeOf(__CompareBlock6));
        CopyMemory(@__CompareBlock7, @Chars[Low(__CompareBlock7)], SizeOf(__CompareBlock7));
        CopyMemory(@__CompareBlock8, @Chars[Low(__CompareBlock8)], SizeOf(__CompareBlock8));
        CopyMemory(@__CompareBlock9, @Chars[Low(__CompareBlock9)], SizeOf(__CompareBlock9));
        CopyMemory(@__CompareBlockA, @Chars[Low(__CompareBlockA)], SizeOf(__CompareBlockA));
        // "delete" upper/lower blocks from char list
        CopyMemory(@Chars2[Low(__CompareBlock0)], @__CompareBlock0, SizeOf(__CompareBlock0));
        CopyMemory(@Chars2[Low(__CompareBlock1)], @__CompareBlock1, SizeOf(__CompareBlock1));
        CopyMemory(@Chars2[Low(__CompareBlock2)], @__CompareBlock2, SizeOf(__CompareBlock2));
        CopyMemory(@Chars2[Low(__CompareBlock3)], @__CompareBlock3, SizeOf(__CompareBlock3));
        CopyMemory(@Chars2[Low(__CompareBlock4)], @__CompareBlock4, SizeOf(__CompareBlock4));
        CopyMemory(@Chars2[Low(__CompareBlock5)], @__CompareBlock5, SizeOf(__CompareBlock5));
        CopyMemory(@Chars2[Low(__CompareBlock6)], @__CompareBlock6, SizeOf(__CompareBlock6));
        CopyMemory(@Chars2[Low(__CompareBlock7)], @__CompareBlock7, SizeOf(__CompareBlock7));
        CopyMemory(@Chars2[Low(__CompareBlock8)], @__CompareBlock8, SizeOf(__CompareBlock8));
        CopyMemory(@Chars2[Low(__CompareBlock9)], @__CompareBlock9, SizeOf(__CompareBlock9));
        CopyMemory(@Chars2[Low(__CompareBlockA)], @__CompareBlockA, SizeOf(__CompareBlockA));
        // check for chars out of upper/lower blocks
        If not CompareMem(@Chars, @Chars2, SizeOf(Chars)) Then Begin
          __CompareBlock0[Low(__CompareBlock0)] := #0;
          OpenLog(F);
          Try
            WriteLn(F, '>>> himXML - initialize error <<<');
            WriteLn(F, 'please contact the software distributor');
            WriteLn(F, 'file:');
            WriteLn(F, ' ', ParamStr(0));
            WriteLn(F, 'date:');
            WriteLn(F, ' ', DateTimeToStr(Now));
            WriteLn(F, 'chars:');
            For C := Low(Chars) to High(Chars) do
              If Chars[C] <> Chars2[C] Then Begin
                Write(F, ' ');
                For i := 3 downto 0 do Write(F, toHex[(C shr (i * 4)) and $0F]);
                Write(F, ' [', C:5, ']: ');
                For i := 3 downto 0 do Write(F, toHex[(Ord(Chars[C]) shr (i * 4)) and $0F]);
                Write(F, ' ');
                For i := 3 downto 0 do Write(F, toHex[(Ord(Chars2[C]) shr (i * 4)) and $0F]);
                WriteLn(F);
              End;
            WriteLn(F);
            WriteLn(F, '*end*');
          Finally
            CloseFile(F);
          End;
        End;
      End;
> hab nur die wichtigen Teile rübergezogen und in die alte Initprozedur eingefügt
> und konnte es jetzt noch nicht testen

himitsu 10. Sep 2009 14:11

Re: himXML (gesprochen himix ML)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaub mein neuer XML-Reader ist fast fertig.

Hab das Parsen der Datei aus TXMLFile rausgelöst und werde die nächsten Tage in die anderen Klassen dann den Reader einbinden ... somit haben dann alle Klassen (vorallem TXMLFile und TSAXFile) den selben Parser im Hintergrund und nicht jeder seine eigene Version.

Dieser parst allerdings nur die Datei und ihn interessiert die Verschachtelung überhaupt nicht.

Im Ganzen hochladen kann/möchte ich das Projekt jetzt nicht, da dort noch zuviel nicht wieder geht bzw. einfach schlimm aussieht.

Die EXE im Anhang enthält diesen Code
Delphi-Quellcode:
Var C: LongWord;
  S: WideString;
  R: TXReader;
  F: TStream;
  SL: TStringList;

C := GetTickCount;
S := '';
F := TFileStream.Create('test.xml', fmOpenRead);
R := TXReader.Create(F, [], #13#10);
SL := TStringList.Create;
Try
  While R.Parse do Begin
    Case R.DataType of
      xdInstruction: Begin
                        SL.Add(S + 'xdInstruction:  Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdTypedef:     Begin
                        SL.Add(S + 'xdTypedef:  Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdElement:     Begin
                        SL.Add(S + 'xdElement:  Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdCData:       Begin
                        SL.Add(S + 'xdCData:  Name="' + R.Name + '"');
                        Insert(' ', S, 1);
                      End;
      xdComment:     Begin
                        SL.Add(S + 'xdComment:  -');
                        Insert(' ', S, 1);
                      End;
      xdAttribute:   SL.Add(S + 'xdAttribute:  Name="' + R.Name + '"  Value="' + R.Value + '"');
      xdEndAttribute: SL.Add(S + 'xdEndAttribute:  -');
      xdText:        SL.Add(S + 'xdText:  Value="' + R.Value + '"');
      xdClose:       Begin
                        Delete(S, 1, 2);
                        SL.Add(S + 'xdClose:  Name="' + R.Name + '"');
                      End;
      xdCloseSingle: Begin
                        Delete(S, 1, 2);
                        SL.Add(S + 'xdCloseSingle:  -');
                      End;
    End;
    If GetTickCount - C > 15000 Then Begin
      SL.Add('> TimeOut <');
      Break;
    End;
  End;
  SL.Add('> ' + IntToStr(GetTickCount - C) + ' ms <');
  //Memo1.Lines.Assign(SL);
  Memo1.Lines.BeginUpdate;
  Try
    c := GetTickCount;
    i := 0;
    While i < SL.Count do Begin
      Memo1.Lines.Add(SL[i]);
      If (GetTickCount - C > 45000) and (i + 20 < SL.Count) Then Begin
        Memo1.Lines.Add('');
        Memo1.Lines.Add('...');
        Memo1.Lines.Add('');
        For i := SL.Count - 20 to SL.Count - 1 do
          Memo1.Lines.Add(SL[i]);
        Break;
      End;
      Inc(i);
    End;
  Finally
    Memo1.Lines.EndUpdate
  End;
Finally
  SL.Free;
  R.Free;
  F.Free;
End;
und macht aus dem
XML-Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="selfxml.xsl" type="text/xsl" ?>
<Programm>
  <Information>
    <Name>Hans Wurst</Name>
    <Datum>01.10.2009</Datum>
  </Information>
</Programm>
dieses hier
Code:
xdInstruction:  Name="xml"
  xdAttribute:  Name="version"  Value="1.0"
  xdAttribute:  Name="encoding"  Value="ISO-8859-1"
xdCloseSingle:  -
xdInstruction:  Name="xml-stylesheet"
  xdAttribute:  Name="href"  Value="selfxml.xsl"
  xdAttribute:  Name="type"  Value="text/xsl"
xdCloseSingle:  -
xdElement:  Name="Programm"
  xdEndAttribute:  -
  xdElement:  Name="Information"
    xdEndAttribute:  -
    xdElement:  Name="Name"
      xdEndAttribute:  -
      xdText:  Value="Hans Wurst"
    xdClose:  Name="Name"
    xdElement:  Name="Datum"
      xdEndAttribute:  -
      xdText:  Value="01.10.2009"
    xdClose:  Name="Datum"
  xdClose:  Name="Information"
xdClose:  Name="Programm"
> 0 ms <
(eine 29 MB-Datei wird bei mir innerhalb von 2375 ms in die StringListe eingelesen)

falls wer zufällig erkennt, daß da bei seinen Dateien (es wird eine Datei Namens "test.xml" im Programmverzeichnis geladen) irgendwas nicht stimmen kann, so möge er/sie sich bitte melden.

[edit]
ich merk grad, daß bei Kommentaren und Dergleichen der Text falsch gelesen wird :shock:
[edit2]
ich hoff der Fehler ist jetzt behoben
[edit3]
die Gesamtlaufzeit ist auf eine Minute begrenzt wurden
maximal 15 Sekunden Lesen und 45 Sekunden zum füllen des Memos (nicht daß das Programm "ewig" läuft)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Seite 15 von 35   « Erste     5131415 161725     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