Plik rekordowy z obrazkami.

0

Cześć.
Mam pytanie, jak w pliku rekordowym zapisać takie rekordy:

TRecord = packed record
     rysunek : TPngObject;
     //rysunek : TBitmap;
     data : TDateTime;
     opis : string[20];
     end;

Opierając się na Kompendium próbowałem tak:

var
    png : TPngObject;
    F : File of TRecord;
    rec : TRecord;
begin
png:=TPngObject.Create;
png.Assign(image1.Picture.Bitmap);
AssignFile(F, 'file.dat');
 try
  if FileExists('file.dat') then
   Reset(F)
  else
   Rewrite(F);
  Seek(F, FileSize(F)); // przesuń na koniec pliku
  Rec.rysunek := png;
  //Rec.rysunek := image1.Picture.Bitmap;
  Rec.data := now;
  Rec.opis := Edit1.Text;
  Write(F, Rec); // dodaj zawartość
 finally
  CloseFile(F);
 end;
png.Free;
end;

Czas i tekst zapisują się, ale obrazek nie chce (ani jako bitmapa, ani jako png). Co zrobić żeby zapisać png, czas i tekst do jednego pliku? Z góry dzięki za pomoc.

0

nie można zapisywać rekordu który nie ma ustalonej wielkości danych (niewiadomą jest tutaj rozmiar obrazka png )w tym przypadku obrazka a ja głupi sie zastanawiałem musisz to inaczej zapisywać

napisze to ale to nie będzie na pewno w formie takiej jaka jest tutaj .. ale zejdze chwilke

0

Dzięki za odpowiedź, ale:
po pierwsze - zamiast

Rec.assign(image1.Picture.Bitmap);

powinno być Rec.rysunek.assign(image1.Picture.Bitmap);

po drugie - nawet po zmienie nie działa, obrazek do pliku się nie zapisuje. Próbowalem też po stworzeniu 
```delphi
Rec.rys := TPngObject.Create;

przypisać obrazek Rec.rys := png;

 ale też nie trybi. Co robię nie tak?
dopisane: powyższy tekst pisałem przez godzine (z przerwami) bo miał być wcześnej
0

Twoje pole rysunek w recordzie to 4 bajty adresu i to sie zapisuje do pliku razem z rekordem a nie obrazek.
Są dwie możliwości:

  1. okreslisz maxymalną wielkosc obrazka png (jeśli da się to zrobić) i wtedy dasz pole rysunek jako jakas tablica statyczna, do której będziesz zapisywał tpng i będzie dzialac. Ale to jest metoda troche poartyzancka, w której wymusza sie to by to był plik recordów (file of Trecord).
  2. Uzyjesz strumienia plikowego zapisujac najpierw wielkosc jednego wpisu: 20(string[20])+8(Tdatetime)+ wielkosc png w strumieniu, a potem te 3 rzeczy po kolei.
0
Marmar napisał(a)
  1. okreslisz maxymalną wielkosc obrazka png (jeśli da się to zrobić) i wtedy dasz pole rysunek jako jakas tablica statyczna, do której będziesz zapisywał tpng i będzie dzialac.

A można wiedzieć jak mam to określić? Stringa owszem mogę zadeklarować jako string[20] i wtedy wiem że ma 20 bajtów, a TPngObject? TPngObject[40000] raczej nie ;-)

Marmar napisał(a)
  1. Uzyjesz strumienia plikowego zapisujac najpierw wielkosc jednego wpisu: 20(string[20])+8(Tdatetime)+ wielkosc png w strumieniu, a potem te 3 rzeczy po kolei.

Yyy... Że jak??? Nie kumam. Będę bardzo wdzięczny za więcej szczegółów. Thx.

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