I'm not looking for any credit. I'm also not up on all the revision improvements since
4.0 so this may not even be necessary to handle large text files, but works for me

Code: Select all
; Foundation for Plain Text Editor - Primary credits to reference link below
; Able to load and save plain text files exceeding native 64k byte limit
; reference> http://forums.purebasic.com/english/viewtopic.php?p=65739#65739
; ADJUST SOURCE AND DESTINATION FILES HERE BEFORE YOU EXECUTE
MyInputFile$ = "C:\apath\intest.txt"
MyOutputFile$ = "C:\apath\outtest.txt"
Enumeration
#Window_5
#HelpText_5
EndEnumeration
fontVerd7.l = LoadFont(#PB_Default,"Verdana",7)
fontVerd8.l = LoadFont(#PB_Default,"Verdana",8)
fontVerd9.l = LoadFont(#PB_Default,"Verdana",9)
fontVerd9I.l = LoadFont(#PB_Default,"Verdana",9,#PB_Font_Italic)
fontVerd10.l = LoadFont(#PB_Default,"Verdana",10)
fontVerd11.l = LoadFont(#PB_Default,"Verdana",11)
fontAri8.l = LoadFont(#PB_Default,"Arial",8)
fontAri8B.l = LoadFont(#PB_Default,"Arial",8,#PB_Font_Bold)
fontAri9.l = LoadFont(#PB_Default,"Arial",9)
fontAri9B.l = LoadFont(#PB_Default,"Arial",9,#PB_Font_Bold)
fontAri10.l = LoadFont(#PB_Default,"Arial",10)
fontAri10B.l = LoadFont(#PB_Default,"Arial",10,#PB_Font_Bold)
fontAri11.l = LoadFont(#PB_Default,"Arial",11)
fontAri11B.l = LoadFont(#PB_Default,"Arial",11,#PB_Font_Bold)
fontAri12B.l = LoadFont(#PB_Default,"Arial",12,#PB_Font_Bold)
fontCur8.l = LoadFont(#PB_Default,"Courier",8)
fontCur10B.l = LoadFont(#PB_Default,"Courier",10,#PB_Font_Bold)
fontCur11.l = LoadFont(#PB_Default,"Courier",11)
fontCur11B.l = LoadFont(#PB_Default,"Courier",11,#PB_Font_Bold)
fontCur12.l = LoadFont(#PB_Default,"Courier",12)
fontCur12B.l = LoadFont(#PB_Default,"Courier",12, #PB_Font_Bold)
fontSan10.l = LoadFont(#PB_Default,"MS Sans Serif",10)
fontSrpt18.l = LoadFont(#PB_Default,"Script",18)
Procedure.l PutText(FileOut$,sizeOut.l,outHndl.l)
*MemoryID = AllocateMemory(sizeOut+1) ; allocating a memory block + terminating 0 byte
Count.l=0
If *MemoryID ; << Else no need to FreeMemory() later.
Count.l=sizeOut
Result = SendMessage_(outHndl,#WM_GETTEXT,sizeOut+1,*MemoryID)
If CreateFile(0, FileOut$) ; we create a new text file...
WriteData(0, *MemoryID,sizeOut) ; write the entire memory block into the file
CloseFile(0) ; close file to secure written data
Else
Debug "Can't create the file!"
EndIf
FreeMemory(*MemoryID)
EndIf
ProcedureReturn Count
EndProcedure
Procedure.l GetText(FileIn.s,sizeIn.l,inHndl.l)
*MemoryID = AllocateMemory(sizeIn)
Count.l=0
If *MemoryID ; << Else no need to FreeMemory() later.
Result = SendMessage_(inHndl,#WM_GETTEXT,sizeOut+1,*MemoryID)
; Using CreateFile_ API because it allows SHARE_READ attribute.
Fhandle=CreateFile_(@FileIn,#GENERIC_READ,#FILE_SHARE_READ,#Null,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,#Null )
Result.l = ReadFile_(Fhandle,*MemoryID,sizeIn,@Count,0)
Result = SendMessage_(inHndl,#WM_SETTEXT,#Null,*MemoryID)
FreeMemory(*MemoryID)
CloseHandle_(Fhandle)
EndIf
ProcedureReturn Count ;captured during ReadFile_ API call
EndProcedure
; CREATE WINDOW AND ILLUSTRATE SAMPLE CODE
HWND5 = OpenWindow(#Window_5,10,10,640,480,"EditorGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
If HWND5
SetGadgetFont(#PB_Default,FontID(fontSan10.l))
HelpText5 = EditorGadget (#HelpText_5,3,10,635,460)
SendMessage_(HelpText5, #EM_SETTARGETDEVICE, #Null, 0) ; 0=wrap , 1up=linewidth , $FFFFFF(effectively)=wrapoff
SetGadgetColor(#HelpText_5, #PB_Gadget_BackColor, $9B9BFF)
MessageRequester("Ready.", "Set...")
; Read text file into editor gadget
MyTime.l = GetTickCount_()
fileBytes = FileSize(MyInputFile$)
If fileBytes > 0
GetText(MyInputFile$,fileBytes,HelpText5)
MyTime = GetTickCount_() - MyTime
MessageRequester("Read done.", Str(fileBytes) + " bytes Loaded in " + StrD(MyTime / 1000) + " Seconds.")
Else
MessageRequester("Say what?", "Nothing to do in 0 seconds flat.")
End
EndIf
; Write gadget text out to file
MyTime.l = GetTickCount_()
ttlChr = SendMessage_(HelpText5, #WM_GETTEXTLENGTH, 0, 0)
If ttlChr > 0
PutText(MyOutputFile$,ttlChr.l,HelpText5)
MyTime = GetTickCount_() - MyTime
MessageRequester("Write done", "Total text written was " + Str(ttlChr) + " bytes in " + StrD(MyTime / 1000) + " Seconds.")
Else
MessageRequester("Say what?", "Nothing to do in 0 seconds flat.")
EndIf
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf