delphi合并流文件
Delphi-IdHTTP多线程下载

if i = nn then
begin
last[i] := avg*i + aFileSize-avg*nn; //这里原先是aFileSize
end;
fileName := aFile + IntToStr(i);
mStream2.clear;
i := i + 1;
end;
mStream2.free;
mStream1.SaveToFile('设备工程进度管理前期规划.doc');
procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
if AbortTransfer then
begin
IdHTTP1.Disconnect; //中断下载
Exit;
end;
end;
end;
//开始下载前,将ProgressBar1的最大值设置为需要接收的数据大小.
procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
FileSize: integer;
begin
IdHTTP1.Head(aURL);
FileSize := IdHTTP1.Response.ContentLength;
用Delphi合并Word表格中单元格

用Delphi合并Word表格中单元格]//合并Word 表格中单元格procedure mergeWordCell;var WordApp: TWordApplication;WordDoc: TWordDocument;DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat: OleVariant; i,iRow,iCol:integer;myCell:Cell;myRow:Row;beginmemo1.Lines.Clear ;// ===== 创建对象 =====if not Assigned(WordApp) thenbeginWordApp:= TWordApplication.Create(nil);WordApp.Visible := false;end;if not Assigned(WordDoc) thenWordDoc:= TWordDocument.Create(nil);tryDocInx:=1;oFileName := 'd: est.doc';oReadOnly:=true;CfCversions := EmptyParam;AddToRctFiles:= EmptyParam;PswDocument:= EmptyParam;PswTemplate:= EmptyParam;oRevert:= EmptyParam;WPswDocument:= EmptyParam;WPswTemplate:= EmptyParam;oFormat:= EmptyParam;// ===== 打开文件 =====WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);// ===== 关联文件 =====WordDoc.ConnectTo(WordApp.Documents.Item(DocInx));//合并第一、二列iStart:=WordDoc.Tables.Item(i).Cell(1,1).Range.Start;myCol:= WordDoc.Tables.Item(i).Columns.Item(2);iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;myRange:=WordDoc.Range;myRange.Start:=iStart;myRange.End_ :=iEnd;myRange.Cells.Merge;finallyif Assigned(WordDoc) then // ===== 关闭文件 =====beginWordDoc.Close;WordDoc.Disconnect;WordDoc.Destroy;WordDoc := nil;end;if Assigned(WordApp) then // ===== 关闭Word =====beginWordApp.Quit;WordApp.Disconnect;WordApp.Destroy;WordApp := nil;end;end;end;取得Word 表格中的数据//取得Word 表格中的数据procedure getWordCellStr;var WordApp: TWordApplication;WordDoc: TWordDocument;DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat: OleVariant;i,iRow,iCol:integer;myCell:Cell;myRow:Row;beginmemo1.Lines.Clear ;// ===== 创建对象 =====if not Assigned(WordApp) thenbeginWordApp:= TWordApplication.Create(nil);WordApp.Visible := false;end;if not Assigned(WordDoc) thenWordDoc:= TWordDocument.Create(nil);tryDocInx:=1;oFileName := 'd: est.doc';oReadOnly:=true;CfCversions := EmptyParam;AddToRctFiles:= EmptyParam;PswDocument:= EmptyParam;PswTemplate:= EmptyParam;oRevert:= EmptyParam;WPswDocument:= EmptyParam;WPswTemplate:= EmptyParam;oFormat:= EmptyParam;// ===== 打开文件 =====WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);// ===== 关联文件 =====WordDoc.ConnectTo(WordApp.Documents.Item(DocInx));//方法(1)==> 规则表For i := 1 To WordDoc.Tables.Count do//第 i 个表begin //第 iRow 行For iRow := 1 To WordDoc.Tables.Item(i).Rows.Count dobegin //第 iCol列For icol := 1 To WordDoc.Tables.Item(i).Columns.Count dobeginmyCell:=WordDoc.Tables.Item(i).Cell(iRow,icol);memo1.Lines.add(myCell.Range.Text);end;end;end;//方法(2)==> 不规则表:只有横向合并时For i := 1 To WordDoc.Tables.Count do//第 i 个表beginFor iRow := 1 To WordDoc.Tables.Item(i).Rows.Count dobeginmyRow:=WordDoc.Tables.Item(i).Rows.Item(iRow);//第 iRow 行 For icol := 1 To myRow.Cells.Count do//第 iCol列beginmyCell:= myRow.Cells.Item(iCol) ;memo1.Lines.add(myCell.Range.Text);end;end;end;//方法(3)==> 不规则:横向、纵向合并时;任何表格For i := 1 To WordDoc.Tables.Count do//第 i 个表begin //第 j 个Cellfor j := 1 To WordDoc.Tables.Item(i).Range.Cells.Count dobeginmyCell := WordDoc.Tables.Item(i).Range.Cells.Item(j);memo1.Lines.add(myCell.Range.Text);end;end;finallyif Assigned(WordDoc) then // ===== 关闭文件 =====beginWordDoc.Close;WordDoc.Disconnect;WordDoc.Destroy;WordDoc := nil;end;if Assigned(WordApp) then // ===== 关闭Word =====beginWordApp.Quit;WordApp.Disconnect;WordApp.Destroy;WordApp := nil;end;end;end;取得Word文件的数据//取得Word文件的数据procedure getWordStr;var WordApp: TWordApplication;WordDoc: TWordDocument;DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat: OleVariant; i,iRow,iCol:integer;myCell:Cell;myRow:Row;beginmemo1.Lines.Clear ;// ===== 创建对象 =====if not Assigned(WordApp) thenbeginWordApp:= TWordApplication.Create(nil);WordApp.Visible := false;end;if not Assigned(WordDoc) thenWordDoc:= TWordDocument.Create(nil);tryDocInx:=1;oFileName := 'd://est.doc';oReadOnly:=true;CfCversions := EmptyParam;AddToRctFiles:= EmptyParam;PswDocument:= EmptyParam;PswTemplate:= EmptyParam;oRevert:= EmptyParam;WPswDocument:= EmptyParam;WPswTemplate:= EmptyParam;oFormat:= EmptyParam;// ===== 打开文件 =====WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);// ===== 关联文件 =====WordDoc.ConnectTo(WordApp.Documents.Item(DocInx));//方法(1): 取整个文本的字符内容,包含表格s := WordDoc.Range.text;//方法(2): 取 1 -- 4 位的字符,包含表格myRange:=WordDoc.Range;myRange.Start:=0;myRange.End_ :=4;finallyif Assigned(WordDoc) then // ===== 关闭文件 ===== beginWordDoc.Close;WordDoc.Disconnect;WordDoc.Destroy;WordDoc := nil;end;if Assigned(WordApp) then // ===== 关闭Word ===== beginWordApp.Quit;WordApp.Disconnect;WordApp.Destroy;WordApp := nil;end;end;end;。
delphiPDF控件介绍

