img.SaveToStream(str); nie działa

0

Witam,

Od dłuższego już czasu usiłuję zrobić programi ładujący zdjęcia jpg do bazy danych (MySQL). O ile do tej pory zawsze jakoś radziłem sobie bez tego tak teraz po prostu muszę to mieć. Znalazłem taką wskazówkę, że coś takiego należy zrobić strumieniowo. Napisałem więc coś takiego:

procedure TForm1.Button1Click(Sender: TObject);
Var

  str : TStream;
  img : Tjpegimage;
begin

  Str := TBlobStream.Create(TBlobField(Query1.FieldByName('zdjecie')),bmWrite);
  img:=tjpegimage.create;
  img.loadfromfile('c:\laki.jpg');
  img.SaveToFile('c:\laki1.jpg');
  image1.picture.assign(img);
  image1.Stretch:=True;

  img.SaveToStream(str);


  img.free;
  Str.Free;
end;

Ale to nie zapisuje mi zdjęcia do bazy :-/ Tak jakby nie działało img.SaveToStream(str); bo kiedy próbuję zrobić potem np. img.LoadFromStream(str) i wyświetlić obrazek w picture to wywala błąd.
Jak zrobić żeby to w końcu mi zadziałało?? Wielkie dzięki za pomoc.

Pozdrawiam

0

a moze zamiast TStream uzyc TBlobStream? Sam TStream moze nie miec zaimplementowanych funkcji do zapisu do bazy.

0

Zamiast Query możesz użyć Table + mała modyfikacja kodu i już powinno działać:

procedure TForm1.Button1Click(Sender: TObject);
var
  str : TStream;
  img : Tjpegimage;
begin
  Table1.Edit;
  Str := TBlobStream.Create(TBlobField(Table1.FieldByName('zdjecie')),bmReadWrite);
  img:=tjpegimage.create;
  img.loadfromfile('c:\laki.jpg');
  img.SaveToStream(str);
  img.Free;
  str.Free;
  Table1.Post;
end;
0

Dzięki MnSK. To działa. Ale pojawiają się dla mnie pewne komplikacje, ponieważ do tej pory nigdy nie używałem TTable. Zawsze używałem TQuery i dlatego nie bardzo wiem jak swobodnie posługiwać się tym komponentem.
Na przykład w podanym przez Ciebie kodzie zdjęcie zawsze wrzucane jest do do pierwszego rekordu i jeśli wcisnę spróbuję raz jeszcze wrzucić zdjęcie to wyrzuca błąd, że nie może wykonać edycji bo inny użytkownik zmienił ten rekord.
Stąd moje pytanie: jak za pomocę Table edytować(usuwać, zmieniać) już wprowadzone pozycje i wybierać sobie rekord np o danym id.

Raz jeszcze dzięki za pomoc.
Pozdrawiam

0

Podany wcześniej kod modyfikuje zawartość aktualnie wybranego wiersza w tabeli (niekoniecznie pierwszego).

Poruszanie sie po rekordach wykorzystując TTable to 5 metod (chyba, że o jakiejś zapomniałem): First, Last, Next, Prior, MoveBy(...) - klasa TDataSet.

To, że nie mogłeś drugi raz zmodyfikować rekordu, to najparwdopodobniej zależne od bazy danych (u mnie na Paradoxie wszystko działa OK, a nie mam pod ręka MySQL'a, żeby to sprawdzić)

MnSk.

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