Delphi 中流的使用

Delphi中流类的学习(一) 最近不怎么忙,看了一下万一老师的delphi博客学习了一下delphi中的流类。写一下我对delphi流的总结已助以后参考。流就是一段数据或一块内存,在面向对象的编程语言像Java和C#等里面都有这个类,操作流时我们不用关心里面的数据是啥,只需知道流的当前位置和流的大小即可。下面重点说一下Delphi中的流类。1.Delphi中流类的层次图  TStream类为所有流类的父类, 阅读详情

所谓"流", 就是一段数据或是一块内存;
在进行流操作时, 我们不必关心流中的数据到底是什么; 只需要知道流的大小和当前的指针位置. 所以流只有两个属性:
Size、Position.
对流的操作, 不过就是读取和写入. 所以流最主要的方法就是 Read 和 Write.
在很多控件的使用中, 读取主要用 LoadFromStream; 写入主要用 SaveToStream.

 

TMemoryStream(内存流) 入门
举个例子: (建立新工程, 添加两个 Memo、两个 Button)

unit Unit1;

interface

uses 

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;

type 

   TForm1 =class(TForm)   

        Memo1: TMemo;   

        Memo2: TMemo; 

        Button1: TButton;   

        Button2: TButton;   

       procedure FormCreate(Sender: TObject);   

       procedure Button1Click(Sender: TObject);   

       procedure Button2Click(Sender: TObject);   

       procedure FormDestroy(Sender: TObject); 

end;

var 

    Form1: TForm1;

implementation

{$R *.dfm}

var 

     mStream: TStream;

{声明一个流对象}

procedure TForm1.FormCreate(Sender: TObject);

begin 

     mStream := TMemoryStream.Create; {TStream 是抽象类, 只能通过其子类实例化; 这里我们用了内存流来生成实例} 

     Memo1.Lines.Text :='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; {给 Memo1 个初始值}

end;

procedure TForm1.Button1Click(Sender: TObject);

begin 

     Memo1.Lines.SaveToStream(mStream);     {把 Memo1 中的内容写入到流} 

     ShowMessage(IntToStr(mStream.Size));   {26, 当前流的大小} 

     ShowMessage(IntToStr(mStream.Position));{26, 当前流的指针}

end;

procedure TForm1.Button2Click(Sender: TObject);

begin 

   mStream.Position :=4;             {调整流的当前指针位置} 

   Memo2.Lines.LoadFromStream(mStream);

{读出流中的内容到 Memo2} {    现在 Memo2 中的内容应该是: EFGHIJKLMNOPQRSTUVWXYZ    如果 Position 是 0,  memo2 读出的内容会是: ABCDEFGHIJKLMNOPQRSTUVWXYZ    如果 Position 等于 Size, 在这里如果是 26, Memo2 就读不出什么了.  }

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin 

    mStream.Free;{流释放时, 所用内存当然也会同时释放}

end;

end.

 

内存流读取文件

unit Unit1;

interface

uses 

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;

type 

TForm1 = class(TForm)   

     Memo1: TMemo;   

     Button1: TButton;   

     Button2: TButton;   

     Button3: TButton;   

     procedure FormCreate(Sender: TObject);   

     procedure FormDestroy(Sender: TObject);   

     procedure Button1Click(Sender: TObject);   

     procedure Button2Click(Sender: TObject);   

     procedure Button3Click(Sender: TObject); 

end;

var 

     Form1: TForm1;

implementation{$R *.dfm}

var 

     mStream: TMemoryStream;

procedure TForm1.FormCreate(Sender: TObject);//程序开始先创建一个准备要测试的文件

var 

     strList: TStringList;

begin 

    strList := TStringList.Create; 

    strList.Add('aaaaaaaa'); 

    strList.Add('bbbbbbbb'); 

    strList.Add('cccccccc'); 

    strList.Add('dddddddd'); 

    strList.SaveToFile('c:\temp\test.txt'); 

    strList.Free;  {同时建立内存流} 

    mStream := TMemoryStream.Create;

end;

procedure TForm1.Button1Click(Sender: TObject);//通过流读文件到 Memo

begin 

     mStream.LoadFromFile('c:\temp\test.txt');{把文件读入内存流} 

     Memo1.Lines.LoadFromStream(mStream);     {把内存流载入 Memo1}

