Rapid-Q Documentation by William Yu (c)1999, appended by John Kelly Appendix A: QMEMORYSTREAM

 

QMEMORYSTREAM Component

QMemorystream is used to store temporary data to memory for manipulation. It can be used for dynamic arrays, or simply reducing memory after data is used.

QMemorystream Properties
Field Type R/W Default Support





LineCount INTEGER R
W

LineCount determines how many lines there are in the memorystream. Note that LineCount ignores the CR character, and will only detect LF, so it treats CRLF as one line, but LFLF as 2 lines.
Pointer INTEGER R
WXG

Pointer specifies the memory address of the memorystream.
Position INTEGER RW
WXG

Position specifies the current position of the memory pointer, any read/write operations will begin from here.
Size INTEGER RW
WXG

Size determines the number of bytes allocated to the memorystream.


QMemorystream Methods
Method Type Description Params Support





Close SUB Close the stream
Comment: If you close the memorystream, you reset the whole stream. No need to open it again (there isn't even an open method for qmemorystream), just write to the memorystream again. Alain 22 Aug 2002
0 WXG
CopyFrom SUB (Stream, Bytes%) Copy from another stream
Either QFileStream or QMemoryStream
2 WXG

Use CopyFrom to copy a QFILESTREAM or a QMEMORYSTREAM to the current memorystream.
Details:
If Bytes% = 0 then the Stream is reset to position 0 and the whole stream is then copied.
Example:
$INCLUDE "RAPIDQ.INC"
DIM File1 AS QFILESTREAM
DIM Mem AS QMEMORYSTREAM

File1.Open("test.txt", fmOpenRead)
Mem.CopyFrom(File1, 123) '-- Copy 123 bytes from File1
ExtractRes SUB (Resource AS LONG) Extract resource to memorystream 1 WXG

Extracts a resource from your program to the memorystream.
Details:
The parameter Resource is not the resource handle, but the absolute position of the resource within your file. This requires that you use the keyword Resource(n) to specify the resource number.
Example (dumping all resources):
$INCLUDE "RAPIDQ.INC"
$RESOURCE res_1 as "res.1"
$RESOURCE res_2 as "res.2"

DIM Mem AS QMEMORYSTREAM

FOR I = 0 TO ResourceCount-1
    Mem.ExtractRes(Resource(I))
NEXT
LoadArray SUB (Array(), NumElements&) Load data into array 2 WXG
MemCopyFrom SUB (Address&, Bytes&) Copies contents of Address& to memorystream 2 WXG
MemCopyTo SUB (Address&, Bytes&) Copies contents to Address& 2 WXG
Read SUB (variable) Generic Read, determines the storage space and saves data in variable 1 WXG
ReadLine FUNCTION () AS STRING Reads an entire line 0 W
ReadNum FUNCTION (Num_Type) AS DOUBLE Num_Type can be
CONST Num_BYTE = 1
CONST Num_SHORT = 2
CONST Num_WORD = 3
CONST Num_LONG = 4
CONST Num_DWORD = 5
CONST Num_SINGLE = 6
CONST Num_DOUBLE = 8
1 WXG
ReadStr FUNCTION (n) AS STRING Read n bytes, returns the string 1 WXG
ReadBinStr FUNCTION (n) AS STRING Read n bytes, returns the binary string 1 W
ReadUDT SUB (MyType) Read and store data in a MyType structure 1 WXG
SaveArray SUB (Array(), NumElements&) Save array 2 WXG
Seek SUB (Position%, From%) Seek to Position%, From% see RAPIDQ.INC 2 WXG
Write SUB (variable) Generic Write, determines the storage space and saves data to memory 1 WXG
WriteLine SUB (S AS STRING) Writes string with CR+LF 1 W
WriteNum SUB (number, bytes%) Writes a number to memory 2 WXG
WriteBinStr SUB (string, bytes%) Writes a binary string to file (slow) 2 W
WriteStr SUB (string, bytes%) Writes string to memory 2 WXG
WriteUDT SUB (MyType) Write data stored in a MyType structure 1 WXG


QMemoryStream Examples
DIM Mem AS QMemoryStream

  S$ = "Hello world!"
  Mem.WriteStr(S$, LEN(S$))
  Mem.Position = 0
  S$ = Mem.ReadStr(LEN(S$))
  PRINT S$                            '' print it
  Mem.Close

'------------------------------------------------------

  DIM Mem AS QMemoryStream
  DIM I AS INTEGER

  I = 12
  Mem.Write(I)
  S$ = "Hello world!"
  Mem.Write(S$)
  Mem.Position = 0
  Mem.Read(I)
  S$ = SPACE$(I)
  Mem.Read(S$)
  PRINT S$                            '' print it
  Mem.Close

'------------------------------------------------------

  TYPE MyType
      Name AS STRING*30
      Phone AS STRING*8
      Age AS INTEGER
  END TYPE

  DIM Person AS MyType
      Person.Name = "Joe"
      Person.Phone = "555-5555"

  DIM Mem AS QMemoryStream
      Mem.WriteUDT(Person)
      

To correctly deallocate memory from QMEMORYSTREAM you should 
set Position and Size to 0 and then set one value. To see how 
this works, run Task Manager to follow memory in process.
Then run this code:

DIM Mem AS QMemoryStream

Showmessage "Pre memory"
Mem.Size = 3200005
S$ = Space$(3200000)
Mem.WriteStr(S$, LEN(S$))
Showmessage "Memory allocated"

'now deallocate
Mem.Position = 0
Mem.Size = 0
Showmessage "Memory should be all deallocated"

'loading a value finally resets memory
S$ = "hi"
Mem.WriteStr(S$, LEN(S$))
Showmessage "Finally deallocated by assigning value"
Mem.Close
Application.Terminate

Prev Component Contents Next Component