MEMORY Object Updated: Sep 5, 2009 The MEMORY object creates a RAM space often called a data "stream" which can be used for about any computing purpose one might think of. MEMORY properties and methods enable creation and manipulation of blocks of data. Please see hotmem.bas for example code. As with FILE and other HotBasic stream objects, read and write methods get or put data from the current .Position and when complete, set the .Position to the first byte after the data transferred. HotBasic opens the flood gates. All LIST properties and methods can be used on MEMORY or STRING objects. And MEMORY properties and methods can be used on any dimensioned STRING, LIST, or ARRAY. Why? We love you. PROPERTIES (Read/Write): ~~~~~~~~~~ ~~~~~~~~~~~~~ Length Length in bytes of LIST. MemLength = MyMem.Length IF MyMem.Length THEN 'Memory is not empty MyMem.Length = x 'only if x <= MyMem.Ram Position Current position for next read/write MyMem.Position = x 'only if x <= MyMem.Length Size Length in bytes of LIST Note: .Size and .Length refer to the same property item updated as writes are done. Hence, a reduced .Length can be assigned for a particular purpose, such as saving only an initial portion of the data. However, such a changed .Length property should not be expected to remain unchanged after further programmatic writes. PROPERTIES (Read Only String): ~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ ReadBinStr (bytes) Same as .ReadStr ReadLine Reads line at current position For sequential retrieval of crlf-delimited items from any .Position, .ReadLine should be faster, expecially for long streams, since it does not require the step of locating the item based on index. ReadStr (bytes) Reads bytes number of bytes Note: bytes may be a variable, expression or immediate value. PROPERTIES (Read Only Numeric): ~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~ Handle Memory handle of object stream data ItemCount Item count of object stream; same as .LineCount ItemUDT (index) Reads UDT item at 0-based index; alias for .UDTItem LineCount Line count of object stream Pointer Address of object stream data Ram Bytes of memory currently allocated for stream use Note: If more memory is required, it is automatically allocated as write methods add data to the stream object. Use of .Clear or .Close is recommended when computing is completed on large streams to free memory that is not immediately used further by the application. After .Close, the dimensioned stream still exists for further use. ReadNum (bytes) Reads bytes number of bytes Note: Bytes read are assigned to number which can be any numerical data type. Bytes should generally agree with the destination value length. UDTItem (index) Reads UDT item at 0-based index MyUDT = MyMemory.UDTItem(3) 'get UDT at 0-based index 3 .ReplaceUDT() and .UDTItem() allow random write/read access respectively, to UDTs previously written into a MEMORY stream. The index must be less than MyMemory.Length/sizeof(MyUDT) METHODS Arguments & Comments ~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ Append Appends result of one or more string expressions $APPTYPE CONSOLE: $TYPECHECK ON defstr a$, b$ a$ = "HotBasic" b$ = "the Gold Standard" a$.Append space, b$, " for best executables" print a$ PAUSE .Append is faster than the logically equivalent a$ = a$ + space + b$ + " for best exectables" which is done in two steps: create concatenated string which is then assigned to the destination variable (a$ above). AppendUDT Appends one or more UDTs starting at the current .Position. Similar to .Append, except the arguments are UDTs, not STRINGs. Clear Clears data and frees allocated RAM if > about 256 bytes. E.g., s$.Clear 'same as s$="" or s$=NULL Close Clears data; same as .clear CopyFrom (stream, bytes) Copies bytes from stream Note: stream may be a STRING, MEMORY, ARRAY, LIST or FILE. Data copied starts at the .Position property of the source stream. Decrypt Decrypts data Encrypt Encrypts data Note: an optional key argument -- any numeric expression -- may be used with .Encrypt and .Decrypt. MyMemory.Encrypt key 'code MyMemory.Decrypt key 'same key value as used with .Encrypt ExtractRes (resource) Extracts resource to .Position in stream object Note: resource may be (1) Resource(n) where n is an immediate integer or (2) a quoted string for the resource descriptor used in $RESOURCE. Initialize (bytes) Allocate object's buffer size to be > bytes. Example: MyMemory.Initialize 1024 sets MyMemory.Length = 0, MyMemory.RAM > 1024, and all bytes = 0. .Initialize is typically used to set a minimum buffer size to use the object's address (@MyMemory) as an argument for a procedure. Notice that, if a procedure (e.g., an API) puts data into MyMemory, the application needs to set MyMemory.Length accordingly to the size of the data inserted, else your application will continue to think that there is no data. LoadArray (array) Read array into object stream LoadFromFile (filename$) Loads filename$ to current position LoadFromHandle + (mem_obj_handle, bytes) Read bytes of data from a memory object identified by its handle. If bytes is 0, .LoadFromHandle assumes the data is a text string and uses the LEN function to set bytes to load. If successful, .LoadFromHandle replaces object stream data with memory object data. MyMem.LoadFromHandle mem_obj_handle, bytes Note: a mem_obj_handle is often obtained from the OS. E.g., PRINTER and PRINTDIALOG return such handles in .DevNames and .DevMode properties. $DEFINE dmLogPixels 116 DEFSTR devmode DEFWORD LogPixels PRINTER.Dialog devmode.LoadFromHandle PRINTER.DevMode, 140 devmode.Position = dmLogPixels 'from devmode.inc LogPixels = devmode.ReadNum(2) PRINT "LogPixels = "; LogPixels MemCopyFrom (stream, bytes) Copies bytes from object stream to argument stream MemCopyTo (stream, bytes) Copies bytes from argument stream to object stream Note: .CopyFrom, .MemCopyFrom and .MemCopyTo all copy bytes from the current position of the source stream. However, .CopyFrom writes bytes to the destination current .Position, while .MemCopyFrom and .MemCopyTo both write to .Position = 0 in the destination stream. Read (var) Reads var from object stream ReadUDT (UDT) Reads UDT from object stream ReplaceUDT (index, UDT) Replace 0-based index item with UDT. MyMemory.Replace 3, MyUDT '0-based item 3 replaced with MyUDT .ReplaceUDT() and .UDTItem() allow random write/read access respectively, to UDTs previously written into a MEMORY stream. The index must be less than MyMemory.Length/sizeof(MyUDT) SaveArray (array) Writes array from object stream to array SaveToFile (filename$) Save MEMORY to filename$ If filename$ exists, filename$ is overwritten. SaveToStream (stream) Save MEMORY to stream starting at stream .Position Seek (position) Sets .Position; Same as .Position = Write (var) Writes var to object stream WriteBinStr (string$, bytes) Writes bytes from string$ WriteLine (string$) Writes string$ appending CRLF WriteNum (var, bytes) Writes var as bytes of data WriteStr (string$, bytes) Writes bytes from string$ WriteUDT (UDT) Writes UDT to object stream ########### Note: Any dimensioned STRING may utilize any of the above properties and methods. E.g., s$.length is faster than LEN(s$). The former just reads the .Length property; the latter evaluates the length by looking for the first null byte as would be customary for text-only string data. + PentHouse registered version Copyright 2003-2009 James J Keene PhD Original Publication: Oct 9, 2003