2010-07-02 16 views
15

Mam więc formularz z kilkudziesięcioma kontrolkami, a ktoś chciałby zapisać i później przywrócić jego zawartość i ustawienia - który przycisk opcji został wybrany, jaka była pozycja tego w górę/w dół, itp.Jak zapisać i przywrócić formularz?

I chciałby również przechowywać wszelkie wpisy dodane do pola listy w czasie wykonywania.

Jaki jest najprostszy sposób to zrobić? DfmToString i reverse? Napisz/przeczytaj .INI? Coś innego?

Odpowiedz

22

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.

+0

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

+0

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

+0

Dlaczego 'LoadComponentFromFile()' dodaje 'Komponent' do listy" posiadanych "aplikacji? Wcale nie powinno tak być. –

2

Łatwo jest odczytać/zapisać właściwości komponentu lub obiektu lub umieszczać pozycję w pliku lub rejestrze INI. Wszystko, czego potrzebujesz, istnieje w pomocy. Musisz tylko zdecydować, kiedy chcesz je przeczytać (na temat tworzenia, przed pokazaniem ...) i przechowywać je (przy zamknięciu, ...). To zależy od tego, co zapisujesz/przywracasz. Jeśli zamierzasz używać gotowych komponentów i chcesz zapisać pozycję formularza, sprawdź, jak traktują one wiele monitorów. Jeśli robisz to po swojemu, powinieneś sam zająć się tym. Na przykład możesz mieć laptopa i duży 22-calowy monitor, a pozycja formularza została zapisana podczas używania dużego monitora. Później, jeśli otworzysz ten formularz na laptopie, może on być wyświetlany na ekranie, więc nie możesz zobaczyć formularz, jeśli ten przypadek nie jest obsługiwany prawidłowo

+0

+1 to low-runner, ale na pewno się nim zaopiekuję (w najgorszym przypadku użytkownik może edytować lub zmienić nazwę pliku zapisu) – Mawg

Powiązane problemy