RichClient / Cairo (@Olaf)

28/07/2011 - 19:55 von Lothar Geyer | Report spam
Hallo Olaf,

gibt es auch eine Möglichkeit, der SVG-Parse-Routine ein Array mit
Koordinaten zu übergeben? Oder auch einen String? Ich habe meine Daten
alle in einer Datenbank und möchte sie nicht erst auf Platte schreiben,
dann einlesen und wieder löschen.

Lothar Geyer
 

Lesen sie die antworten

#1 Ulrich Korndoerfer
29/07/2011 - 01:32 | Warnen spam
Hallo Lothar,

Lothar Geyer schrieb:
Hallo Olaf,

gibt es auch eine Möglichkeit, der SVG-Parse-Routine ein Array mit
Koordinaten zu übergeben? Oder auch einen String? Ich habe meine Daten
alle in einer Datenbank und möchte sie nicht erst auf Platte schreiben,
dann einlesen und wieder löschen.



Stellvertretend meine Antwort:

Die Signatur von cSVG.ParseContent lautet (wie aus dem Objektbrowser der
IDE ersichtlich):

Public Sub ParseContent(ByRef FileNameOrBytes As Variant, _
Optional ByRef CssDef As String)

Also ist es offensichtlich (schließlich lautet der Name des ersten
Parameters FileNameOrBytes), daß wahlweise ein Dateipfad oder ein
Bytearray übergeben werden kann. Ok, die Namenswahl für den ersten
Parameter ist insofern unglücklich, weil offensichtlich ein Dateipfad
übergeben werden muß, ein Dateiname reicht nicht.

Man kann also wahlweise einen Dateipfad übergeben, dann wird der Inhalt
der Datei durch cSVG gelesen und als String im SVG-Format interpretiert.
Oder man übergibt den Inhalt als String in Form eines Bytearrays
direkt, zB wie folgt:

Variante A)

Dim SVG As cSVG, FilePath As String
Dim FNr As Long, B() As Byte

FNr = FreeFile
Open FilePath For Binary Access Read As FNr
ReDim B(0 To LOF(FNr) - 1)
Get FNr, , B
Close FNr
Set SVG = New cSVG
SVG.ParseContent B

Natürlich kann das Bytearray auch aus einer Datenbank heraus gefüllt
werden. Oder, sollte man den SVG-Inhalt als Typ String vorliegen haben,
muß man vorher den String in ein Bytearray umwandeln:

Variante B)

Dim SVG As cSVG, FilePath As String, FileContent As String
Dim FNr As Long, B() As Byte

FNr = FreeFile
Open FilePath For Binary Access Read As FNr
FileContent = Space$(LOF(FNr))
Get FNr, , FileContent
Close FNr
Set SVG = New cSVG
B = SVGContent
SVG.ParseContent B

Das funktioniert natürlich nicht, wenn der Dateinhalt mit GZip
komprimiert wurde. SVG-Dateien mit der Endung svgz sind so komprimierte
Dateien. Mit Bytearrays geht das natürlich, deshalb verwendet
ParseContent ja Bytearrays statt Strings (ein zweiter Grund ist, daß
ParseContent bei Bytearrays unterscheiden kann, ob ein String oder ein
Bytearray übergeben wurde und dann das Übergebene als Dateipfad oder
Dateinhalt interpretieren kann).

Also zusammenfassend:

- SVG Bilder werden durch Text im XML-Format beschrieben.
Eine typische Anfangszeile ist:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
- Der Text kann in ANSI, UTF8 oder 16Bit UNICODE kodiert sein.
- Zusàtzlich kann der Text per GZip komprimiert worden sein.
- Eine SVG-Datei kann demgemàß Text im ANSI, UTF8 oder UNICODE
enthalten oder per GZip komprimierten Text im ANSI, UTF8 oder
UNICODE Format.
- ParseContent kann mit einem Bytearray als erstem Parameter aufgerufen
werden.
- Das Bytearray kann entweder das SVG Bild als Text enthalten oder
den per GZip komprimierten Text.

Leider nicht dokumentiert oder "erratbar" ist, ob bei nicht
komprimiertem Text ein Bytearray mit ANSI oder UNICODE Zeichen erwartet
wird. Ausprobieren zeigt, daß anscheinend beides möglich ist und cSVG
intern ermittelt, welches Format vorliegt.

Dies sei etwas weiter ausgeführt:

Gegeben sei eine Datei mit ANSI-Kodierung, zum Beispiel die Datei
arc-simple.svg (aus dem Cairo-Tutorial von Datenhaus):

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/...">
<svg width="12cm" height="5.25cm" viewBox="0 0 1200 400"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<title>Example arcs01 - arc commands in path data</title>
<desc>Picture of a pie chart with two pie wedges and
a picture of a line with arc blips</desc>
<rect x="1" y="1" width="1198" height="398"
fill="none" stroke="blue" stroke-width="1" />
<path d="M300,200 h-150 a150,150 0 1,0 150,-150 z"
fill="red" stroke="blue" stroke-width="5" />
<path d="M275,175 v-150 a150,150 0 0,0 -150,150 z"
fill="yellow" stroke="blue" stroke-width="5" />
<path d="M600,350 l 50,-25
a25,25 -30 0,1 50,-25 l 50,-25
a25,50 -30 0,1 50,-25 l 50,-25
a25,75 -30 0,1 50,-25 l 50,-25
a25,100 -30 0,1 50,-25 l 50,-25"
fill="none" stroke="red" stroke-width="5" />
</svg>

Mit Variante A eingelesen enthàlt das Bytearray B 1017 Bytes, davon die
ersten 3 Bytes für die ersten 3 Zeichen "<?x":

60,63,120

Mit Variante B eingelesen enthàlt das Bytearray B 2034 Bytes, davon die
ersten 6 Bytes (UNICODE!) für die ersten 3 Zeichen "<?x":

60,0,63,0,120,0

Beide Bytearrays werden von ParseContent korrekt interpretiert.

Ulrich Korndoerfer

VB tips, helpers, solutions -> http://www.prosource.de/Downloads/
MS Newsgruppen Alternativen -> http://www.prosource.de/ms-ng-umzug.html

Ähnliche fragen