Seite 1 von 1

Speicherbereich ins Editorgadget streamen

Verfasst: 08.05.2009 04:44
von ts-soft
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:

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
Verbesserungsvorschläge, die auch Funktionieren werden gerne
entgegengenommen :wink:

//edit
Hab gerade gesehen, im CodeArchiv gibts ne kürzere Form mit einer
Shared Variabblen :oops:
(Ich finde meins eleganter :mrgreen: )

Verfasst: 10.05.2009 19:58
von Andesdaf
ts-soft hat geschrieben:Hab gerade gesehen, im CodeArchiv gibts ne kürzere Form mit einer
Shared Variabblen :oops:
Naja, jetzt haben wir's hier nochmal
zum nachgucken :wink:

Könnte mir mal nützlich sein, danke.

Verfasst: 10.05.2009 20:09
von ts-soft
Die Version im CodeArchiv funktioniert auch nur mit RTF, diese geht mit
Text :wink: und schmeißt auch nur exakt soviel Text ins Gadget, wie im
Speicher ist.

Verfasst: 12.05.2009 16:16
von Andesdaf
ts-soft hat geschrieben:Die Version im CodeArchiv funktioniert auch nur mit RTF, diese geht mit
Text :wink: und schmeißt auch nur exakt soviel Text ins Gadget, wie im
Speicher ist.
Und diese Version sieht auch schöner aus :wink: