zapisywanie danych tekstowych i obrazu

0

Mam taki problem
Pisze program w którym tworzy sie rysunek (układy elektroenergetyczne) i to tego powstaje tablica z parametrami (zapisywanymi w StringGrid). Chciałabym aby można było zapisac ten rysunek i dane z parametrami do jednego pliku. Czyli jak zapisać to do formatu (projektu), który byłby obsługiwany tylko przez ten program
Dziękuje z góry za wszystkie podpowiedzi

0

Opracuj własny format pliku.
Przemyśl najpierw dokładnie jakie elementy chcesz zapisać w takim pliku, ile ich i w jakiej kolejności - do tego wystarczy kartka i ołówek. Potem zapisuj do pliku amorficznego (najlepiej chyba użyć TFileStream). Typowy szablon takiego pliku to mniej więcej:

[Nagłówek]
//Tutaj informacje o tym, co to za plik, co w nim jest zapisane, ogólne informacje, ilości elementów itp. Zwykle używa się tej sekcji do sprawdzenia pliku (zgodności formatu) przed wczytaniem reszty danych, żeby nie ładować bezmyślnie jakichś śmieci.
[Dane]
// tutaj jest coś w stylu: rozmiar_elementu|element|rozmiar_elementu|element|rozmiar_elementu|element| ...
czyli np. rozmiar_bitmapy|bitmapa|rozmiar_tablicy|tablica_integerów|itd

..i tak do końca pliku. Dane ładujesz porcjami. Najpierw wczytujesz rozmiar elementu (z reguły jakiś Integer, czyli zawsze 4 bajty), a potem element o poprzednio wczytanym rozmiarze. Strumienie mają metodę read(Buffer, Size), gdzie Buffer to dowolna zmienna (do której wczytujesz), a Size to wielkość wczytywanej zmiennej).
Zapis wygląda analogicznie (metoda write).

0

Dzieki będę szukać czegoś na ten temat. Jezeli ktoś dysponuje jakimś przykładm bardzo prosze o namiary.
Jezli chodzi o to co mam byc zapisane to wiem dokładnie obraz BMP oraz tablica stringów 24 kolumny na x wierszy.

0

jeszcze jedno: jeśli zdecydujesz się używac do zapisu przez strumienie (TFileStream), proponowałbym 2 metody do zapisu stringów:
-krótkie stringi (np. ShortString, albo zdefiniować osobny typ String[X]; X-długość), wtedy zapis wygląda tak samo, jak dla każdej innej zmiennej (zapisujesz de facto statyczną tablicę znaków),;
-długie stringi (AnsiString) - ponieważ są to wskaźniki musisz zapisać je w ten sposób:

S: String;
MyFile: TFileStream;
(...)
MyFile.Write(PChar(S)^, Length(S));

0
procedure Zapisz;
var
  i, j, Len: Integer;
begin
  Stream := TFileStream.Create('nazwa pliku', fmCreate);
  try
    Image.Picture.Bitmap.SaveToStream(Stream);
    Stream.Write(StringGrid.RowCount, SizeOf(StringGrid.RowCount));
    Stream.Write(StringGrid.ColCount, SizeOf(StringGrid.ColCount));
    for i := 0 to StringGrid.RowCount - 1 do
      for j := 0 to StringGrid.ColCount - 1 do
      begin
        Len := Length(StringGrid.Cells[j, i]);
        Stream.Write(Len, SizeOf(Len));
        Stream.Write(PChar(StringGrid.Cells[j, i])^, Len);
      end;
  finally
    FreeAndNil(Stream);
  end;
end;
procedure Wczytaj;
var
  i, j, Len: Integer;
  ARow, ACol: Integer;
  tekst: string;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead	);
  try
    Image.Picture.Bitmap.LoadFromStream(Stream);
    Stream.Read(ARow, SizeOf(StringGrid.RowCount));
    StringGrid.RowCount := ARow;
    Stream.Read(ACol, SizeOf(StringGrid.ColCount));
    StringGrid.ColCount := ACol;
    for i := 0 to StringGrid.RowCount - 1 do
      for j := 0 to StringGrid.ColCount - 1 do
      begin
        Len := Length(StringGrid.Cells[j, i]);
        Stream.Read(Len, SizeOf(Len));
        SetLength(tekst, Len);
        Stream.Read(PChar(tekst)^, Len);
        StringGrid.Cells[j, i] := tekst;
      end;
  finally
    FreeAndNil(Stream);
  end;
end;

i na tej zasadzie możesz tam dokleić co chcesz. Ważne, żeby dla danych o zmiennej długości (np. stringi) najpierw zapisać ich długość

0

Bardzo dziekuje szczególnie za przykład, wszytsko działa i dokładnie o to chodziło.

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