end;

procedure TForm1.Button2Click(Sender: TObject);//用字符指针读取流中的内容

var 

    pc: PChar;

begin 

    pc := mStream.Memory;{把字符指针指向内存流} 

    ShowMessage(pc[0]); {a; 第一个字符} 

    ShowMessage(pc[10]); {b; 这个第二行的第一个字符; 每行8个字再加换行与回车共10个字符} 

    ShowMessage(pc[20]); {c}  ShowMessage(pc[30]); {d}

end;

procedure TForm1.Button3Click(Sender: TObject);//从流读入到缓冲区

var 

    buffer: array[0..2]of Char;{定义个字符缓冲区}

begin 

    mStream.Seek(0, soFromBeginning); 

    mStream.Read(buffer, SizeOf(buffer)); 

    ShowMessage(buffer);{aaa} 

    mStream.Seek(10, soFromBeginning); 

    mStream.Read(buffer, SizeOf(buffer)); 

    ShowMessage(buffer); {bbb} 

    mStream.Seek(20, soFromBeginning); 

    mStream.Read(buffer, SizeOf(buffer)); 

    ShowMessage(buffer); {ccc} 

    mStream.Seek(30, soFromBeginning); 

    mStream.Read(buffer, SizeOf(buffer)); 

    ShowMessage(buffer); {ddd}

{关于 Seek 函数:  参数1: Offset 是偏移量;  参数2: Origin 是指针的基准位置, 有三个选值: soFromBeginning、soFromCurrent、soFromEnd        soFromBeginning: 以开始为基准, 此时参数 Offset 要 >= 0;        soFromCurrent: 以当前位置为基准;        soFromEnd: 以结束为基准; 此时参数 Offset 要 <= 0;  返回: 指针新位置}

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin 

    mStream.Free;

end;

end.

 

TFileStream读写

TStream 是一个抽象的基类, 不能直接生成对象. 在具体的应用中, 主要使用它的子孙类:

TFileStream: 文件流

TStringStream: 字符串流

TMemoryStream: 内存流

TResourceStream: 资源文件流

THandleStream: 是 TFileStream 的父类、

TStream 的子类TCustomMemoryStream: 是 TMemoryStream 和 TResourceStream 的父类、

TStream 的子类与流相关的常用类还有: TReader、TWriter、TCompressionStream、TDecompressionStream

来一个文件流的例子:

procedure TForm1.Button1Click(Sender: TObject);

var 

    getStream,setStream: TFileStream; {声明一个文件流} 

    getPath,setPath:string;

begin 

     getPath := 'c:\temp\get.jpg';{需要这个文件存在} 

     setPath :='c:\temp\set.jpg';{这个会自动建立} 

     ifnot FileExists(getPath)then 

     begin   

         ShowMessage('找不到我们要测试的图片文件: ' + getPath);   

         Exit;

      end; 

      getStream := TFileStream.Create(getPath, fmOpenReador fmShareExclusive); 

      setStream := TFileStream.Create(setPath, fmCreate); {建立文件流需要两个参数: 参数 1 是路径, 参数 2 是打开模式} 

      getStream.Position :=0;{流指针移到开始, 复制时从这里开始} 

      setStream.CopyFrom(getStream, getStream.Size);{Copy 流} {CopyFrom 的参数 2 是要复制的内容大小; 如果为 0 , 不管指针在什么位置都会复制所有内容} {CopyFrom 返回实际拷贝的字节数}

{这时硬盘上就有 set.jpg 文件, 与 get.jpg 一么一样} {其实就是复制文件, 不过这里我们是用文件流实现的} 

     getStream.Free; 

     setStream.Free;

end;

TFileStream 打开模式与共享模式:

分类参数说明
打
开
模
式
fmCreate 建立文件, 如果存在则打开它。
fmOpenRead只读打开
fmOpenWrite只写打开
fmOpenReadWrite读写打开
共
享
模
式
fmShareCompat共享模式, 兼容 Dos
fmShareExclusive 不允许别人以任何方式打开
fmShareDenyWrite 允许别人以只写方式打开
fmShareDenyRead允许别人以只读方式打开
fmShareDenyNone允许别人以任何方式打开

 

遍历读取流中的所有数据
unit Unit1;
interface
uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;
type 
    TForm1 = class(TForm)   
        Memo1: TMemo;   
        Memo2: TMemo;{需要添加两个 Memo 用于显示}   
        Button1: TButton;   
        procedure Button1Click(Sender: TObject);   
        procedure FormCreate(Sender: TObject); 
    end;
var 
    Form1: TForm1;
implementation
{$R *.dfm}//先制造一个测试文件
procedure TForm1.FormCreate(Sender: TObject);
var 
    strList: TStringList;
begin 
    strList := TStringList.Create; 
    strList.Add('ABCDEFGHIJKLMNOPQRSTUVWXYZ'); 
    strList.SaveToFile('c:\temp\test.txt');  strList.Free;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var 
     ms: TMemoryStream; 
     c: Char;  s1,s2: string;
begin 
     ms := TMemoryStream.Create; 
     ms.LoadFromFile('c:\temp\test.txt');{读入内存流} 
     s1 :='';  s2 :=''; 
     ms.Position :=0;                     {指针到开始} 
     while ms.Position < ms.Sizedo         {循环读出} 
     begin   
         ms.Read(c,1);                       {每读出一个字节, 指针会自动移到新的位置}   
         s1 := s1 + c +' ';                 {用文本记录}   
         s2 := s2 + IntToHex(Byte(c),2) +' ';{用两位数的十六进制记录} 
     end; 
     Memo1.Lines.Text := s1; 
     Memo2.Lines.Text := s2; {Memo1 会显示: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z } {Memo2 会显示: 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 0D 0A} 
     ms.Free;
end;
end.
 
序列化
unit Unit1;
interface
uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;
type 
     TForm1 = class(TForm)   
          Button1: TButton;   
          Button2: TButton;   
          Button3: TButton;   
          Button4: TButton;   
          Memo1: TMemo;   
          procedure Button1Click(Sender: TObject);   
          procedure Button2Click(Sender: TObject); 
          procedure Button3Click(Sender: TObject); 
          procedure Button4Click(Sender: TObject); 
     private   { Private declarations } 
     public   { Public declarations } 
end;
var 
     Form1: TForm1;
implementation
{$R *.dfm}//添加一个 Memo1 然后修改其内容
procedure TForm1.Button1Click(Sender: TObject);
begin 
     WriteComponentResFile('c:\temp\memo.dat', Memo1); {只此一句就可以把当前的 Memo 的状态序列化到文件}
end;
//反序列化, 读回
procedure TForm1.Button2Click(Sender: TObject);
begin 
     ReadComponentResFile('c:\temp\memo.dat', Memo1); {一句话就可以读回, 不管是经过了什么操作(甚至是关机)}
end;{  这好像和流没什么关系, 其实这就是流的典型操作,  WriteComponentResFile 和 ReadComponentResFile 分别调用了流类的  WriteComponentRes 与 ReadComponentRes 方法.  下面用更直接的流的方式重新实现一次:}
//序列化
procedure TForm1.Button3Click(Sender: TObject);
var 
     stream: TStream;
     const  strPath ='c:\temp\m.dat';
begin 
     stream := TFileStream.Create(strPath, fmCreate); 
     stream.WriteComponentRes(Memo1.ClassName, Memo1); {WriteComponentRes 有两个参数: 文件名和组件名} 
     stream.Free;
end;
//反序列化
procedure TForm1.Button4Click(Sender: TObject);
var 
     stream: TStream;
     const  strPath ='c:\temp\m.dat';
begin 
     stream := TFileStream.Create(strPath, fmOpenRead); 
     stream.ReadComponentRes(Memo1); {ReadComponentRes 只有一个参数: 组件名} 
     stream.Free;
end;
end.
 
用流读写结构化文件
unit Unit1;
interface
uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;
type 
     TForm1 = class(TForm)   
           Memo1: TMemo;   {添加 Memo 显示内容}   
          Button1: TButton;   
          Button2: TButton;   
          procedure Button1Click(Sender: TObject);   
          procedure Button2Click(Sender: TObject); 
     private   { Private declarations } 
     public   { Public declarations } 
     end;
var 
     Form1: TForm1;
