Fórum [rfps] --gt; Converter dfm em form #183061
19/09/2003
0
Bem, não entendi pq minha mensagem foi removida... Não havia nada pejorativo no título + tudo bem, vai ae a mensagem novamente, c alguém puder me ajudar agradecerei muito.
===========
Olá pessoal, preciso fazer uma coisa. Tenho a descrição textual de um
componente. Este componente pode ser qquer coisa (Botão,label...Form).
Preciso recriar o componente com base nesta descrição dele.
Vou passar para ele o seguinte texto, por exemplo:
object BitBtn1: TBitBtn
Left = 168
Top = 72
Width = 75
Height = 25
Caption = ´Botao´
TabOrder = 0
end
quero que ao passar esta descrição ele me retorno o componete. Para
isto estou usando a seguinte rotina abaixo:
function StringToComponent(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;
tenho no meu form o seguinte código com a intenção de passar o texto
e receber o ´componente´
var comp:TBitbtn;
begin
try
comp:=TBitBtn.Create(self);
comp.Parent:=FormMestre;
comp:=(StringToComponent(texto)) as TBitBtn;
finally
comp.free;
end;
end;
Bem, o fato é que eu passo a descrição textual dele, ele
aparentemente gera o componente + na hora de dar o result da função
StringToComponent ele ´fala´ que não encontrou a Classe TBitbtn.
Por favor, alguém pode me dar uma ajuda!
Desde já, obrigadão
===========
Olá pessoal, preciso fazer uma coisa. Tenho a descrição textual de um
componente. Este componente pode ser qquer coisa (Botão,label...Form).
Preciso recriar o componente com base nesta descrição dele.
Vou passar para ele o seguinte texto, por exemplo:
object BitBtn1: TBitBtn
Left = 168
Top = 72
Width = 75
Height = 25
Caption = ´Botao´
TabOrder = 0
end
quero que ao passar esta descrição ele me retorno o componete. Para
isto estou usando a seguinte rotina abaixo:
function StringToComponent(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;
tenho no meu form o seguinte código com a intenção de passar o texto
e receber o ´componente´
var comp:TBitbtn;
begin
try
comp:=TBitBtn.Create(self);
comp.Parent:=FormMestre;
comp:=(StringToComponent(texto)) as TBitBtn;
finally
comp.free;
end;
end;
Bem, o fato é que eu passo a descrição textual dele, ele
aparentemente gera o componente + na hora de dar o result da função
StringToComponent ele ´fala´ que não encontrou a Classe TBitbtn.
Por favor, alguém pode me dar uma ajuda!
Desde já, obrigadão
Rfpsatin
Curtir tópico
+ 0
Responder
Posts
19/09/2003
Lfernandos
Você precisa registrar a Classe TBitBtn
Adicione as seguintes linhas antes do end. do form no seu programa que vai funcionar:
...
initialization
RegisterClass(TBitBtn);
finalization
UnRegisterClass(FindClass(´TBitBtn´));
...
Veja o seu código-fonte que alterei:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
comp : TBitBtn;
texto: String;
implementation
{$R *.DFM}
function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TStream;
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
try
comp := TBitBtn.Create(self);
comp.Parent := Self;
comp:= (StringToComponent(texto)) as TBitBtn;
finally
comp.free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
texto :=
´object BitBtn1: TBitBtn ´ +
´Left = 168 ´ +
´Top = 72 ´ +
´Width = 75 ´ +
´Height = 25 ´ +
´Caption = ´´Botao´´´ +
´TabOrder = 0 ´ +
´end ´;
end;
initialization
RegisterClass(TBitBtn);
finalization
UnRegisterClass(FindClass(´TBitBtn´));
end.
Adicione as seguintes linhas antes do end. do form no seu programa que vai funcionar:
...
initialization
RegisterClass(TBitBtn);
finalization
UnRegisterClass(FindClass(´TBitBtn´));
...
Veja o seu código-fonte que alterei:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
comp : TBitBtn;
texto: String;
implementation
{$R *.DFM}
function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TStream;
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
try
comp := TBitBtn.Create(self);
comp.Parent := Self;
comp:= (StringToComponent(texto)) as TBitBtn;
finally
comp.free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
texto :=
´object BitBtn1: TBitBtn ´ +
´Left = 168 ´ +
´Top = 72 ´ +
´Width = 75 ´ +
´Height = 25 ´ +
´Caption = ´´Botao´´´ +
´TabOrder = 0 ´ +
´end ´;
end;
initialization
RegisterClass(TBitBtn);
finalization
UnRegisterClass(FindClass(´TBitBtn´));
end.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)