Speicherbereich ins Editorgadget streamen
Verfasst: 08.05.2009 04:44
Das Beispiel, wie man Dateien ins EditorGadget streamt kennen die meisten
( http://www.purearea.net/pb/CodeArchiv/G ... ad+save.pb )
ja, hier die Version für Memorybereiche:
Verbesserungsvorschläge, die auch Funktionieren werden gerne
entgegengenommen
//edit
Hab gerade gesehen, im CodeArchiv gibts ne kürzere Form mit einer
Shared Variabblen
(Ich finde meins eleganter
)
( http://www.purearea.net/pb/CodeArchiv/G ... ad+save.pb )
ja, hier die Version für Memorybereiche:
Code: Alles auswählen
; PB 4.xx
; Target OS Windows
; Author: Thomas <ts-soft> Schulz
; Datei im Speicher ins EditorGadget streamen.
; Vorteil: schneller als PeekS und SetGadgetText, 0-bytes o. ä. landen auch im Gadget
; Prinzip entspricht den Beispielen, wie man Dateien ins EditorGadget streamt,
; hier lediglich mit Memorybereichen
EnableExplicit
Procedure StreamMemoryIn_Callback(dwCookie, pbBuff, cb, *pcb.Integer)
Static offset = 0
If offset + cb <= MemorySize(dwCookie)
; wir kopieren genau soviel, wie der editorbuffer (pbBuff) groß (cb) ist
CopyMemory(dwCookie + offset, pbBuff, cb)
offset + cb ; offset aktualisieren
*pcb\i = cb ; soviel haben wir kopiert
Else
If offset = MemorySize(dwCookie)
*pcb\i = 0 ; wir sind fertig, nichts mehr zu kopieren
offset = 0 ; zurücksetzen für nächste Datei
Else
; wir kopieren den rest, der kleiner als der editorbuffer ist
CopyMemory(dwCookie + offset, pbBuff, MemorySize(dwCookie) - offset)
*pcb\i = MemorySize(dwCookie) - offset ; soviel haben wir kopiert
offset = MemorySize(dwCookie) ; das war der rest, aber der editor ruft das callback noch einmal auf, bis wir 0 melden
EndIf
EndIf
ProcedureReturn 0
EndProcedure
Procedure Editor_StreamMemory(ID, *mem)
Protected StreamData.EDITSTREAM
StreamData\dwCookie = *mem
StreamData\dwError = #Null
StreamData\pfnCallback = @StreamMemoryIn_Callback()
SendMessage_(GadgetID(ID), #EM_STREAMIN, #SF_TEXT, @StreamData)
EndProcedure
; blödes Beispiel, aber besser als keins ;)
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "void", #PB_Window_SystemMenu)
EditorGadget(0, 0, 0, 640, 480)
Define *mem = AllocateMemory(?readme_end - ?readme_start)
If *mem
CopyMemory(?readme_start, *mem, MemorySize(*mem))
Editor_StreamMemory(0, *mem)
FreeMemory(*mem)
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
readme_start: IncludeBinary #PB_Compiler_Home + "SDK\Readme.txt" : readme_end:
EndDataSection
entgegengenommen

//edit
Hab gerade gesehen, im CodeArchiv gibts ne kürzere Form mit einer
Shared Variabblen

(Ich finde meins eleganter