delphiPDF控件介绍PDF控件介绍概述llPDFLib 是⽤于创建 PDF ⽂档的纯 Object Pascal 库。
该库不使⽤任何 DLL 或外部第三⽅软件来⽣成 PDF ⽂件。
库包括具有属性和⽅法的TPDFDocument组件,如 Delphi 的TPrinter,但旨在⽣成 PDF ⽂件。
特征真正的 Canvas.Handle (HDC)。
Unicode ⽀持。
PDF/A-1b ⽀持。
加密(40、128 位 RC4 和 128、256 AES)。
书签(⽀持俄语、⼟⽿其语、波罗的海、东欧、希腊、中⽇韩语⾔)。
填充图案⽀持。
可选内容(层)⽀持。
交互式表单(Acroforms)(buttons, radiobuttons, checkboxes, comboboxes, text input fields)。
压缩。
将输出呈现到 Stream 中,以便与 CGI/ISAPI 应⽤程序⼀起使⽤。
⽔印。
数字签名。
缩略图。
图像压缩(Jpeg、Flate、CCITT 3、CCITT 3 (2D)、CCITT 4、JBIG2)。
过滤器 QReport、FastReport、Report Builder。
C++ Builder 4、5、6、2006 ⽀持。
注释(⽀持俄语、⼟⽿其语、波罗的海、东欧、希腊、中⽇韩语⾔)。
嵌⼊ True Type 字体(TTF 和 TTC)。
模拟 Underline 和 StrikeOut 字体样式。
⼀组⽤于使⽤ DBGrids 的组件。
True Type 字体⼦集。
概述Synopse PDF 引擎是⼀个功能齐全的开源 PDF ⽂档创建库,⽤于 Delphi 和 FPC,嵌⼊在⼀个单元中。
被⽤于中,⽤于从⽣成的报告创建 PDF ⽂件。
如果下载整个mORMot源代码,则不需要这个单独的包。
特征纯 Delphi 代码,没有外部 .dll,并且为您的可执⾏⽂件添加了⾮常⼩的代码⼤⼩;针对Delphi 6及以上版本,包括Unicode版本的Delphi和最新版本的FPC,适⽤于Win32和Win64平台,并提供完整的源代码;包括⼤多数⽮量绘图命令,包括⽂本、线条或曲线;渲染位图和图元⽂件(即使是⼤多数具有剪辑和区域功能的 .emf ⽂件);引⼊元数据、书签和⼤纲信息;⽣成⾮常⼩的 .pdf ⽂件;可选择使⽤ 40 位或 128 位密钥;以低内存开销快速⽣成⽂件(⽤数千页测试);访问⼀个真正的 VCL TCanvas 实例来创建 PDF 内容;可选择嵌⼊ True Type 字体⼦集;Unicode 就绪,即使使⽤ Unicode 之前的 Delphi 版本,包括⾼级;可以发布PDF/A-1存档⽂件;⽤于许多应⽤程序,并定期进⾏增强,主要来⾃活跃的最终⽤户;根据获得许可。
flink datastream 合并方法