implementation
{$R *.dfm}
type 
      TRec = record   {定义一个记录}   
           name:string[8];   
           age: Word; 
      end;//写入
procedure TForm1.Button1Click(Sender: TObject);
var 
     rec: TRec; 
     ms: TMemoryStream;
begin 
     ms := TMemoryStream.Create; 
     rec.name := '张三';
     rec.age :=8; 
     ms.Write(rec, SizeOf(rec)); 
     rec.name :='李四';
     rec.age :=81; 
     ms.Write(rec, SizeOf(rec)); 
     rec.name :='王二麻子';
     rec.age :=18; 
     ms.Write(rec, SizeOf(rec)); 
     ms.SaveToFile('c:\temp\rec.dat'); 
     ms.Free;
end;
//读取
procedure TForm1.Button2Click(Sender: TObject);
var 
    rec: TRec; 
    ms: TMemoryStream;
begin 
    ms := TMemoryStream.Create; 
    ms.LoadFromFile('c:\temp\rec.dat'); 
    Memo1.Clear; 
    ms.Position :=0; 
    while ms.Position < ms.Sizedo 
    begin   
         ms.Read(rec, SizeOf(rec));   
         Memo1.Lines.Add(rec.name +' ' + IntToStr(rec.age)); 
    end; {Memo1 的显示结果会是:    张三 8    李四 81    王二麻子 18  } 
    ms.Free;
end;
end.
 
压缩与解压缩
unit Unit1;
interface
uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;
type 
      TForm1 = class(TForm)   
           Button1: TButton;   
           Button2: TButton; 
           procedure Button1Click(Sender: TObject);   
           procedure Button2Click(Sender: TObject); 
      end;
var 
     Form1: TForm1;
implementation
{$R *.dfm}
uses
     Zlib; {压缩流 TCompressionStream 与解压缩流 TDecompressionStream 来自 Zlib 单元}//压缩
procedure TForm1.Button1Click(Sender: TObject);
var 
     cs: TCompressionStream;{定义压缩流} 
     fs,ms: TMemoryStream; {fs 是要压缩的流; ms 是接收压缩后文件的流} 
     num: Integer;         {原始文件大小}
begin {第一步: 调入要压缩的文件, 并获取大小} 
      fs := TMemoryStream.Create; 
      fs.LoadFromFile('c:\temp\test.txt');{文件要存在啊} 
      num := fs.Size; {第二步: 建立接收的流, 并先写入原始文件大小} 
      ms := TMemoryStream.Create; 
      ms.Write(num, SizeOf(num)); {第三步: 压缩}
      cs := TCompressionStream.Create(clMax, ms);{参数1是压缩比; 参数2是接收流} 
      fs.SaveToStream(cs);{传入要压缩的数据}
      cs.Free;           {压缩流 Free 后才真正完成压缩, 所以提前 Free} {第四步: 保存} 
      ms.SaveToFile('c:\temp\test.zipx'); {第五步: 释放} 
      ms.Free;  fs.Free;{压缩比参数:  clNone    无压缩  clFastest 快速  clDefault 默认  clMax    最大比例}
end;
//解压缩
procedure TForm1.Button2Click(Sender: TObject);
var 
     ds: TDecompressionStream;{解压流} 
     fs,ms: TMemoryStream;   {fs 是准备要解压的流; ms 是接受解压数据的流} 
     num: Integer;           {接受文件压缩前的大小}
begin {第一步: 准要解压的文件} 
     fs := TMemoryStream.Create; 
     fs.LoadFromFile('c:\temp\test.zipx');{必须是上一个压缩方法生成的文件} {第二步: 读出文件压缩前的大小} 
     fs.Position :=0;  fs.ReadBuffer(num,SizeOf(num)); {第三步: 准备好要接收的流, 并设置需要的大小} 
     ms := TMemoryStream.Create;  ms.SetSize(num); {第四步: 解压} 
     ds := TDecompressionStream.Create(fs);{参数是要解压的流} {第五步: 把解压后的数据读出存放到已准备好接收的流} 
     ds.Read(ms.Memory^, num); {第六步: 保存} 
     ms.SaveToFile('c:\temp\test2.txt'); 
     ds.Free; 
     ms.Free; 
     fs.Free;
