Seite 1 von 1

BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 08:56
von ProgOldie
Hallo,
ich speichere in einer Datenbank BLOBs in Gestalt von Bildern. Dazu lese ich den BLOB über readData() in den Speicher und lasse ihn über catchImage() in einem Image-Gadget anzeigen. Das klappt wunderbar. (@ts-Soft:Dank für das entsprechende SQLite-Tutoral Teil 2)

Nun möchte ich das Ganze in einer anderen Datenbankspalte mit einem Text-BLOB machen, der in einem EditorGadget angezeigt werden soll. Das bekomme ich nur hin, indem ich den BLOB mit writeData() in ein File schreibe und ihn dort zeilenwiese herauslese und dann ins Editor-Gadget schreibe.
a) Wie schreibe ich den BLOB auch ohne diesen Umweg direkt in das Editor-Gadget? Mir fehlt - entsprechend catchImage- so etwas wie 'catchText'.
b) Wie prüfe ich am einfachsten, ob es sich auch wirklich um Text handelt? Für ein Bild als BLOB gibt es ja das praktische isImage().


Edit: Den gleichen Umweg über ein File müsste ich auch machen, wenn ich den aus einer Datei geladenen (und evtl. im Editorgadget geänderten) Text als BLOB speichern will. Geht das nicht auch hier direkt vom Editor-Gadget direkt ins Memory?

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 09:15
von mhs
Den Text kannst du mit PeekS() direkt aus dem Speicherbereich lesen und in eine Variable speichern.

Code: Alles auswählen

Text$ = PeekS(*Speicherpuffer [, Länge [, Format]])

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 10:33
von ProgOldie
Text$ = PeekS(*Speicherpuffer [, Länge [, Format]])
Super shs, das funktioniert prima!

Dann kann ich wohl auch den umgekehrten Weg (evt. geänderten Inhalt des EditorGadgets -->BLOB) wie folgt machen:
Gesamten Inhalt des Editorgadgets lesen, zugehörigen Speicherplatz berechnen, Speicher allozieren und dann mit PeekS() in den Speicherbereich schreiben.

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 10:37
von mhs
Ja der umgekehrte Weg geht auch, da ist es dann PokeS() :wink:

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 10:43
von NicTheQuick
Aber nicht das Nullbyte am Schluss vergessen. Bei Unicode sind es zwei Nullbytes.

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 12:15
von ProgOldie
Das mit dem Nullbyte habe ich noch nicht ganz verstanden, auch weil ich schon Probleme mit der Größe des für einen String bereitgestellten Bereichs habe. Dazu folgender Code:

Code: Alles auswählen

EditGadText=GetGadgetText(Editgad)
size=SizeOf(EditGadText)
MessageRequester("Speichern",EditGadText+#LF$+"size="+Str(size))
If size
    *mem = AllocateMemory(size)
     PokeS(*mem,EditGadText,size,#PB_Ascii)
     SetDatabaseBlob(DBNr,0,*mem,size)
EndIf
Ausgegeben wird immer der richtige im EditorGadget gespeicherte Text, wobei aber die Länge immer 8 ist. Folglich werden auch nur die ersten 8 Zeichen im Blob gespeichert. Mein Fehler liegt an der falschen Verwendung von sizeof(), weil das nur angibt, wieviel Byte für ein(!) Zeichen der Kette berücksichtigt werden.
a) Wie kommt dann die 8 zustande? (eigentlich müsste es doch 1 sein, weil ASCII)
b) wie berechne ich die Länge richtig?

Code: Alles auswählen

size=SizeOf(EditGadText)*len(EditgadText)+1
Das wäre doch dann mit dem Faktor 8 viel zu groß. Und was mache ich bei Unicode? (außer dann +2)

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 12:37
von ts-soft

Code: Alles auswählen

EditGadText=GetGadgetText(Editgad)
size = StringByteLength(EditGadText, #PB_UTF8) + SizeOf(character)
MessageRequester("Speichern", EditGadText + #LF$ + "size=" + Str(size))
If size
  *mem = AllocateMemory(size)
  PokeS(*mem, EditGadText, size, #PB_UTF8)
  SetDatabaseBlob(DBNr, 0, *mem, size)
EndIf

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 12:38
von NicTheQuick
"SizeOf()" gibt dir die Größe des Datentyps zurück. Ein String ist nichts anderes als ein Pointer zu dem eigentlichen Text. Das heißt "SizeOf()" gibt dir hier die Größe des Pointers zurück. Bei einer 64-Bit-Architektur sind das eben 8 Byte.
Du brauchst "StringByteLength()" um die Länge des Strings zu erfassen.

EDIT:
ts-soft war schneller. :)

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 13:01
von NicTheQuick
ts-softs Code ist auch nicht korrekt. Natürlich fehlt da noch eine Überprüfung, ob *mem = 0 ist. Und ein 'FreeMemory()' fehlt auch.

Re: BLOB-Inhalt direkt in Editor-Gadget?

Verfasst: 27.08.2015 13:13
von ts-soft
Ich hatte soviel damit zu tun, den Code ästhetischer aufzubauen, z.B. das Leerzeichen nach jedem Komma :mrgreen: ,
das ich dann nicht mehr den Code völlig umbauen wollte, um sicherzustellen, das der Memory reserviert ist und auch
wieder freigegeben wird. <)

Man möge mir verzeihen.