Mam interfejsik w Delphi. Ładuję do componentu DBimage obrazek z pliku i chciałbym móc zapisać go w rekordzie bazy danych.
Stuktura tabeli :
KOD : autoincrement
Obrazek : blob
Thank's za pomysły ;-(
Mam interfejsik w Delphi. Ładuję do componentu DBimage obrazek z pliku i chciałbym móc zapisać go w rekordzie bazy danych.
Stuktura tabeli :
KOD : autoincrement
Obrazek : blob
Thank's za pomysły ;-(
Obrazek najlepiej zrób typu TGraphicField. (Gdy tworzysz bazę w Database Desktop, jako typ pola Obrazek musisz podać Graphic (dotyczy baz Paradox)). Połącz DBImage-a z tym polem (DBImage1.DataField := Obrazek) i wszystkie zmiany będą zapisywane automatycznie. Jeśli nie, użyj Post.
;-( Faktycznie może mój błąd. Pracuję w Delphi 5. Po zrobieniu tabeli w database desktop. Baza nie widzi pola Graphics. (sterwonik paradox 5.0 for windows). Wcześniej jak był to obiekt ole to był dobrze widoczny i nawet były dodawane rekordy z lekkim pominięciem dbimage. Przy paradoxie dodatkowo wyskakuje błąd "Operation must be performed on the current sesion". Są jakieś inne możliwości poradzenia sobie z problemem
Ja też mam Delphi 5.
Sprawdziłem, stosując Paradox 5 + pole Graphic i wszystko u mnie działa OK. A czy prawidłowo połączyłeś DBImage-a ze źródłem danych (TDataSource) ?
kurcze gdzie jest myk. Tworzę tabelkę paradox 5.0 for windows. dwa pola :
Kod = autoincrement
obrazek = graphics
podłączam do delphi . oczywiście wyskakuje wcześniejszy błąd z którym sobie nie radzę :). W innych bazach nie wyskakuje. Mam obiekt Tsesion, Tdatasource, Ttable. Dodaje wszystkie pola i wyswietla mi tylko pole kod. Pola obrazek nie widzi wcale. Myślę, że jest to tajemnica całego nie działania. Czy ktoś może pomóc ??
Dodałem TSession, powiązałem TSession z TTable i dalej wszystko jest OK.
Spróbuj tak:
Ustaw właściwości Active i AutoSessionName komponentu TSession na False.
Właśc. Active komponentu TTable na False.
Właśc. SessionName komp. TSession np. na MySession.
Właśc. SessionName komp. TTable na MySession.
Uaktywnij TTable i TSession.
U mnie działa (Win200 + Delphi 5 Ent. + Paradox 5 + pole typu Graphic).
Jeśli dalej byłyby problemy, to najlepiej jakbyś udostępnił fragment kodu + DFM-a, wówczas może jakoś mógłbym pomóc.
Ok problem z brakującym polem rozwiązałem stosując bazę na sterowniku Paradox 4 i podłączając ją przez BDE. Nie mniej jednak problem jest taki, że obrazki nie są fizycznie dodawane do bazy. Plik bazy o rozszerzeniu *.mb nie powiększa swojego rozmiaru. Pisałeś coś o metodzie post. Robię post na pole kod, które uczyniłem numerem. Mam pytanie jak wczytać obraz na "jana" do pola obrazek. Dodawanie rekordu wygląda tak :
with table1 do begin
insert
fields[1].value:=edit1.text
post
end;
chciałbym żeby wyglądało tak, bo pewnie tak bedzie działało :
with table1 do begin
insert
fields[1].value:=edit1.text
fields[2].value:= ??? <-- tutaj nie wiem co
post
end;
w miejscu gdzie nie wiem co wpisać chodzi o to że nie wiem jak pokazać że chodzi mi o obraz aktualnie wyświetlany przez dbimage. Dodam że cacheupdates jest na false
Można to zrobić tak:
procedure TFormMain.Button1Click(Sender: TObject);
var
ms: TMemoryStream;
begin
Table1.Append;
Table1.Edit;
ms := TMemoryStream.Create;
try
//tutaj zakładam, że obrazkiem jest bitmapa
DBImage1.Picture.Bitmap.SaveToStream(ms);
with Table1 do
begin
Fields[0].AsString := Edit1.Text; //zamiast AsString można Value
(Fields[1] as TGraphicField).LoadFromStream(ms);
end;
Table1.Post;
finally
ms.Free;
end;
end;
(u mnie działa, testowałem)
Tylko, że takie rozwiązanie jest co najmniej dziwne.
A to dlatego, że przy prawidłowym połączeniu DBImage-a z odpowiednim polem podobna operacja jest wykonywana automatycznie przez Delphi po wczytaniu bitmapy do DBImage-a. Tylko nie wiem, czy Delphi automatycnie zapisuje zmiany w bazie. Jeśli nie, wystarczy tylko po załadowaniu pliku (czy strumienia) do DBImage-a wywołać procedurę Post, która zapisuje wszystkie zmiany do bazy.
//dopisek
Aha !
I nie sugeruj się za bardzo rozmiarem pliku MB.
U mnie to wygląda następująco.
Po kliknięciu przycisku dodaję do bazy obrazek BMP o rozmiarze ok. 1 KB.
Plik MB ma rozmiar 12 KB.
Po kilkukrotnym kliknięciu przycisku rozmiar pliku MB się nie zmienia (ale dane są do niego zapisywane). Po którymś z kolei kliknięciu rozmiar pliku MB nagle zmienia się do 16 KB. A teoretycznie po każdym kliknięciu rozmiar MB powinien się zwiększyć o ok. 1 KB !
Jak zrobisz zrzut 16-stkowy pliku MB, to zobaczysz, że spora jego część to same 0 (zera).
Powiedzmy, że jest to obszar zarezerwowany (na ewentualne późniejsze dane).
I (chyba) w trakcie zapisywania, jeśli BDE uzna, że w zarezerwowanym wcześniej obszarze zmieści się obrazek, to nie jest on dodawany np. na koniec pliku MB, tylko wstawiany jest on w miejsce zer.
Twoja koncepcja zadziałała w 100%. Z tym, że co do rozważań do dziwności koncepcji stwierdzam, iż jest ona jak najbardziej słuszna z mojego punktu widzenia, gdyż w momecie załadowania obrazka i pokazania go userowi rekord właściwy jeszcze nie istnieje tworzę go innym buttonem. Nie mniej jedna Borland czegoś tutaj niedopatrzył. Bo albo obrazek po załadowaniu już trafia do rekordu albo mogli napisać, że trzeba jeszcze gimnastyki co do wprowadzenia obrazka do bazy.
Jeszcze mały szczegół ciekawostka załadowany poprawnie do bazy obrazek w dbgrdizie ma opis : [BLOB] a nie załadowany [Blob] . hi hi :)
Dzięki za pomoc.
A propos ciekawostki:
U mnie jest to odpowiednio: [GRAPHIC] i [Graphic].
(pole typu Graphic + Paradox 5)
A co do koncepcji:
Cóż... każdy ma prawo do własnego zdania.
Cieszę się, że pomogłem.
Pozdrawiam!
Sorry ale wyszło mi z tego cąłego teamtu jeszcze jedno pytanko. Bitmapy chodzą bardzo fajnie, ale co w przypadku gdy chcemy aby to był np. jpg albo gif ??
Też o tym myślałem !
Można by np. przy zapisie do bazy konwertować JPG->BMP, czy GIF->BMP, a przy odczycie, jeśli zaistniałaby taka potrzeba, wykonać konwersję odwrotną. Tylko, że to mogłoby się wiązać z utratą danych w plikach graficznych.
Lepszym rozwiązaniem byłoby chyba użycie pola BLOB oraz zapisywanie i odczyt strumieni z/do tego pola.
Ale dzisiaj muszę już kończyć.
Rano idę do lekarza i muszę wcześniej wstać.
He he fajnie. Od razu jak miałem ten problem to wpadłem na to żeby przekonwertować, ale nie znalazłem nigdzie info z tym jak to zrobić. Wszędzie przepisują tylko konwersję BMP --> JPG. A z próbami odwrotnie nie wychodzi. Ciekawa koncepcjaz tymi strumieniami pytanie brzmi how ?? Alei tak uwzględniając straty konwersji myślę że to najklarowniejszy a zarazem jeden z prostszych sposobów.
Pozdrawiam