Delphi-PRAXiS
Seite 17 von 35   « Erste     7151617 181927     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 21. Sep 2009 11:22

Re: himXML (gesprochen himix ML)
 
OK, waren zwar mehr, als nur ein paar Minuten,

aber was sind schon fast genau 2277 Minütchen :angel2:

Nja, zumindestens kompiliert es wieder unter D2006 (TDE) und vermutlich auch unter D2007 (welches ich nicht zur Hand hab).

holliesoft 21. Sep 2009 11:58

Re: himXML (gesprochen himix ML)
 
Zitat:

Zitat von himitsu
Nja, zumindestens kompiliert es wieder unter D2006 (TDE) und vermutlich auch unter D2007 (welches ich nicht zur Hand hab).

Werde ich nachher gleich mal probieren :-)

// Edit: Ja, es kompiliert mit Delphi2007 :-)

Gruß
Patrick

himitsu 21. Sep 2009 14:26

Re: himXML (gesprochen himix ML)
 
Zitat:

Zitat von holliesoft
// Edit: Ja, es kompiliert mit Delphi2007 :-)

:firejump:

ja und in Delphi 2010 läuft es nun ebenfalls

Außerdem hab ich die entsprechenden Stellen so angepaßt, daß ich nun z.B. die Größenangabe eines Arrays vornehm, anstatt Array[TTypeKind], womit es bei zukünftigen Erweiterungen der RTTI weiterhin funktioniert.
Und wenn einer Erweiterung/Änderung erkannt wird, dann wird eine Compilerwarnung ausgegeben und mit nur den bekannten Typen gearbeitet, anstatt da die Compilierung abbricht.

Mithrandir 6. Okt 2009 13:42

Re: himXML (gesprochen himix ML)
 
himi,

irgendwat passt da bei der TXMLIniFile nicht, oder ich bin schlicht zu doof:

Wenn ich einen DateTime-Wert auslesen will, bekomme ich dit hier:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt dghb.exe ist eine Exception der Klasse EVariantTypeCastError mit der Meldung 'Variante des Typs (OleStr) konnte nicht in Typ (Double) konvertiert werden' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Der Fehler tritt hier auf:
Delphi-Quellcode:
  Function TXMLIniFile.ReadDateTime(Const Section, Ident: String; Default: TDateTime): TDateTime;
    Begin
      If ValueExists(Section, Ident) Then
        Try
          Result := _XML.RootNode.Nodes['section>name=' + Section].Nodes['ident>name=' + Ident].Text; //<= Kaboom.. :P
        Except
          Result := Default;
        End
      Else Result := Default;
    End;
Der Key sieht so aus:

XML-Code:
  <section name="Overview">
    <ident name="DoUseLastTimeSpan">True</ident>
    <ident name="FromDate">2009-06-06T12-04-43.687</ident>
    <ident name="ToDate">2009-10-06T12-04-43.687</ident>
    <ident name="DateSelection">7</ident>
  </section>
Gelesen wird so:

Delphi-Quellcode:
fFromDate := fXMLIni.ReadDateTime('Overview', 'FromDate', Now);
    fToDate := fXMLIni.ReadDateTime('Overview', 'ToDate', Now);
Geschrieben so:
Delphi-Quellcode:
    fXMLIni.WriteDateTime('Overview', 'FromDate', fFromDate);
    fXMLIni.WriteDateTime('Overview', 'ToDate', fToDate);
Und manchmal tritt dieser Fehler auf:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt dghb.exe ist eine Exception der Klasse EFCreateError mit der Meldung 'Datei "C:\Dokumente und Einstellungen\Daniel\Eigene Dateien\Borland Studio-Projekte\dgHaushaltsbuch\bin\settings.xml" kann nicht erstellt werden. Der Vorgang ist bei einer Datei mit einem geöffneten Bereich, der einem Benutzer zugeordnet ist, nicht anwendbar' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Allerdings nur sporadisch... :gruebel:


Und nu' kommst du. :stupid:

himitsu 6. Okt 2009 15:14

Re: himXML (gesprochen himix ML)
 
