Plik rekordowy z obrazkami.

Odpowiedz Nowy wątek
2006-09-24 14:29
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.


Nie trąb proszę. Ty też się kiedyś uczyłeś.

Pozostało 580 znaków

2006-09-24 17:51
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

Pozostało 580 znaków

2006-09-24 18:49
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

Nie trąb proszę. Ty też się kiedyś uczyłeś.

Pozostało 580 znaków

2006-09-24 20:29
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.

Pozostało 580 znaków

2006-09-24 21:47
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.


Nie trąb proszę. Ty też się kiedyś uczyłeś.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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