flink datastream 合并方法Flink是一个流式计算引擎,支持对实时数据流进行高效处理和分析。
Flink DataStream API是Flink提供的一套用于操作和处理数据流的API。
在实际的应用场景中,我们常常需要对不同的数据流进行合并操作,以便进行更复杂和全面的分析。
本文将介绍Flink DataStream API中的合并方法,包括union、connect 和colocate等步骤,以帮助读者更好地理解和应用这些方法。
1. DataStream的合并操作介绍在Flink DataStream API中,有多种方法可以对不同的数据流进行合并操作。
合并操作的目的是将两个或多个数据流合并为一个数据流,以便进行后续的处理和分析。
常见的合并操作包括union、connect和colocate。
Union操作用于将多个数据流合并为一个数据流。
被合并的数据流可以具有不同的数据类型,但是它们的记录结构需要保持一致。
合并后的数据流将按照事件的发生顺序输出。
Connect操作用于将两个数据流合并为一个数据流。
被合并的数据流可以具有不同的数据类型和记录结构。
合并后的数据流将按照事件的发生顺序输出。
Colocate操作用于将多个数据流合并为一个数据流,并将合并后的数据流的记录分配到同一个任务上。
被合并的数据流可以具有不同的数据类型和记录结构。
2. Union操作的应用使用Union操作可以将两个或多个数据流合并为一个数据流。
在使用Union操作时,需要注意以下几点:被合并的数据流的记录结构需要保持一致,即它们具有相同的字段类型和顺序;合并后的数据流将按照事件的发生顺序输出,即如果两个数据流同时产生了新的记录,则按照产生顺序先输出第一个数据流的记录,再输出第二个数据流的记录。
下面是一个使用Union操作的示例代码:DataStream<Integer> stream1 = ...DataStream<Integer> stream2 = ...DataStream<Integer> mergedStream = stream1.union(stream2);在这个示例中,我们首先定义了两个整数类型的数据流`stream1`和`stream2`,然后使用Union操作将它们合并为一个数据流`mergedStream`。
delphi使用流实现jpg文件的处理(转)-推荐下载

一、原理介绍--流式数据的类型及其应用在Dephi中提供了TStream来支持对流式数据的操作。
TStream是万流之源。
但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。
TStream提供了统一、简洁的方法来进行数据的读写。
1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据实际使用时我们基本上只要使用上面两个函数就可以了。
二、所遇到的问题及相应的解决方法为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
(一)所遇到的问题第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却是以JPEG格式保存的。
(二)相应的解决方法为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Binary Large Object),它是用来处理某些特殊格式的数据的。
BLOB在数据库的表中实际上是以二进制数据的形式存放的。
delphi流的操作