Ups, kennst du das Problem, wenn man 'ne Indexzählung umstellt und sich dann verzählt? :oops:
Das Ergebnis war, daß die TDateTime-Werte nimmer von ihrer XML-Darstellung in ein passendes Format umgewandelt wurden :wall:
Delphi-Quellcode:
// diese Funktionen in der himXML.pas einfach ändern
    Class Function TXHelper.isXMLDateTime(Const S: TWideString): Boolean;
      Var P, i, i2, i3: Integer;
        D:             TDateTime;

      Begin
        P := 0;
        If (Length(S) >= P + 10) and (S[P + 5] = '-') and (S[P + 8] = '-')
            and TryStrToInt(Copy(S, P + 1, 4), i) and TryStrToInt(Copy(S, P + 6, 2), i2)
            and TryStrToInt(Copy(S, P + 9, 2), i3) and TryEncodeDate(i, i2, i3, D) Then
          Inc(P, 10);
        If (Length(S) >= P + 9) and (S[P + 1] = 'T') and (((S[P + 4] = '-') and (S[P + 7] = '-'))
            or ((S[P + 4] = ':') and (S[P + 7] = ':')))
            and TryStrToInt(Copy(S, P + 2, 2), i) and TryStrToInt(Copy(S, P + 5, 2), i2)
            and TryStrToInt(Copy(S, P + 8, 2), i3) and TryEncodeTime(i, i2, i3, 0, D) Then
          Inc(P, 9);
        If (Length(S) >= P + 4) and (S[P + 1] = '.') and TryStrToInt(Copy(S, P + 2, 3), i) Then
          Inc(P, 4);
        If (Length(S) >= P + 1) and (S[P + 1] = 'Z') Then
          Inc(P);
        Result := Length(S) = P;
      End;

    Class Function TXHelper.XMLToDateTime(Const S: TWideString): TDateTime;
      Var P, i, i2, i3: Integer;
        D:             TDateTime;

      Begin
        Result := 0;
        P := 0;
        If (Length(S) >= P + 10) and (S[P + 5] = '-') and (S[P + 8] = '-')
            and TryStrToInt(Copy(S, P + 1, 4), i) and TryStrToInt(Copy(S, P + 6, 2), i2)
            and TryStrToInt(Copy(S, P + 9, 2), i3) and TryEncodeDate(i, i2, i3, D) Then Begin
          Inc(P, 10);
          Result := D;
        End;
        If (Length(S) >= P + 9) and (S[P + 1] = 'T') and (((S[P + 4] = '-') and (S[P + 7] = '-'))
            or ((S[P + 4] = ':') and (S[P + 7] = ':')))
            and TryStrToInt(Copy(S, P + 2, 2), i) and TryStrToInt(Copy(S, P + 5, 2), i2)
            and TryStrToInt(Copy(S, P + 8, 2), i3) and TryEncodeTime(i, i2, i3, 0, D) Then Begin
          Inc(P, 9);
          Result := Result + D;
        End;
        If (Length(S) >= P + 4) and (S[P + 1] = '.') and TryStrToInt(Copy(S, P + 2, 3), i) Then Begin
          Inc(P, 4);
          Result := Result + (i / (24*60*60*1000));
        End;
        If (Length(S) >= P + 1) and (S[P + 1] = 'Z') Then
          Inc(P);
        If Length(S) <> P Then
          Raise EXMLException.Create(Self, 'XMLToDateTime', @SCorupptedDateTime, Copy(S, P + 1, 20));
      End;



Was das Andere betrifft ... das ist erstmal ein Fehler im FileStream, welcher meckert, daß da eine Datei nicht geöffnet werden konnte.
Problem dabei ist, daß die TWideFileStream-Klasse nur eine "Kopie" von TFileStream ist und ich da bis auf das Unicode nichts geändert hab ... erstmal möchte ich an diesem Stream natürlich nichts ändern und es würde auch nichts bringen, wenn ich da versuche etwas zu ändern. :angel2:

Aber so wie es aussieht, ist diese Datei wohl schon geöffnet und ja ... keine Ahnung was Windows da genau will.
[google]"Der Vorgang ist bei einer Datei mit einem geöffneten Bereich, der einem Benutzer zugeordnet ist, nicht anwendbar"[/google]

Mithrandir 6. Okt 2009 15:23

Re: himXML (gesprochen himix ML)
 
Zitat:

Zitat von himitsu
Ups, kennst du das Problem, wenn man 'ne Indexzählung umstellt und sich dann verzählt?

Joar, passiert mir öfters. :mrgreen:

Und mit der zweiten Meldung... Hmm... :gruebel:

himitsu 7. Okt 2009 14:45

