Rozwiązanie PRUZ jest gotowym rozwiązaniem, JVCL jest open-source, a korzystanie z JvFormStorage jest proste, ale możesz także użyć własnego mechanizmu przesyłania strumieniowego Delphi bez użycia komponentów innych firm. Oto przykład:.
procedure SaveComponentToFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
FileStream := TFileStream.Create(FileName,fmCreate);
try
MemStream := TMemoryStream.Create;
MemStream.WriteComponent(Component);
MemStream.Position := 0;
ObjectBinaryToText(MemStream, FileStream);
finally
MemStream.Free;
FileStream.Free;
end;
end;
SaveComponentToFile trwa instancji składnika, a także nazwę pliku i strumieni komponentu do pliku, w tekście czytelnym dla człowieka
Aby załadować komponent z pliku, można użyć kodu:
procedure LoadComponentFromFile(Component: TComponent; const FileName: TFileName);
var
FileStream : TFileStream;
MemStream : TMemoryStream;
i: Integer;
begin
MemStream := nil;
if not Assigned(Component) then
raise Exception.Create('Component is not assigned');
if FileExists(FileName) then
begin
FileStream := TFileStream.Create(FileName,fmOpenRead);
try
for i := Component.ComponentCount - 1 downto 0 do
begin
if Component.Components[i] is TControl then
TControl(Component.Components[i]).Parent := nil;
Component.Components[i].Free;
end;
MemStream := TMemoryStream.Create;
ObjectTextToBinary(FileStream, MemStream);
MemStream.Position := 0;
MemStream.ReadComponent(Component);
Application.InsertComponent(Component);
finally
MemStream.Free;
FileStream.Free;
end;
end;
end;
LoadComponentFromFile trwa instancji składnika, a nazwa pliku, a następnie wczytuje zawartość pliku do instancji składnika. Aby uniknąć konfliktu nazw, udostępniamy wszystkie istniejące elementy instancji przed załadowaniem do niej danych.
Teraz można użyć powyższego kodu do zapisywania formularza do pliku:
SaveComponentToFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm jest instancją formularz, a zostanie on zapisany w pliku „formdata.txt” wewnątrz tego samego folderu jako Plik EXE.
I załadować FSecondForm z „formdata.txt” pliku, możemy napisać tak:
if not Assigned(FSecondForm) then
FSecondForm := TfrmSecond.Create(Application);
LoadComponentFromFile(FSecondForm,ExtractFilePath(Application.ExeName)+ 'formdata.txt');
FSecondForm.Show;
LoadComponentFromFile potrzebuje instancji być utworzony najpierw, więc sprawdzić, czy FSecondForm jest przypisany, jeśli nie, możemy utworzyć jego instancja (jest to instancja klasy TfrmSecond), a następnie ładuje do niej dane pliku. I w końcu pokazujemy załadowany formularz.
Dzięki, że wygląda dobrze. Teraz po prostu zapakuję go w pętlę i sprawię, że będzie rekursywna, i mam zamiar odejść. – Mawg
Dlaczego ustawienie Parent na zero przed zwolnieniem komponentu potomnego? Zamiast całej pętli for, czy 'Component.DestroyComponents' nie poradziłby sobie równie dobrze? – NGLN
Dlaczego 'LoadComponentFromFile()' dodaje 'Komponent' do listy" posiadanych "aplikacji? Wcale nie powinno tak być. –