function ComponentToString(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 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;
UpdateResource & StringToComponent
1. Как правильно пользоваться функцией UpdateResource для удаления и изменения ресурсов.
2. Я имею функцию превращения компонентов формы в RCData код и наоборот
Код:
ComponentTostring работает нормально, а StringToComponent выдает ошибку, что класса заданного в коде не существует
Что делать?
2. компонент какого именно класса ты сохранил?
2. Целую форму с компонентами
UpdateResource(....,0,0); //ресурс будет удалён
а при изменении просто ставь указатель на данные, которые тебе надо сохранить в ресурсе. собственно, в чём тут может быть проблема?
2. методу ReadComponent, в данном случае, передвавай указатель на уже созданный компонент, и метод в свою очередь просто заполнит его свойства дынными, которые сохраненты в TStream.
button2.assign(stringToComponent(memo1.Text));
текст мемо такой :
object Button2: TButton
Left = 496
Top = 128
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 2
end
Та же ошибка.
Цитата: Witaliy
2. Делаю так :
button2.assign(stringToComponent(memo1.Text));
button2.assign(stringToComponent(memo1.Text));
тебе надо переписать функцию stringToComponent так чтобы она принимала ещё один параметр - указатель на компонент. А вызывать ReadComponent тебе надо указав этот компонент.
А можети вы переписать функцию, который там должен быть новый параметр?
Код:
procedure StringToComponent(aComponent:TComponent;Value: string);
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
BinStream.ReadComponent(aComponent);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
BinStream.ReadComponent(aComponent);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
А можно сделать, чтобы к форме добавились компоненты, которые записаны в коде? Может можно загрузить всю форму?
т.е. ты хочешь сохранить в строку одну форму, а загрузить эту строку в другую? нет, так не получится.
А создавать новые компоненты из сроки можно?
если захотеть, то можно. но я не хочу :)
Тогда подскажи как мне сделать. Я хочу.