Speicherbereich ins Editorgadget streamen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Speicherbereich ins Editorgadget streamen

Beitrag 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: )
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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.
Win11 x64 | PB 6.20
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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:
Win11 x64 | PB 6.20
Antworten