Delphi流的操作一、流的概念流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向。
其实,流就是把整个对象转化为一个一个单字节数据,然后形成数据流,其形同把固体石块打碎成一颗颗细小的沙子一样,最后可以形成流沙。
二、流的主要功能流的主要功能是对文件与非文件数据相互转换进行操作(即它们之间的I/O操作)。
如将图片文件保存到数据库,那么数据库中的图片数据就变成非文件数据了,它只属于某记录某字段的数据。
而诸如网络上传输的数据、内存中的存储的数据等也都属于非文件数据,这些数据要转变成文件也需要流操作。
三、Delphi中流的基本概念及函数声明㈠流的属性在Delphi中,所有流对象的基类为Tstream类,其中定义了所有流的共同属性和方法。
以下为Tstream类中定义的属性:1.Size:此属性以字节返回流中数据大小。
2.Position:此属性控制流中存取指针的位置。
㈡Tstream定义的虚方法:1. Read:此方法实现将数据从流中读出。
函数原形为:Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;参数Buffer为数据读出时放置的缓冲区,Count为需要读出的数据的字节数,该方法返回值为实际读出的字节数,它可以小于或等于Count中指定的值。
2.Write:此方法实现将数据写入流中。
函数原形为:Function Write(var Buffer;Count:Longint):Longint;virtual;abstract;参数Buffer为将要写入流中的数据的缓冲区,Count为数据的长度字节数,该方法返回值为实际写入流中的字节数。
3、Seek:此方法实现流中读取指针的移动。
函数原形为:Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:soFromBeginning:Offset为移动后指针距离数据开始的位置。
delphi excel 例程

delphi excel 例程Delphi Excel 例程:一步一步回答在Delphi中,我们可以使用Excel 例程来实现与Excel文件的交互。
Excel 例程是一组可以通过Delphi编程语言来操作Excel文件的方法和函数。
本文将介绍如何使用Delphi和Excel 例程来创建、读取、写入和操作Excel 文件。
第一步:安装Excel 例程要开始使用Delphi和Excel 例程,我们首先需要安装Excel 例程库。
这可以通过三种方法之一来实现:1. 使用ActiveX组件:在Delphi IDE的“Component”菜单下,选择“Import ActiveX Control”。
在弹出的窗口中,选择“Microsoft Excel xx.x Object Library”(其中"xx.x"表示Excel版本号),然后点击“Install”按钮进行安装。
2. 使用第三方库:你还可以使用第三方库,如TExcelComponent或Flexcel,它们提供了更多的功能和灵活性。
3. 编写自己的Excel 例程:如果你对编程充满信心,你可以自己编写一组Excel 例程,以与Excel文件交互。
不过,这需要一些时间和努力。
第二步:创建一个新的Excel文件在使用Delphi和Excel 例程之前,我们首先需要创建一个Excel文件。
下面是示例代码,展示了如何使用Excel 例程来创建和保存一个新的Excel文件:delphivarExcelApp: Variant;ExcelWorkbook: Variant;ExcelWorksheet: Variant;begin创建Excel应用程序对象ExcelApp := CreateOleObject('Excel.Application');创建一个新的工作簿ExcelWorkbook := ExcelApp.Workbooks.Add;获取第一个工作表ExcelWorksheet := ExcelWorkbook.Worksheets.Item[1];设置单元格的值ExcelWorksheet.Cells[1, 1].Value := 'Hello'; ExcelWorksheet.Cells[1, 2].Value := 'World!';保存工作簿ExcelWorkbook.SaveAs('C:\NewExcelFile.xlsx');关闭Excel应用程序ExcelApp.Quit;end;通过这段代码,我们可以创建一个新的Excel应用程序对象,并在其中创建一个新的工作簿。
delphi资源文件制作及使用详解