end;
end.
 
压缩与解压缩的函数
unit Unit1;
interface
uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;
type 
      TForm1 = class(TForm)   
           Button1: TButton;   
           Button2: TButton;   
           procedure Button1Click(Sender: TObject);   
           procedure Button2Click(Sender: TObject);
      end;
var 
     Form1: TForm1;
implementation
{$R *.dfm}
uses
     Zlib;//压缩函数
procedure Zip(var fs: TMemoryStream);
var 
     cs: TCompressionStream; 
     ms: TMemoryStream; 
     num: Integer;
begin
     ifnot(Assigned(fs)and (fs.Size>0))then
         Exit;   
     num := fs.Size;   
     ms := TMemoryStream.Create;   
     cs := TCompressionStream.Create(clMax, ms); 
     try   
         fs.SaveToStream(cs);   
         cs.Free;   //ms.Position := 0; 
         fs.Clear;   
         fs.WriteBuffer(num, sizeof(num));   
         fs.CopyFrom(ms,0); 
     finally   
        ms.Free; 
     end;
end;
//解压函数
procedure UnZip(var fs: Tmemorystream);
var 
     ds: TDecompressionStream; 
     ms: TMemoryStream; 
     num: Integer;
begin
     ifnot(Assigned(fs)and (fs.Size>0))then
        Exit; 
     fs.Position :=0; 
     fs.ReadBuffer(num,sizeof(num)); 
     ms := TMemoryStream.Create; 
     ds := TDecompressionStream.Create(fs); 
     try   
         ms.SetSize(num);   
         ds.Read(ms.Memory^, num);   //ms.Position := 0;   
         fs.Clear;   
         fs.CopyFrom(ms,0);
     finally   
         ds.Free;   
         ms.Free; 
     end;
end;
//压缩测试
procedure TForm1.Button1Click(Sender: TObject);
var 
      ms: TMemoryStream;
begin 
     ms := TMemoryStream.Create; 
     ms.LoadFromFile('c:\temp\test.txt'); 
     Zip(ms); 
     ms.SaveToFile('c:\temp\test.zipx');
end;
//解压测试
procedure TForm1.Button2Click(Sender: TObject);
var 
     ms: TMemoryStream;
begin 
     ms := TMemoryStream.Create; 
     ms.LoadFromFile('c:\temp\test.zipx'); 
     UnZip(ms); 
     ms.SaveToFile('c:\temp\test2.txt');
end;
end.
 
分割与合并文件函数
unit Unit1;
interface
uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;
type 
     TForm1 = class(TForm)   
          Button1: TButton;   
          Button2: TButton;   
          procedure Button1Click(Sender: TObject);   
          procedure Button2Click(Sender: TObject); 
      end;
var 
     Form1: TForm1;
implementation
{$R *.dfm}//分割文件的函数{参数 1 是要分割的文件名; 参数 2 是要风格文件的大小, 单位是 KB}{分割后的文件名扩展名用序号替换}
function SplitFile(const FileName:string; Size: Cardinal): Boolean;
var 
     fStream: TFileStream;  {原始文件} 
     toStream: TMemoryStream;{分文件} 
     p,i: Integer;           {p 记录当前指针位置; i 记录这是第几个分的文件}
begin 
     Result := False; 
     Size := Size * 1024;   {把大小的单位转换为字节} 
     fStream := TFileStream.Create(FileName, fmOpenRead); 
     p :=0; 
     i :=0; 
     toStream := TMemoryStream.Create; 
     while p < fStream.Size do
     begin   
          toStream.Clear;       {清空上次数据}   
          fStream.Position := p;{放好指针位置} 
          if fStream.Size-p < Sizethen
             Size := fStream.Size-p;{最后一个时, 有多少算多少}   
          toStream.CopyFrom(fStream, Size);{复制}   
          toStream.SaveToFile(FileName +'.' + IntToStr(i));       {保存}   
          Inc(i);   
          p := p + Size;
      end; 
      fStream.Free; 
      toStream.Free; 
      Result := True;
end;
//合并文件, 参数是其中一个分文件名
function MergeFile(const FileName:string): Boolean;
var 
     ms: TMemoryStream; {读取分文件} 
     fs: TFileStream; {合并后的文件} 
     path:string; 
     i: Integer;
