Ik kan me aardig redden in Delphi (niet aan m'n baas vertellen als je 't er niet mee eens bent
), maar ik struikel nu over een probleempje waar ik niet zo 1-2-3 uitkom:
Ik heb een component dat allerlei data uit een database kan plukken en daar dan een browse- en editform van kan genereren, en die wil ik nu uitbreiden zodat 'ie ook met JPEG plaatjes overweg kan. En daar begint mijn probleem...
Plaatjes vanuit het editform laden gaat prima (m.b.v. een TOpenPictureDialog), en hij slaat 'm ook netjes op in de database (MSSQL, veldtype is 'image') met de volgende code:
CurrentImage is een TImage, en CurrentField een TField, en de data wordt daarna natuurlijk nog opgeslagen. Lijkt allemaal goed te gaan, en ook het teruglezen levert zo te zien geen problemen op:
Hij leest netjes 175666 bytes uit de database, en jpg.Width en jpg.Height zijn daarna ook 768 * 1024 (de grootte van 't plaatje), maar als ik 'm daarna wil tonen, krijg ik een 'JPEG error #41'.
Als ik op die foutmelding ga googlen, krijg ik dingen als: bestand bestaat niet of heeft een lengte van 0 bytes. Er bestaat inderdaad geen bestand, want de data wordt rechtstreeks gestreamed vanuit de database...
Iemand een idee wat ik hier fout doe?
O ja, alle controls en datasets worden dynamisch gecreeerd, en die TImage staat op een custom control (een TPanel) om het resizen gemakkelijker te maken en om het popup menu (load/save/clear picture) wat toegankelijker te maken.
Ik heb een component dat allerlei data uit een database kan plukken en daar dan een browse- en editform van kan genereren, en die wil ik nu uitbreiden zodat 'ie ook met JPEG plaatjes overweg kan. En daar begint mijn probleem...
Plaatjes vanuit het editform laden gaat prima (m.b.v. een TOpenPictureDialog), en hij slaat 'm ook netjes op in de database (MSSQL, veldtype is 'image') met de volgende code:
Delphi:
1
2
3
4
5
6
7
8
| // save image tmpStream := TMemoryStream.Create; try TJPEGImage(CurrentImage.Picture.Graphic).SaveToStream(tmpStream); TBlobField(CurrentField).LoadFromStream(tmpStream); finally tmpStream.Free; end; |
CurrentImage is een TImage, en CurrentField een TField, en de data wordt daarna natuurlijk nog opgeslagen. Lijkt allemaal goed te gaan, en ook het teruglezen levert zo te zien geen problemen op:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
| // load image tmpStream := TMemoryStream.Create; try TBlobField(CurrentField).SaveToStream(tmpStream); tmpStream.Position := 0; jpg := TJPEGImage.Create; jpg.LoadFromStream(tmpStream); CurrentImage.Picture.Graphic := jpg; finally tmpStream.Free; end; |
Hij leest netjes 175666 bytes uit de database, en jpg.Width en jpg.Height zijn daarna ook 768 * 1024 (de grootte van 't plaatje), maar als ik 'm daarna wil tonen, krijg ik een 'JPEG error #41'.
Als ik op die foutmelding ga googlen, krijg ik dingen als: bestand bestaat niet of heeft een lengte van 0 bytes. Er bestaat inderdaad geen bestand, want de data wordt rechtstreeks gestreamed vanuit de database...
Iemand een idee wat ik hier fout doe?
O ja, alle controls en datasets worden dynamisch gecreeerd, en die TImage staat op een custom control (een TPanel) om het resizen gemakkelijker te maken en om het popup menu (load/save/clear picture) wat toegankelijker te maken.
offtopic:
Spijtig dat Borland de source van de jpeg unit niet vrij kan / mag geven...
Spijtig dat Borland de source van de jpeg unit niet vrij kan / mag geven...