home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sp15demo.zip / libsrc.zip / LIBSRC / STREAMS.PAS < prev    next >
Pascal/Delphi Source File  |  1996-02-24  |  22KB  |  654 lines

  1. UNIT Streams;
  2.  
  3. {
  4. ╔═══════════════════════════════════════════════════════════════════════════╗
  5. ║                                                                           ║
  6. ║ Speed-Pascal/2 Version 2.0                                                ║
  7. ║                                                                           ║
  8. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  9. ║                                                                           ║
  10. ║ This file: Streams class definitions                                      ║
  11. ║                                                                           ║
  12. ║ Last modified: September 1995                                             ║
  13. ║                                                                           ║
  14. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  15. ║                                                                           ║
  16. ╚═══════════════════════════════════════════════════════════════════════════╝
  17. }
  18.  
  19. INTERFACE
  20.  
  21. USES SysUtils;
  22.  
  23. TYPE
  24.     EStreamReadError=CLASS(Exception);
  25.     EStreamWriteError=CLASS(Exception);
  26.     EStreamCreateError=CLASS(Exception);
  27.     EStreamOpenError=CLASS(Exception);
  28.     EStreamSeekError=CLASS(Exception);
  29.  
  30. CONST
  31.     StreamReadErrorText   = 'TStream read error exception (EStreamReadError) occured';
  32.     StreamWriteErrorText  = 'TStream write error exception (EStreamReadError) occured';
  33.     StreamCreateErrorText = 'TStream create error exception (EStreamCreateError) occured';
  34.     StreamOpenErrorText   = 'TStream open error exception (EStreamOpenError) occured';
  35.     StreamSeekErrorText   = 'TStream seek error exception (EStreamSeekError) occured';
  36.  
  37. TYPE
  38.     TStream name 'TStream'=CLASS(TObject)
  39.                      PROTECTED
  40.                             FUNCTION GetSize:LONGINT;VIRTUAL;
  41.                             FUNCTION GetPosition:LONGINT;
  42.                             PROCEDURE SetPosition(NewPos:Longint);
  43.                      PUBLIC
  44.                             PROCEDURE ReadBuffer(VAR Buffer;Count:LONGINT);
  45.                             PROCEDURE WriteBuffer(CONST Buffer;Count:LONGINT);
  46.                             FUNCTION Read(VAR Buffer;Count:LONGINT):LONGINT;
  47.                                      VIRTUAL;ABSTRACT;
  48.                             FUNCTION Write(CONST Buffer;Count:LONGINT):LONGINT;
  49.                                      VIRTUAL;ABSTRACT;
  50.                             FUNCTION Seek(Offset:LONGINT;Origin:WORD):LONGINT;
  51.                                      VIRTUAL;ABSTRACT;
  52.                             PROCEDURE ReadError;VIRTUAL;
  53.                             PROCEDURE WriteError;VIRTUAL;
  54.                             PROCEDURE CreateError;VIRTUAL;
  55.                             PROCEDURE OpenError;VIRTUAL;
  56.                             PROCEDURE SeekError;VIRTUAL;
  57.                             PROCEDURE SetSize(NewSize:LONGINT);VIRTUAL;ABSTRACT;
  58.                             DESTRUCTOR Destroy;OVERRIDE;
  59.  
  60.                             FUNCTION EndOfData: Boolean; virtual;
  61.  
  62.                             FUNCTION ReadLn: string; virtual;
  63.                             PROCEDURE WriteLn(const S: string); virtual;
  64.  
  65.                             PROPERTY
  66.                                      Position:LONGINT    read GetPosition
  67.                                                          write SetPosition;
  68.                             PROPERTY
  69.                                      Size:LONGINT        read GetSize;
  70.     END;
  71.     TStreamClass=CLASS OF TStream;
  72.  
  73. CONST
  74.     {FileStream Open modes}
  75.     Stream_Create    = 1;
  76.     Stream_Open      = 2;
  77.  
  78. TYPE
  79.   THandleStream name 'THandleStream'= class(TStream)
  80.                      PRIVATE
  81.                             FHandle: LongInt;
  82.  
  83.                      PUBLIC
  84.                           CONSTRUCTOR Create(AHandle: Integer);
  85.                           FUNCTION Read(var Buffer; Count: Longint): Longint; override;
  86.                           FUNCTION Write(CONST Buffer; Count: Longint): Longint; override;
  87.                           FUNCTION Seek(Offset: Longint; Origin: Word): Longint; override;
  88.  
  89.                      PUBLIC
  90.                           PROPERTY Handle: LongInt read FHandle;
  91.   END;
  92.   THandleStreamClass=CLASS OF THandleStream;
  93.  
  94. TYPE
  95.   TFileHandleStream = class(THandleStream)
  96.                      PUBLIC
  97.                           CONSTRUCTOR Create(const FileName: string; Mode: LongInt);
  98.                           DESTRUCTOR Destroy; virtual;
  99.   END;
  100.   TFileHandleStreamClass=CLASS OF TFileHandleStream;
  101.  
  102. TYPE
  103.     TFileStream name 'TFileStream'=CLASS(TStream)
  104.                      PRIVATE
  105.                            PStreamFile:FILE;
  106.                      PUBLIC
  107.                            CONSTRUCTOR Create(CONST FileName:STRING;Mode:WORD);
  108.                            DESTRUCTOR Destroy;OVERRIDE;
  109.                            FUNCTION Read(VAR Buffer;Count:LONGINT):LONGINT;OVERRIDE;
  110.                            FUNCTION Write(CONST Buffer;Count:LONGINT):LONGINT;OVERRIDE;
  111.                            FUNCTION Seek(Offset:LONGINT;Origin:WORD):LONGINT;OVERRIDE;
  112.     END;
  113.     TFileStreamClass=CLASS OF TFileStream;
  114.  
  115. CONST
  116.     {Memory increase size for Write}
  117.     MemoryDelta:LONGWORD=8192;
  118.  
  119. TYPE
  120.     PMemoryStreamBuffer=^TMemoryStreamBuffer;
  121.     TMemoryStreamBuffer=ARRAY[0..1] OF BYTE;
  122.  
  123.     TMemoryStream name 'TMemoryStream'=CLASS(TStream)
  124.                      PROTECTED
  125.                            PBuffer:PMemoryStreamBuffer;
  126.                            PSize:LONGINT;
  127.                            PCapacity:LONGINT;
  128.                            PPosition:LONGINT;
  129.                      PROTECTED
  130.                            PROCEDURE SetCapacity(NewCapacity:LONGINT);
  131.                            FUNCTION GetCapacity:LONGINT;
  132.                            FUNCTION GetSize:LONGINT;OVERRIDE;
  133.                            FUNCTION GetBuffer:PMemoryStreamBuffer;
  134.                      PUBLIC
  135.                            CONSTRUCTOR Create;
  136.                            DESTRUCTOR Destroy;OVERRIDE;
  137.                            PROCEDURE LoadFromStream(Stream: TStream);
  138.                            PROCEDURE LoadFromFile(CONST FileName:STRING);
  139.                            PROCEDURE SaveToStream(Stream:TStream);
  140.                            FUNCTION SaveToFile(CONST FileName:STRING):BOOLEAN;
  141.                            FUNCTION Read(VAR Buffer;Count:Longint):Longint;OVERRIDE;
  142.                            FUNCTION Write(CONST Buffer;Count:Longint):Longint;OVERRIDE;
  143.                            FUNCTION Seek(Offset:Longint;Origin:Word):LONGINT;OVERRIDE;
  144.                            PROCEDURE Clear;
  145.                            PROCEDURE SetSize(NewSize:LONGINT);OVERRIDE;
  146.                            FUNCTION GetCurrentBufPtr:POINTER;
  147.                      PROPERTY Memory:PMemoryStreamBuffer
  148.                                                     read GetBuffer;
  149.                      PROPERTY Capacity:LONGINT      read GetCapacity
  150.                                                     write SetCapacity;
  151.     END;
  152.     TMemoryStreamClass=CLASS OF TMemoryStream;
  153.  
  154.  
  155. FUNCTION CreateSCUStream(Memory:POINTER):TMemoryStream;
  156. PROCEDURE DestroySCUStream(VAR Stream:TMemoryStream);
  157.  
  158. IMPLEMENTATION
  159.  
  160. {
  161. ╔═══════════════════════════════════════════════════════════════════════════╗
  162. ║                                                                           ║
  163. ║ Speed-Pascal/2 Version 2.0                                                ║
  164. ║                                                                           ║
  165. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  166. ║                                                                           ║
  167. ║ This section: TStream class implementation                                ║
  168. ║                                                                           ║
  169. ║ Last modified: September 1995                                             ║
  170. ║                                                                           ║
  171. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  172. ║                                                                           ║
  173. ╚═══════════════════════════════════════════════════════════════════════════╝
  174. }
  175.  
  176. FUNCTION TStream.GetSize:LONGINT;
  177. VAR
  178.    OldPos:LONGINT;
  179.    Result:LONGINT;
  180. BEGIN
  181.      OldPos:=GetPosition;
  182.      result:=Seek(0,Seek_End);
  183.      SetPosition(OldPos);
  184.      GetSize:=result;
  185. END;
  186.  
  187. FUNCTION TStream.EndOfData: Boolean;
  188. BEGIN
  189.   Result := (Position >= Size);
  190. END;
  191.  
  192. FUNCTION TStream.GetPosition:LONGINT;
  193. BEGIN
  194.      GetPosition:=Seek(0,Seek_Current);
  195. END;
  196.  
  197. PROCEDURE TStream.SetPosition(NewPos:Longint);
  198. BEGIN
  199.      Seek(NewPos,Seek_Begin);
  200. END;
  201.  
  202. PROCEDURE TStream.ReadBuffer(VAR Buffer;Count:LONGINT);
  203. BEGIN
  204.      IF Count=0 THEN exit;  {Nothing to read}
  205.      IF Read(Buffer,Count)<>Count THEN ReadError;
  206. END;
  207.  
  208. PROCEDURE TStream.WriteBuffer(CONST Buffer;Count:LONGINT);
  209. BEGIN
  210.      IF Count=0 THEN exit;
  211.      IF Write(Buffer,Count)<>Count THEN WriteError;
  212. END;
  213.  
  214. PROCEDURE TStream.ReadError;
  215. BEGIN
  216.      RAISE EStreamReadError.Create(StreamReadErrorText);
  217. END;
  218.  
  219. PROCEDURE TStream.WriteError;
  220. BEGIN
  221.      RAISE EStreamWriteError.Create(StreamWriteErrorText);
  222. END;
  223.  
  224. PROCEDURE TStream.CreateError;
  225. BEGIN
  226.      RAISE EStreamCreateError.Create(StreamCreateErrorText);
  227. END;
  228.  
  229. PROCEDURE TStream.OpenError;
  230. BEGIN
  231.      RAISE EStreamOpenError.Create(StreamOpenErrorText);
  232. END;
  233.  
  234. PROCEDURE TStream.SeekError;
  235. BEGIN
  236.      RAISE EStreamSeekError.Create(StreamSeekErrorText);
  237. END;
  238.  
  239. DESTRUCTOR TStream.Destroy;
  240. BEGIN
  241.      Inherited Destroy;
  242. END;
  243.  
  244.  
  245. FUNCTION TStream.ReadLn: STRING;
  246. VAR
  247.   Buffer: cstring[260];
  248.   OldPos, Count, Temp: LongInt;
  249. BEGIN
  250.   OldPos := Position;
  251.  
  252.   Count := Read(Buffer[0], 257);
  253.   Buffer[Count] := #0;
  254.  
  255.   Temp := 0;
  256.   while not (Buffer[Temp] in [#10, #13, #26])
  257.     and (Temp < Count) and (Temp < 255) do Inc (Temp);
  258.  
  259.   Move(Buffer[0], Result[1], Temp);
  260.   SetLength(Result, Temp);
  261.   Inc(Temp);
  262.  
  263.   if (Buffer[Temp - 1] = #13) and (Buffer[Temp] = #10) then Inc(Temp);
  264.  
  265.   Position := OldPos + Temp;
  266. END;
  267.  
  268. PROCEDURE TStream.WriteLn(const S: string);
  269. VAR
  270.   CRLF: Word;
  271. BEGIN
  272.   CRLF := $0A0D;
  273.   WriteBuffer(S[1], Length(S));
  274.   WriteBuffer(CRLF, 2);
  275. END;
  276.  
  277. {
  278. ╔═══════════════════════════════════════════════════════════════════════════╗
  279. ║                                                                           ║
  280. ║ Speed-Pascal/2 Version 2.0                                                ║
  281. ║                                                                           ║
  282. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  283. ║                                                                           ║
  284. ║ This section: THandleStream class implementation                          ║
  285. ║                                                                           ║
  286. ║ Last modified: September 1995                                             ║
  287. ║                                                                           ║
  288. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  289. ║                                                                           ║
  290. ╚═══════════════════════════════════════════════════════════════════════════╝
  291. }
  292.  
  293. constructor THandleStream.Create(AHandle: Integer);
  294. begin
  295.   FHandle := AHandle;
  296. end;
  297.  
  298. function THandleStream.Read(var Buffer; Count: Longint): Longint;
  299. begin
  300.   Result := FileRead(Handle, Buffer, Count);
  301.   if Result = -1 then Result := 0;
  302. end;
  303.  
  304. function THandleStream.Write(CONST Buffer; Count: Longint): Longint;
  305. var temp:^BYTE;
  306. begin
  307.   Temp:=@Buffer;
  308.   Result := FileWrite(Handle, Temp^, Count);
  309.   if Result = -1 then Result := 0;
  310. end;
  311.  
  312. function THandleStream.Seek(Offset: Longint; Origin: Word): Longint;
  313. begin
  314.   Result := FileSeek(Handle, Offset, Origin);
  315.   if Result < 0 then SeekError;
  316. end;
  317.  
  318. {
  319. ╔═══════════════════════════════════════════════════════════════════════════╗
  320. ║                                                                           ║
  321. ║ Speed-Pascal/2 Version 2.0                                                ║
  322. ║                                                                           ║
  323. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  324. ║                                                                           ║
  325. ║ This section: TFileHandleStream class implementation                      ║
  326. ║                                                                           ║
  327. ║ Last modified: September 1995                                             ║
  328. ║                                                                           ║
  329. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  330. ║                                                                           ║
  331. ╚═══════════════════════════════════════════════════════════════════════════╝
  332. }
  333.  
  334. constructor TFileHandleStream.Create(const FileName: string; Mode: LongInt);
  335. begin
  336.   if Mode = Stream_Create then
  337.   begin
  338.     FHandle := FileCreate(FileName);
  339.     if FHandle = -1 then CreateError;
  340.   end
  341.   else
  342.   begin
  343.     FHandle := FileOpen(FileName, Mode);
  344.     if FHandle = -1 then OpenError;
  345.   end;
  346. end;
  347.  
  348. destructor TFileHandleStream.Destroy;
  349. begin
  350.   if FHandle > 0 then FileClose(FHandle);
  351. end;
  352.  
  353.  
  354. {
  355. ╔═══════════════════════════════════════════════════════════════════════════╗
  356. ║                                                                           ║
  357. ║ Speed-Pascal/2 Version 2.0                                                ║
  358. ║                                                                           ║
  359. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  360. ║                                                                           ║
  361. ║ This section: TFileStream class implementation                            ║
  362. ║                                                                           ║
  363. ║ Last modified: September 1995                                             ║
  364. ║                                                                           ║
  365. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  366. ║                                                                           ║
  367. ╚═══════════════════════════════════════════════════════════════════════════╝
  368. }
  369.  
  370. CONSTRUCTOR TFileStream.Create(CONST FileName:STRING;Mode:WORD);
  371. BEGIN
  372.      Inherited Create;
  373.  
  374.      Assign(PStreamFile,FileName);
  375.      CASE Mode OF
  376.         Stream_Open:
  377.         BEGIN
  378.              {$i-}
  379.              Reset(PStreamFile,1);
  380.              {$i+}
  381.              IF IoResult<>0 THEN OpenError;
  382.         END;
  383.         Stream_Create:
  384.         BEGIN
  385.              {$i-}
  386.              Rewrite(PStreamFile,1);
  387.              {$i+}
  388.              IF IoResult<>0 THEN CreateError;
  389.         END;
  390.      END; {case}
  391. END;
  392.  
  393. DESTRUCTOR TFileStream.Destroy;
  394. BEGIN
  395.      {$i-}
  396.      Close(PStreamFile);
  397.      {$i+}
  398. END;
  399.  
  400. FUNCTION TFileStream.Read(VAR Buffer;Count:LONGINT):LONGINT;
  401. VAR
  402.    Result:LONGINT;
  403. BEGIN
  404.      {$i-}
  405.      BlockRead(PStreamFile,Buffer,Count,Result);
  406.      {$i+}
  407.      IF IoResult<>0 THEN ReadError;
  408.      Read:=Result;
  409. END;
  410.  
  411. FUNCTION TFileStream.Write(CONST Buffer;Count:LONGINT):LONGINT;
  412. VAR
  413.    pb:POINTER;
  414.    Result:LONGINT;
  415. BEGIN
  416.      pb:=@Buffer;
  417.      {$i-}
  418.      BlockWrite(PStreamFile,pb^,Count,Result);
  419.      {$i+}
  420.      IF IoResult<>0 THEN WriteError;
  421.      Write:=Result;
  422. END;
  423.  
  424. FUNCTION TFileStream.Seek(Offset:LONGINT;Origin:WORD):LONGINT;
  425. VAR
  426.    SaveSeekMode:LONGWORD;
  427. BEGIN
  428.      SaveSeekMode:=SeekMode;
  429.      SeekMode:=Origin;
  430.      {$i-}
  431.      SYSTEM.Seek(PStreamFile,Offset);
  432.      {$i+}
  433.      IF IoResult<>0 THEN SeekError;
  434.      SeekMode:=SaveSeekMode;
  435.      {$i-}
  436.      Seek:=FilePos(PStreamFile);
  437.      {$i+}
  438.      IF IoResult<>0 THEN SeekError;
  439. END;
  440.  
  441.  
  442. {
  443. ╔═══════════════════════════════════════════════════════════════════════════╗
  444. ║                                                                           ║
  445. ║ Speed-Pascal/2 Version 2.0                                                ║
  446. ║                                                                           ║
  447. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  448. ║                                                                           ║
  449. ║ This section: TMemoryStream class implementation                          ║
  450. ║                                                                           ║
  451. ║ Last modified: September 1995                                             ║
  452. ║                                                                           ║
  453. ║ (C) 1995 SpeedSoft. All rights reserved. Disclosure probibited !          ║
  454. ║                                                                           ║
  455. ╚═══════════════════════════════════════════════════════════════════════════╝
  456. }
  457.  
  458. FUNCTION TMemoryStream.GetBuffer:PMemoryStreamBuffer;
  459. BEGIN
  460.      GetBuffer:=PBuffer;
  461. END;
  462.  
  463. PROCEDURE TMemoryStream.SetCapacity(NewCapacity:LONGINT);
  464. VAR
  465.    p:POINTER;
  466. BEGIN
  467.      IF NewCapacity=PCapacity THEN exit;
  468.      IF NewCapacity=0 THEN
  469.      BEGIN
  470.           IF PBuffer<>NIL THEN FreeMem(PBuffer,PCapacity);
  471.           PSize:=0;
  472.           PPosition:=0;
  473.           PBuffer:=NIL;
  474.      END
  475.      ELSE
  476.      BEGIN
  477.           Getmem(p,NewCapacity);
  478.           IF PBuffer<>NIL THEN
  479.           BEGIN
  480.                IF NewCapacity<PCapacity THEN
  481.                BEGIN
  482.                    move(PBuffer^,p^,NewCapacity);
  483.                    PSize:=NewCapacity;
  484.                    IF PPosition>PSize THEN PPosition:=PSize;
  485.                END
  486.                ELSE move(PBuffer^,p^,PCapacity);
  487.                FreeMem(PBuffer,PCapacity);
  488.           END
  489.           ELSE
  490.           BEGIN
  491.                PSize:=0;
  492.                PPosition:=0;
  493.           END;
  494.           PBuffer:=p;
  495.      END;
  496.  
  497.      PCapacity:=NewCapacity;
  498. END;
  499.  
  500. FUNCTION TMemoryStream.GetCapacity:LONGINT;
  501. BEGIN
  502.      GetCapacity:=Capacity;
  503. END;
  504.  
  505. PROCEDURE TMemoryStream.SetSize(NewSize:LONGINT);
  506. BEGIN
  507.      Clear;
  508.      SetCapacity(NewSize);
  509.      PSize:=NewSize;
  510. END;
  511.  
  512. FUNCTION TMemoryStream.GetSize:LONGINT;
  513. BEGIN
  514.      GetSize:=PSize;
  515. END;
  516.  
  517. CONSTRUCTOR TMemoryStream.Create;
  518. BEGIN
  519.      Inherited Create;
  520.  
  521.      PSize:=0;
  522.      PCapacity:=0;
  523.      PPosition:=0;
  524.      PBuffer:=NIL;
  525. END;
  526.  
  527. DESTRUCTOR TMemoryStream.Destroy;
  528. BEGIN
  529.      Clear;
  530.      Inherited Destroy;
  531. END;
  532.  
  533. FUNCTION TMemoryStream.Read(VAR Buffer;Count:Longint):Longint;
  534. VAR
  535.    result:LONGINT;
  536. LABEL l;
  537. BEGIN
  538.      Result:=0;
  539.      IF PBuffer=NIL THEN goto l;
  540.      IF PPosition+Count>PSize THEN Count:=PSize-PPosition;
  541.      IF Count<=0 THEN goto l;
  542.  
  543.      move(PBuffer^[PPosition],Buffer,Count);
  544.      inc(PPosition,Count);
  545.      result:=Count;
  546. l:
  547.      Read:=result;
  548. END;
  549.  
  550. FUNCTION TMemoryStream.GetCurrentBufPtr:POINTER;
  551. BEGIN
  552.      result:=PBuffer;
  553.      inc(result,PPosition);
  554. END;
  555.  
  556. FUNCTION TMemoryStream.Write(CONST Buffer;Count:Longint):Longint;
  557. VAR
  558.    Result:LONGINT;
  559.    pb:POINTER;
  560. LABEL l;
  561. BEGIN
  562.      Result:=0;
  563.      IF Count<=0 THEN goto l;
  564.      IF PBuffer=NIL THEN goto l;
  565.  
  566.      pb:=@Buffer;
  567.      IF PPosition+Count>PCapacity THEN SetCapacity(PPosition+Count+MemoryDelta);
  568.      move(pb^,PBuffer^[PPosition],Count);
  569.      inc(PPosition,Count);
  570.      IF PPosition>PSize THEN PSize:=PPosition;
  571.      result:=Count;
  572. l:
  573.      Write:=Result;
  574. END;
  575.  
  576. FUNCTION TMemoryStream.Seek(Offset:Longint;Origin:Word):LONGINT;
  577. BEGIN
  578.      CASE Origin OF
  579.         Seek_Begin:IF Offset<=PSize THEN PPosition:=Offset;
  580.         Seek_Current:IF PPosition+Offset<=PSize THEN PPosition:=PPosition+Offset;
  581.         Seek_End:IF PSize+Offset<=PSize THEN PPosition:=PSize+Offset;
  582.      END; {case}
  583.  
  584.      Seek:=PPosition;
  585. END;
  586.  
  587. PROCEDURE TMemoryStream.LoadFromStream(Stream: TStream);
  588. BEGIN
  589.      IF PBuffer=NIL THEN exit;
  590.      Stream.Position:=0;
  591.      SetSize(Stream.Size);
  592.      IF PSize=0 THEN exit;  {nothing to read}
  593.      Stream.ReadBuffer(PBuffer^,PSize);
  594. END;
  595.  
  596. PROCEDURE TMemoryStream.LoadFromFile(CONST FileName:STRING);
  597. VAR
  598.    FileStream:TFileStream;
  599. BEGIN
  600.      FileStream.Create(FileName,Stream_Open);
  601.      TRY
  602.         LoadFromStream(FileStream);
  603.      FINALLY
  604.         FileStream.Destroy;
  605.      END;
  606. END;
  607.  
  608. PROCEDURE TMemoryStream.SaveToStream(Stream:TStream);
  609. BEGIN
  610.      IF PBuffer=NIL THEN exit;
  611.      IF PSize=0 THEN exit; {Nothing to write}
  612.      Stream.WriteBuffer(PBuffer^,PSize);
  613. END;
  614.  
  615. FUNCTION TMemoryStream.SaveToFile(CONST FileName:STRING):BOOLEAN;
  616. VAR
  617.    FileStream:TFileStream;
  618. BEGIN
  619.      result:=TRUE;
  620.  
  621.      TRY
  622.         FileStream.Create(FileName,Stream_Create);
  623.         SaveToStream(FileStream);
  624.      EXCEPT
  625.         result:=FALSE;
  626.      END;
  627.  
  628.      FileStream.Destroy;
  629. END;
  630.  
  631. PROCEDURE TMemoryStream.Clear;
  632. BEGIN
  633.      SetCapacity(0);
  634. END;
  635.  
  636. FUNCTION CreateSCUStream(Memory:POINTER):TMemoryStream;
  637. BEGIN
  638.      result.Create;
  639.      result.PBuffer:=Memory;
  640.      result.PSize:=MaxLongInt;
  641.      result.PCapacity:=MaxLongInt;
  642.      result.PPosition:=0;
  643. END;
  644.  
  645. PROCEDURE DestroySCUStream(VAR Stream:TMemoryStream);
  646. BEGIN
  647.      Stream.PBuffer:=NIL;
  648.      Stream.PSize:=0;
  649.      Stream.PCapacity:=0;
  650.      Stream.Destroy;
  651. END;
  652.  
  653. END.
  654.