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
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).
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.
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));
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ść
Bardzo dziekuje szczególnie za przykład, wszytsko działa i dokładnie o to chodziło.