ReadComponent na innej formie.

0

Witam, mam komponent DateTimePicker i gdy użytkownik kliknie w przycisk zapisuje go do pliku:

   strumien1 := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'lalala.ini',fmCreate);
  strumien1.WriteComponent(Form2.DateTimePicker1);
  strumien1.Free;

i chcę odczytać go na innej formie:

  strumien1 := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'lalala.ini', fmOpenRead);
  strumien1.ReadComponent(Form3.DateTimePicker1);
 strumien1.Free;

Czy coś takiego jest w ogóle możliwe, jeśli tak, to ci robię źle ? :)

2

Oczywiście, że się da; U mnie taka konstrukcja działa bez zarzutu (sprawdzałem pod Delphi 7); Przykład:

{ Formularz główny }

procedure TForm1.Button1Click(Sender: TObject);
begin
  { Zapis kontrolki do pliku }
  with TFileStream.Create('C:\Picker.dat', fmCreate) do
  begin
    WriteComponent(Form1.DateTimePicker1);
    Free();
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  { Utworzenie i pokazanie drugiego formularza }
  with Unit2.TForm2.Create(Self) do
  begin
    ShowModal();
    Free();
  end;
end;
{ Formularz drugi - modalny }

procedure TForm2.Button1Click(Sender: TObject);
begin
  { Sprawdzenie czy plik istnieje }
  if FileExists('C:\Picker.dat') then
    { Wczytanie kontrolki z pliku }
    with TFileStream.Create('C:\Picker.dat', fmOpenRead) do
    begin
      ReadComponent(DateTimePicker1);
      Free();
    end;
end;

i wszystko działa - nawet położenie kontrolki zostaje zmienione na to z formularza głównego; W załączniku masz program realizujący powyższy kod do skompilowania pod Delphi 7 (bez exe'ka) - sprawdź sobie;


Tak z ciekawości zapytam - nie lepiej jest po prostu przekazać do drugiej formy samą datę i ustawić ją w picker'ze w druiej formie..? Za ustawienie nowej daty w kontrolce odpowiada właściwość TDateTimePicker.DateTime - sprawdź sobie i jeśli nie musisz to nie kombinuj;

0

Tak, z tym, że muszę tą datę zapisać gdzieś do pliku :) bo na danej formie ( na tej gdzie ma się wyświetlić ta data ) pokazuje się kilka różnych zbiorów :)
np. jeśli na form1 wybiore z ComboBox jakąś opcje, to przenosi mnie do Form3 i wyświetla opcje i dane dotyczące tej opcji z Combo.
Próbowałem zapisać datę na kilka sposobów, jako FileDate, Str i zwykłą datę, za każdym razem przy odczytywaniu wywalało błąd, że to nie jest data, wię postanowiłem zapisać to jako komponent :)
dzięki za pomoc, na pewno się przyda

1

Nawet w obsłudze plików INI (unit IniFiles) TIniFile ma metody ReadDateTime i WriteDateTime (jest też ReadDate, ReadTime, WriteDate i WriteTime) i zapewniam ze działają one poprawnie.

0

No nie wiem co ja robie źle :D ale te komponenty mi po prostu znikają :D
może problem jest w tych ścieżkach ?
TFileStream.Create(Form1.Label2.Caption+'\xd.ini', fmOpenRead)
i
TFileStream.Create(Edit2.Text+'\xd.ini', fmCreate) do
z góry dziękuję za pomoc

2
DiKey11 napisał(a)

ale te komponenty mi po prostu znikają

może problem jest w tych ścieżkach ?

Na pewno nie, bo przy próbie otwarcia pliku do odczytu w razie jego nieistnienia dostałbyś wyjątek;
Podejżewam, że to objaw poprawnego działania kodu - zauważ, że w podanym przeze mnie wcześniej przykładowym programie po załadowaniu kontrolki z pliku zostaje ona przesunięta; Wszystko dlatego, że dane o jej położeniu także są zapisywane w pliku, więc jeśli na formie głównej kontrolka jest na pozycji [300, 300], to po wczytaniu jej z pliku do drugiej formy także zostanie ona przesunięta na pozycje [300, 300];

Jeśli chcesz ominąć zabawę to przekaż tą datę w ludzki sposób, np. przez normalny zapis daty do pliku INI czy jakiegokolwiek innego; Albo przekaż tą datę bezpośrednio do formularza (chyba, że koniecznie musi ona znaleźć się w pliku, to patrz wyżej);

Poza tym nie korzystaj z plików INI jeśli zapisujesz cały komponent - fakt, to tylko rozszerzenie, jednak generowany plik nie zawiera zawartości typowo tekstowej, stąd lepszym rozwiązaniem byłby plik o rozszerzeniu chociażby *.dat;

DiKey11 napisał(a)

Próbowałem zapisać datę na kilka sposobów, jako FileDate, Str i zwykłą datę, za każdym razem przy odczytywaniu wywalało błąd, że to nie jest data,

Możliwe, że data została błędnie zapisana bądź zastosowałeś (lub nie) błędną konwersję ze String do TDateTime - bez kodu nic więcej nie mogę napisać.

0

dzięki, mój głupi błąd
szukałem tego komponentu w danym wymiarze ale na formie głównej, a zapomniałem, że te komponenty są GroupBox :D
sory za zawracanie głowy banałami i wielkie dzięki za pomoc :)

w sumie po wczytaniu komponentu z pliku mogę spróbować zmieniać jego położenie :)

0
DiKey11 napisał(a)

w sumie po wczytaniu komponentu z pliku mogę spróbować zmieniać jego położenie

Możesz, ale zastanów się czy w ogóle warto stosować takie obejścia; Gdybyś podał więcej informacji to można by podsunąć lepsze rozwiązanie, ale skoro wszystko działa i jesteś z tego rozwiązania zadowolony to po problemie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1