Move WriteBuffer ReadBuffer String
2015-12-30 01:05
561 查看
在实际编程中,经常会用到Buffer,当string作为Buffer传值时需要注意的是
1, string的值的起始索引是1,千万记住!
2, 有时候需要先告诉系统去开辟出内存空间,用SetLength函数。
如下代码,示范了再Move、 WriteBuffer、 ReadBuffer时候的用法:
[delphi] view plaincopy
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm3 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
FMemoryStream: TMemoryStream;
FBuffer: string;
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
begin
LStr := '太棒了!Hello, 世界 我太爱你了';
LLen := Length(LStr);
FMemoryStream.WriteBuffer(LLen, SizeOf(LLen));
// 要用LStr[1], 而不是LStr
FMemoryStream.WriteBuffer(LStr[1], LLen);
end;
procedure TForm3.Button2Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
begin
// 因为写入与读出在一个工程中,所以先把指针指向开头位置
FMemoryStream.Position := 0;
FMemoryStream.ReadBuffer(LLen, SizeOf(LLen));
SetLength(LStr, LLen);
// 要用LStr[1], 而不是LStr
FMemoryStream.ReadBuffer(LStr[1], LLen);
Memo1.Lines.Add(LStr);
end;
procedure TForm3.Button3Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
LIndex: Integer;
begin
LStr := '世界很美好 Hello, World!';
LLen := Length(LStr);
// 先为FBuffer开辟出空间
SetLength(FBuffer, SizeOf(LLen) + LLen);
LIndex := 1;
// FBuffer的起始位置为1
Move(LLen, FBuffer[1], SizeOf(LLen));
// 计算Buffer指针的移动位置
Inc(LIndex, SizeOf(LLen));
// 要用LStr[1], 而不是LStr
Move(LStr[1], FBuffer[LIndex], LLen);
end;
procedure TForm3.Button4Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
LIndex: Integer;
begin
LIndex := 1;
Move(FBuffer[1], LLen, SizeOf(LLen));
Inc(LIndex, SizeOf(LLen));
SetLength(LStr, LLen);
// 要用LStr[1], 而不是LStr
Move(FBuffer[LIndex], LStr[1], LLen);
Memo1.Lines.Add(LStr);
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
FMemoryStream := TMemoryStream.Create;
end;
procedure TForm3.FormDestroy(Sender: TObject);
begin
FMemoryStream.Free;
end;
end.
http://blog.csdn.net/procedure1984/article/details/5419454
1, string的值的起始索引是1,千万记住!
2, 有时候需要先告诉系统去开辟出内存空间,用SetLength函数。
如下代码,示范了再Move、 WriteBuffer、 ReadBuffer时候的用法:
[delphi] view plaincopy
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm3 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
FMemoryStream: TMemoryStream;
FBuffer: string;
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
begin
LStr := '太棒了!Hello, 世界 我太爱你了';
LLen := Length(LStr);
FMemoryStream.WriteBuffer(LLen, SizeOf(LLen));
// 要用LStr[1], 而不是LStr
FMemoryStream.WriteBuffer(LStr[1], LLen);
end;
procedure TForm3.Button2Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
begin
// 因为写入与读出在一个工程中,所以先把指针指向开头位置
FMemoryStream.Position := 0;
FMemoryStream.ReadBuffer(LLen, SizeOf(LLen));
SetLength(LStr, LLen);
// 要用LStr[1], 而不是LStr
FMemoryStream.ReadBuffer(LStr[1], LLen);
Memo1.Lines.Add(LStr);
end;
procedure TForm3.Button3Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
LIndex: Integer;
begin
LStr := '世界很美好 Hello, World!';
LLen := Length(LStr);
// 先为FBuffer开辟出空间
SetLength(FBuffer, SizeOf(LLen) + LLen);
LIndex := 1;
// FBuffer的起始位置为1
Move(LLen, FBuffer[1], SizeOf(LLen));
// 计算Buffer指针的移动位置
Inc(LIndex, SizeOf(LLen));
// 要用LStr[1], 而不是LStr
Move(LStr[1], FBuffer[LIndex], LLen);
end;
procedure TForm3.Button4Click(Sender: TObject);
var
LStr: string;
LLen: Integer;
LIndex: Integer;
begin
LIndex := 1;
Move(FBuffer[1], LLen, SizeOf(LLen));
Inc(LIndex, SizeOf(LLen));
SetLength(LStr, LLen);
// 要用LStr[1], 而不是LStr
Move(FBuffer[LIndex], LStr[1], LLen);
Memo1.Lines.Add(LStr);
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
FMemoryStream := TMemoryStream.Create;
end;
procedure TForm3.FormDestroy(Sender: TObject);
begin
FMemoryStream.Free;
end;
end.
http://blog.csdn.net/procedure1984/article/details/5419454
相关文章推荐
- Java压缩JS、CSS并合并,网上收集汇总
- jQuery插件
- Hibernate中BookClassId作为外键,Book.jsp访问BookClassName
- 原 JS监听回车事件
- html5 input
- html5 datalist
- javascript 学习一:js语法基础
- 前端--关于背景、浮动和定位
- **LeetCode 24. Swap Nodes in Pairs
- JavaScript正则表达式解析URL的技巧
- javascript实现禁止复制网页内容汇总
- Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
- jQuery给元素添加样式的方法详解
- jQuery拖动元素并对元素进行重新排序
- JavaScript小技巧整理
- 分享两款带遮罩的jQuery弹出框
- JavaScript阻止回车提交表单的方法
- 基于JavaScript实现手机短信按钮倒计时(超简单)
- 基于jQuery实现美观且实用的倒计时实例代码
- 值得分享的Bootstrap Ace模板实现菜单和Tab页效果