begin 
     path := ChangeFileExt(FileName,'');{去掉序号扩展名} 
     ShowMessage(path); 
     i :=0; 
     ms := TMemoryStream.Create; 
     fs := TFileStream.Create(path, fmCreate); 
     while FileExists(path +'.' + IntToStr(i))do 
     begin   
          ms.LoadFromFile(path +'.' + IntToStr(i));   
          fs.CopyFrom(ms,0);{TFileStream 不需要 SetSize; 但如果用 TMemoryStream 就需要}   
          Inc(i); 
     end; 
     ms.Free; 
     fs.Free;
end;
//测试分割
procedure TForm1.Button1Click(Sender: TObject);
begin 
     SplitFile('c:\temp\test.txt',10);
end;
//测试合并
procedure TForm1.Button2Click(Sender: TObject);
begin 
     MergeFile('c:\temp\test.txt.0');
end;
end.
Delphi内存流、文件流原理实例及应用.rar Delphi文件流、内存流原理实例及应用,了解一下如何使用文件流和内存流生成一些程序,好像一些外壳程序就是使用的内存流,挺底层的,不是太了解,不便多说。 立即下载

相关推荐

delphi流相互转换

MemoryStream与liststring与stringstream转换

Delphi中TMemoryStream的用法

1.文件流 TStreamMemoery 读写内存 var BitmapMemoryStream:TMemoryStream; Bitmap1:TBitmap; procedure TForm.Button1Click(Sender:TObject); begin BitmapmemroyStream:=TmemoryStream.Create; file:/...

细雨纷飞~~~ 7260

POI 写word,添加标题,表格,图片,自动生成目录,合并单元格

工程地址:https://github.com/zheng-chang-wei/word package com.example.demo1.poi; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.File; import java.io.FileOutputStream; public class ...

zheng_chang_wei的博客 6155

delphi的memo组件转字符串流

在 Delphi 中,可以使用 TStringStream 组件将 memo 组件中的内容转换为字符串流。 首先,需要在 uses 部分加入 System.Classes 单元,以使用 TStringStream 组件。然后,可以使用以下代码将 memo 中的内容转换为字符串流: var MemoStream: TStringStream; begin MemoStream := TStr...

weixin_42588555的博客 342

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

sql server安装并SSMS连接

  SQL Server是一种广泛应用于网络业务数据处理的关系型数据库管理系统。SQL Server 2016是微软公司研发的新一代旗舰级数据库和分析平台,突出高级分析和丰富可视化,并融合了关键创新功能。其可提供对企业基础架构最高级别的支持,专门针对关键业务应用的多种功能与解决方案提供最高级别的可用性,并提供更多、更全面的功能以满足不同人群对数据的需求,包括支持来自不同网络环境的数据交互、全面的自助分析等创新功能。百度搜索sql server,在官网下载 地址是:SQL Server 下载| Microso

jiankang66的博客 5186

delphi TMemoryStream对象用法

TMemoryStream对象 TMemoryStream对象是一个管理动态内存中的数据的Stream对象,它是从TCustomMemoryStream中继承下来的,除了从TCustomMemoryStream中继承的属性和方法外,它还增加和覆盖了一些用于从磁盘文件和其它注台读数据的方法。它还提供了写入、消除内存内容的动态内存管理方法。下面介绍它的这些属性和方法。 TM...

achs24540的博客 632

H3C无线控制器AC与第三方认证系统集成实现企业级Portal短信认证方案

本文详细阐述了如何将H3C无线控制器(AC)与第三方认证系统集成,构建企业级Portal短信认证方案。该方案通过手机号作为临时凭证,实现了访客网络的实名追溯、权限控制与专业体验。文章深入解析了方案原理、H3C AC的关键配置步骤、第三方系统对接要点及短信网关选型避坑指南,为企业提升网络安全管理与访客服务质量提供了完整、可行的实战指导。

a3b4c5的博客 195

实现TADOQuery LoadFromStream方法