Re: himXML (gesprochen himix ML)
 
Wie gesagt, dein 2. Problem kann ich so erstmal nicht beheben ... dafür müßte man erstmal rausbekommen, wer oder was die Datei zu diesem Zeitpunkt noch geöffnet hält und müßte dieses dann beheben.


So, die kleinen Änderungen aus Post #165 sind in den beta-Download mit eingeflossen.

Und dann wurde ein böser Fehler in der Kodierung entdeckt,
welcher beim Einlesen sozusagen das Encoding, welches im BOM angegeben ist einfach ignorierte/überschrieb.
> http://www.delphipraxis.net/internal...087324#1087324


Nun noch etwas zu Razor's Problemchen:
> UTF-16 wird halt nicht unterstützt
Wenn nun nichts UTF-16-Spezifisches vorhanden hist, dann könnte man entweder einfach das Encoding-Attribut gegen Unicode (ISO-10646-UCS-2) austauschen
XML-Code:
<?xml version="1.0" encoding="ISO-10646-UCS-2" ?>
oder dieses, mit ein paar kleinen Änderungen, einfach als Unicode parsen lassen :angel2:
Delphi-Quellcode:
{Zeile 584}
{alt} TXMLEncoding = (xeUTF7, xeUTF8, {xeUTF16,} xeUnicode, xeUnicodeBE, ...
{neu} TXMLEncoding = (xeUTF7, xeUTF8, xeUTF16, xeUnicode, xeUnicodeBE, ...

{Zeile 1515}
{alt} //({xeUTF16} Encoding: 'UTF-16'; CodePage: 1200; CharSize: 2),
{neu}   ({xeUTF16} Encoding: 'UTF-16'; CodePage: 1200; CharSize: 2),

{Zeile 8431}
{alt} xeUnicode, xeUnicodeBE:
{neu} xeUnicode, xeUnicodeBE, xeUTF16:

{Zeile 9106}
{alt} xeUnicode, xeUnicodeBE: Begin
{neu} xeUnicode, xeUnicodeBE, xeUTF16: Begin
! Zeilenangaben entsprechen der Version v0.98 beta von heute (07.10.2009 14³°)

Razor 7. Okt 2009 15:10

Re: himXML (gesprochen himix ML)
 
Sorry to ask but does is matter whats in the header of the xml file ?

I got this but it wont work.

Zitat:

<?xml version="1.0" encoding="UTF-16" ?>

himitsu 10. Okt 2009 11:24

Re: himXML (gesprochen himix ML)
 
Zitat:

Zitat von Razor
Zitat:

<?xml version="1.0" encoding="UTF-16" ?>

wir gesagt, UTF-16 gibt es so direkt noch nicht

indirekt existiert es schon lange, und theoretisch sollte es auch keine Probleme geben,
da ich aber z.B. das UTF-8 nicht nach UTF-16 umwandle und ansonsten auch alles nur als normales Unicode (alles nur 16-Bit-Einzelzeichen) behandle, hatte ich es einfach nicht direkt "freigegeben".

Zwoetzen 22. Okt 2009 18:40

Re: himXML (gesprochen himix ML)
 
So, nachdem ich nun wieder etwas mehr Zeit habe, bin ich auch mal wieder dazu gekommen, mein XML-Projekt weiterzubasteln.

Ich habe diesbezüglich mal eine allgemeinere Frage:
Was kann man nun genau alles angeben, wenn man auf einen (tieferen) Knoten zugreifen will?

Folgendes konnte ich schon (durch den Thread hier) herausfinden
Delphi-Quellcode:
Node['tag1\tag2\tag3']; // Ineinander verschachtelte Tags
Node['tag1[2]']; // Den 3. Tag mit dem Namen tag1 im aktuellen Knoten
Irgendwo hatte ich aber auch gelesen, dass man mit
Delphi-Quellcode:
Node['tag1>attr=value']
den tag1 auswählen können soll, der als Attribut attr den Wert value hat. Das hat bei mir aber irgendwie nicht funktioniert, oder habe ich da etwas falsch verstanden?

Wäre nett, wenn du da eine Art Übersicht machen könntest ;)
(Falls eine solche existiert, dann habe ich sie noch nicht gefunden, ein Link reicht dann ^^)

MfG Zwoetzen


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr.
Seite 17 von 35   « Erste     7151617 181927     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