2

我根据这些说明制作了程序。效果很好,但我不知道为什么。

http://docwiki.embarcadero.com/CodeExamples/XE3/en/ComponentToString_(Delphi)

我的代码是:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

function ComponentToStringProc(Component: TComponent): string;
var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;
    end;
  finally
    BinStream.Free
  end;
end;

function StringToComponentProc(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result:= BinStream.ReadComponent(nil);
    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text:= ComponentToStringProc(Image1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var img:TImage;
begin
  img:= (StringToComponentProc(Memo1.Text) as TImage);
  img.Left:=200;
  img.Top:=96;
  img.Parent:=form1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.Bitmap.Height:=Image1.Height;
  Image1.Picture.Bitmap.Width:=Image1.Width;
  Image1.Picture.Bitmap.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
end;
initialization

RegisterClass(TImage);
end.

我的问题是:为什么我有

initialization


RegisterClass (TImage);

当 Image2 是放置在 form1 上的可视组件时?

如果缺少两行,则显示错误 219 Invalid typecast

4

1 回答 1

2

流框架需要能够将组件类名转换为类。一旦完成,它就能够实例化正确类的对象。

关键代码行是:

Result := BinStream.ReadComponent(nil);

虽然Result有类型TComponent,但实际运行时类型可以是TComponent. 在你的情况下,TImage.

因此,为了能够将字符串'TImage'转换为元类TImage,需要有一个类及其名称的注册表(即映射)。该注册表由对RegisterClass. 如果没有该调用,流框架无法找到TImage名为的元类'TImage'。所以它不能在组件中流式传输。

尽管您正在使用 FPC,但 Delphi文档对RegisterClass您会有所帮助。

于 2013-05-06T21:33:23.693 回答