摘自:/showinfo/delphi-131567.html一、引子:现在的Windows应用程序几乎都使用图标、图片、光标、声音等,我们称它们为资源(Resource)。
最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用。
资源是程序的一部分,程序要正常运行就离不了资源文件。
但是它是不可执行代码。
为了更好地管理资源,Delphi中提供了一种.RES类型的资源文件。
它可以把我们程序中所需要的资源整合到一个资源文件(.RES)下来。
在编译应用程序时直接编译进了可执行程序里,成为应用程序的整合体。
这样做的好处是:1。
由于定位资源比在磁盘中定位文件花费时间少,所以应用程序执行会更快。
2。
多种资源可以放在一个文件中,减少了图标、图片、光标、声音等文件数量。
不用怕用户在使用过程中的不小心而损坏了资源文件致使程序无法正常运行。
缺点是:因为资源文件的加入从而加大了编译出的可执行程序的字节数,当资源文件较大时会使应用程序变得看起来雍肿。
使用资源文件的优点很显著,其缺点也很突出。
所以在实际应用中就要根据情况权衡利弊、灵活使用,这已不在本文的讨论之列。
下面仅就Delphi系统编程中对于资源文件的使用方法做一个大致的总结。
二、创建资源文件:注意事项:创建的资源文件名不要和工程名相同,因为Delphi创建工程时会自动创建一个和工程名相同的资源文件。
并且最好将资源文件保存到和工程文件同一个文件夹中。
1.首先创建一个.Rc的纯文本文件。
格式如下:资源标识符关键字资源文件名格式说明:①资源标识符:程序中调用资源时的特定标号;②关键字:标识资源文件类型;例如:Wave :资源文件是声音文件;RCDATA:JPEG文件;A VI :A VI动画;ICON :图标文件;BITMAP:位图文件;CURSOR:光标文件;RMI :RMI音乐文件;MIDI :MIDI音乐文件③资源文件名:加入的资源文件名(要带扩展名,可以带路径名构成全文件名);④举例:MyWav WA VE "FileName.Wav"MyMID MIDI "C:\My Documents\my music\canyon.MID"MyA VI A VI "SpeedIs.A VI"例中资源文件名可以不加引号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses MMSystem;
{合并两个 Wav 文件流的函数}
function ConWavStream(AWavStream1, AWavStream2: TStream; var ANewStream: TStream): Boolean; type
TWavFormat = packed record
ChunkID: array[0..3] of AnsiChar; {'RIFF'}
ChunkSize: Longword; {size-8}
Format: array[0..3] of AnsiChar; {'WAVE'}
SubChunk1ID: array[0..3] of AnsiChar; {'fmt '}
SubChunk1Size: Longword; {hex10}
AudioFormat: Word; {hex 01}
NumOfChannels: Word; {1 mono, 2 stereo}
SampleRate: Longword; {number of samples/sec}
ByteRate: Longword;{samplerate* num of channels*bytes per (mono) sample}
BytesperSample: Word; {size of (mono) sample}
BitsPerSample: Word; {BytesperSample *8}
SubChunk2ID: array[0..3] of AnsiChar; {'data'}
SubChunk2Size: Longword; {number of data bytes}
end;
var
vWavFormat1: TWavFormat;
vWavFormat2: TWavFormat;
vChunkSize1, vChunkSize2: Integer;
begin
Result := False;
if AWavStream1.Read(vWavFormat1, SizeOf(TWavFormat)) <> SizeOf(TWavFormat) then Exit; if AWavStream2.Read(vWavFormat2, SizeOf(TWavFormat)) <> SizeOf(TWavFormat) then Exit; if vWavFormat1.ChunkID <> 'RIFF'then Exit;
if vWavFormat1.SubChunk2ID <> 'data'then Exit;
vChunkSize1 := vWavFormat1.SubChunk2Size;
vChunkSize2 := vWavFormat2.SubChunk2Size;
vWavFormat1.ChunkSize := 0;
vWavFormat1.SubChunk2Size := 0;
vWavFormat2.ChunkSize := 0;
vWavFormat2.SubChunk2Size := 0;
if not CompareMem(@vWavFormat1, @vWavFormat2, SizeOf(TWavFormat)) then Exit; {格式不同}
vWavFormat1.ChunkSize := vChunkSize1 + vChunkSize2 + SizeOf(vWavFormat1) - 8;
vWavFormat1.SubChunk2Size := vChunkSize1 + vChunkSize2;
ANewStream.Write(vWavFormat1, SizeOf(TWavFormat));
ANewStream.CopyFrom(AWavStream1, vChunkSize1);
ANewStream.CopyFrom(AWavStream2, vChunkSize2);
Result := True;
end; { ConWavStream End}
var
WavStream: TStream;
{合并两个资源流; 之前要在资源中分别加载两个 WAV 文件, 并分别命名: wav1、wav2}
procedure TForm1.FormCreate(Sender: TObject);
var
rs1,rs2: TResourceStream;
begin
rs1 := TResourceStream.Create(HInstance, 'wav1', RT_RCDATA);
rs2 := TResourceStream.Create(HInstance, 'wav2', RT_RCDATA);
WavStream := TMemoryStream.Create;
ConWavStream(rs1, rs2, WavStream);
rs1.Free;
rs2.Free;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
WavStream.Free;
end;
{循环播放}
procedure TForm1.Button1Click(Sender: TObject);
begin
sndPlaySound(TMemoryStream(WavStream).Memory, SND_ASYNC or SND_MEMORY or SND_LOOP); end;
{暂停}
procedure TForm1.Button2Click(Sender: TObject);
begin
sndPlaySound(nil, 0);
end;
end.。