procedure LoadFromStream(pvDataSet: TCustomADODataSet; pvStream: TStream); var AR:_Recordset; begin AR:=_Recordset(CoRecordset.Create); pvStream.Position:=0; AR.Open(TStreamAdapter.Creat...

wh445306 564

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

手把手教您国内安装 Claude Code 并配置自定义大模型(包含New-API中转和可视化管理工具的使用)

国内免魔法畅用 Claude Code!手把手教你 Windows 安装、配置文件写法、对接阿里百炼 / DeepSeek / 智谱✨,附完整参数、正确命令、三方工具管理方案,新手一次成功!✅

XiaoqiangClub的博客 3784

Delphi编程中流的使用

什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向。流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。如果你对流的操作非常熟练,在程序中利用流的方便性,写起程序会大大提高效率的。   下面,笔者通过四个实例:EXE文件加密器、电子贺卡、自

songfuqiang的专栏 1059

基于STM32设计的智能水产养殖系统(2025)_359

本设计提出并实现了一种基于STM32F103RCT6微控制器的智能水产养殖控制系统,针对传统水产养殖中人工依赖高、环境参数监测滞后、控制手段单一等问题,集成了TDS水质检测、水温检测、水位监测、自动喂食、自动充氧、换水控制与加热保温等功能。系统采用ESP8266模块实现WIFI联网,通过MQTT协议将关键数据上传至华为云物联网平台,支持Android手机APP和Windows上位机远程监测与控制。同时,系统具备本地LCD数据显示与蜂鸣器异常报警功能,支持本地按键控制操作。整套系统功能完善,响应灵敏,运行稳定

626

Delphi中流的基本概念

一、Delphi中流的基本概念及函数声明 在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法。 TStream类中定义的属性介绍如下: 1、Size:此属性以字节返回流中数据大小。 2、Position:此属性控制流中存取指针的位置。 Tstream中定义的虚方法有四个: 1、Read:此方法实现将数据从流中读出。函数原形为: Function Read(var...

coollen的专栏 382

webrtc进阶-- FlexFEC 实现原理与调试分析(m80 代码对齐版)

WebRTC 中 FlexFEC 技术解析与调试指南 摘要:本文深入分析 WebRTC 的 FlexFEC(灵活前向纠错)技术实现原理,重点探讨其在 m80 版本中的协商机制、接收侧恢复流程以及 SFU 场景下的特殊处理。文章指出 FlexFEC 通过动态冗余策略提升弱网抗丢包能力,详细解析了编解码器分配、SSRC 映射、包恢复等关键环节,并提供了针对 XR+SFU 场景的调试建议。调试时可重点关注 FEC 包接收与媒体包恢复日志,以验证链路有效性。

HOSTEN的博客 49

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Delphi编程中流的应用

什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定 义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用 关心流的另一头数据的真正流向。流不但可以处理文件,还可以处理动态内存、网络数据等多种数

xinzheng_wang的博客 904

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于 Delphi 中流的使用(2) 用 TFileStream(文件流) 读写

关于 Delphi 中流的使用(2) 用 TFileStream(文件流) 读写 TStream 是一个抽象的基类, 不能直接生成对象. 在具体的应用中, 主要使用它的子孙类: TFileStream: 文件流 TStringStream: 字符串流 TMemoryStream: 内存流 TResourceStream: 资源文件流 THandleStream: 是 T

fyl_077的专栏 591

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

关于 Delphi 中流的使用(9) 分割与合并文件的函数

源:关于 Delphi 中流的使用(9) 分割与合并文件的函数

weixin_34221036的博客 120

Delphi中流的基本概念及函数声明

一、Delphi中流的基本概念及函数声明在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法。 TStream类中定义的属性介绍如下: 1、Size:此属性以字节返回流中数据大小。 2、Position:此属性控制流中存取指针的位置。 Tstream中定义的虚方法有四个: 1、Read:此方法实现将数据从流中读出。函数原形为: Function Read(va

huigezi123的专栏 642

Delphi中流对象的应用

Delphi的流对象(TStream的派生对象)有如下读写函数: function Read(var Buffer; Count: Longint): Longint; function Write(const Buffer; Count: Longint): Longint; procedure ReadBuffer(var Buffer; Count: Longint); proced

编程小战 2262
上一篇: Delphi 中流的使用
下一篇: delphi TStrings 管理对象的属性
jsrgren
博客等级 码龄15年 4粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值