现在的位置: 首页 > 综合 > 正文

如何在Com下使用TStringList

2017年12月18日 ⁄ 综合 ⁄ 共 1699字 ⁄ 字号 评论关闭

 unit uForm;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    hStrList: TStringList;
    v: OleVariant;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure VariantToStream(const Data: OleVariant; Stream: TStream);
var
  p: Pointer;
begin
  p := VarArrayLock(Data);
  try
    Stream.Write(p^, VarArrayHighBound(Data,1) + 1);  //assuming low bound = 0
  finally
    VarArrayUnlock(Data);
  end;
end;

function StreamToVariant(Stream: TStream): OleVariant;
var
  p: Pointer;
begin
  Result := VarArrayCreate([0, Stream.Size - 1], varByte);
  p := VarArrayLock(Result);
  try
    Stream.Position := 0;  //start from beginning of stream
    Stream.Read(p^, Stream.Size);
  finally
    VarArrayUnlock(Result);
  end;
end;

function StringlistToVariant(aStrlist: TStrings): OleVariant;
var
  hStream: TStream;
begin
  hStream := TMemoryStream.Create;
  try
    aStrList.SaveToStream(hStream);
    hStream.Seek(0,soFromBeginning);
    Result := StreamToVariant(hStream);
  finally
    hStream.Free;
  end;
end;

procedure VariantToStringlist(const Data: OleVariant; aStrlist: TStrings);
var
  hStream: TStream;
begin
  hStream := TMemoryStream.Create;
  try
    VariantToStream(Data,hStream);
    hStream.Seek(0,soFromBeginning);
    aStrList.LoadFromStream(hStream);
  finally
    hStream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  hStrList:= TStringList.Create;
  hStrList.Assign(Memo1.Lines);

  v := StringlistToVariant(hStrList);

  hStrList.Destroy;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  VariantToStringlist(v,Memo2.Lines);
end;

end.

 

抱歉!评论已关闭.