DBImage: how to use? lazarus / 16-Databases ---------------------------------------------------------------------- BigChimp · 2014-01-10 11:59 Going by the Delphi and Lazarus edit: help, dbimage should be really easy to use: set datasource, set the field name to the field containing your image blob and it should display images stored there (and at least in Delphi, allow you to copy/paste image data). I've modified a tutorial db (which had a dbgrid, navigator control etc): added dbimage control, did the above. Had to modify Firebird employee.fdb sample db to add a PHOTO field (blob) = please find it included in the zip. However, I don't see any indication of an image (my db has mostly empty data). What am I doing wrong? Zip with source and database: Edit: updated, see below. Thanks. ---------------------------------------------------------------------- wp · 2014-01-10 13:07 Never tried it with Lazarus, but Delphi suffered from the fact that DBImage could only handle bmp files. ---------------------------------------------------------------------- taazz · 2014-01-10 13:15 It should work, teh code is there and is called when the current record is changed the only thing I see is that the stream lacks the image description so the LoadPicture method does not know how to handle the blob and it simple ignores it. I remember a debate earlier this year of why the current implementation was incompatibilite with the rest of the world and a bug report with a patch was introduced to remove the extra bytes at the start. I guess this is the after effect. I still am against removing them. ---------------------------------------------------------------------- BigChimp · 2014-01-10 13:33 Thanks for the response, taazz! That patch *added* support for Delphi style/custom image handling (see OnDBImageWrite, IIRC). It didn't change default behaviour. By default, IIUC, dbimage should still write the file extension etc. see http://wiki.lazarus.freepascal.org/Lazarus_1.2.0_release_notes#TDBImag e What should happen though with NULL values for the PHOTO field (i.e. empty blobs) Shouldn't I see some square/image placeholder where I can paste my picture? Also, I don't really understand this part: Quote from: taazz the only thing I see is that the stream lacks the image description so the LoadPicture method does not know how to handle the blob and it simple ignores it. ... should I add some code somewhere? Isn't dbimage supposed to do this for me (copy out file extension to the blob followed by the binary image)? ---------------------------------------------------------------------- taazz · 2014-01-10 14:12 DBImage should save the blob as 4 bytes extension length (usualy 3 or 4) |extension (eg bmp or jpg)| the image unaltered. Your blob stream has no bmp in front as it should or I couldn't see it from IBExpert light. DBImage has no mouse capabilities you need to add code to do so your self and no it never shown a rectangle which you could click to load data from disk. ---------------------------------------------------------------------- BigChimp · 2014-01-10 14:14 Edit: posted before reading previous message... Decided I was probably too optimistic about the copy/paste thing being possible, so added a button that puts a file into the dbimage picture and tries to save the result. Get error message An error occurred while applying the updates in a record DBConnection : PrepareStatement attempted update of read-only column and indeed the image is not saved. Don't tell me I have to manually deal with CreateBlobStream etc (Argh, I hate GUI controls... but you can't live without them ) New zip: http://ubuntuone.com/0KmpZX0xFF436381Ymib9w Up to date source code repo without .fdb though: https://bitbucket.org/reiniero/fpc_laz_patch_playground/src sqldbtutorialimage ---------------------------------------------------------------------- BigChimp · 2014-01-10 14:16 (Posted previous post before reading this one) Quote from: taazz on January 10, 2014, 03:12:32 pmYour blob stream has no bmp in front as it should or I couldn't see it from IBExpert light. Ah, now I know what you mean: you're talking about the existing blobs/images in my initial upload. Yes, those are regular jpg files, and it's no problem that they don't display etc. I was testing with the records at the end where the blobs are empty/null. Sorry about that. ---------------------------------------------------------------------- taazz · 2014-01-10 14:57 do the following 1) drop a TOpenPictureDialog on your form. 2) doubleclick on the onclick of the DBImage1 and paste this code. Code: [Select]  if OpenPictureDialog1.Execute then begin     DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);   end; 3)run your application 4) select any record you like and press the edit button on the dbnavigator. 5) click on your image and select any image you like. 6) press the post button on the dbnavigator. change records in the grid and see if re visiting the specific record it shows the new image. There is a small chance that you must use persistent fields namely after you create the fields in the designer select the photo field and change the blobtype to ftgraphic and try again. Are you sure that the subtype 0 on the firebird blob is for binary data and not for text? I ask because the default setting comes back as ftwidestring instead of ftgraphic and makes to want to check the subtype meaning again. ---------------------------------------------------------------------- BigChimp · 2014-01-10 15:06 Thanks. Blob subtype 0 is binary data http://www.firebirdfaq.org/faq165/ Tried your suggestion. Edit/post works, scrolling back & forth too (including showing the image), but when calling applyupdates I still get the update readonly field problem. Updated repository with new code. ---------------------------------------------------------------------- taazz · 2014-01-10 15:56 I guess the problem you have is that the applyupdate tries to update the blob qith an update sql command instead of using the blobostreams to post the data and that seems is not supported from firebird. Please keep in mind that this is speculation at this point and I haven't checked anything. Late me say at this point that I hate the buffered editing implementation of sqlDB and it is the main reason that I am looking at ZEOS as an alternative. ---------------------------------------------------------------------- BigChimp · 2014-01-10 15:59 Well yes, that would be my guess as well. Very strange - one would expect GUI components to just work together. I suppose I can - run applyupdates for everything except dbimage stuff - manually commit dbimage stuff if it comes up but then I'll be commiting 2 transactions instead of perhaps 1 which the user wants. ---------------------------------------------------------------------- taazz · 2014-01-10 16:05 DBImage does not know or care about the underline dataset it uses the Tblobstream to read and write data and that's all it should know. if the dataset is buffered and keeps the data in the client side or it is directly connected to the database and send the data across the galaxy in to a small planet in an other solar system it is not its business to know. If the blob stream says "everything is fine" then it is fine as far as thedbimage is concerned and rightly so, do you imagine what it would happen if dbimage required to take in to account the underline database as well before committing anything? ---------------------------------------------------------------------- BigChimp · 2014-01-10 16:08 Well yes of course, but the datasource & tsqlquery should be handling the blobstream for me. And they don't (appear to be). Edit: and yes, tsqlquery has weird issues with blobs - but the GUI controls/Lazarus part should abstract that away IMO. You should just be able to slap together some controls and have a working solution... sort of the idea of RAD IMO. ---------------------------------------------------------------------- BigChimp · 2014-01-10 16:22 I suppose I won't escape diving into the source code sooner or later as I suspect more people must have wanted similar things as I. Done for today though ---------------------------------------------------------------------- taazz · 2014-01-10 17:15 Well before runding I should make it a habit to check my facts first so should you. After a couple of minutes of debuging and playing around with persistent fields I can say that the blob update is not cause of your problems. The Full_Name field is since it is a computed field and not a physical one you must remove it from the update query. Do something along the lines of Code: [Select]procedure TForm1.SQLQuery1AfterOpen(DataSet : TDataSet); begin   dataset.FieldByName('FULL_NAME').ProviderFlags := []; end; and see how far that will get you. ---------------------------------------------------------------------- BigChimp · 2014-01-10 17:23 Well, I did say I'd look into the code to see what's causing the problems & I never said the problem couldn't be at my end.... though yes, I was quite frustrated at this... Thanks a lot though for looking into it & finding the problem, that is very satisfying! ---------------------------------------------------------------------- taazz · 2014-01-10 17:27 This is my new years resolute, Try to help everyone that attaches a working example project in Lazarus forums. Kidding aside it is one of my goals for this year. ---------------------------------------------------------------------- BigChimp · 2014-01-10 17:31 Well, thanks a lot for that - you helped me out a lot! ---------------------------------------------------------------------- BigChimp · 2014-01-10 17:43 FYI, could now test http://bugs.freepascal.org/view.php?id=25453    0025453: [Patch] Support images using DBImage OnDBImageRead event both with regular Lazarus DBImage (file extension+BLOB) as well as Delphi style (just the BLOB, fixed file format, in my case jpg). for LazReport. Works beautifully. ---------------------------------------------------------------------- taazz · 2014-01-10 17:55 actually the delphi style is the same as lazarus style the dbimage adds a couple of bytes in front that describe the image that follows but i think its a not string based. Well it has been more than 10 years the last time I looked at that code so things might have change in the mean time. ---------------------------------------------------------------------- BigChimp · 2014-01-16 11:26 Quote from: taazz on January 10, 2014, 06:15:31 pmThe Full_Name field is since it is a computed field and not a physical one you must remove it from the update query. This wasn't documented (the fact that sqldb can't correctly deal with computed by fields, that is) Added docs http://wiki.lazarus.freepascal.org/Firebird_in_action#Attempted_update _of_read-only_column_.2F_COMPUTED_BY_fields official docs request http://bugs.freepascal.org/view.php?id=25545 Had a look at modifying sqldb's ibconnection but the performance impact would probably be too big... Thanks ---------------------------------------------------------------------- taazz · 2014-01-16 13:11 In some cases it might be updatable eg have trigger that parses the full_name to first,midle and last names and update them instead. It has been seen in the wild for phone numbers though not names. The safest bet would be to do nothing and let the end user handle it. ---------------------------------------------------------------------- BigChimp · 2014-01-16 13:19 taazz, no a computed field as the term is specified by Interbase/Firebird is statically defined in Firebird DDL and not calculated by triggers (well perhaps internally, but that's Firebird's problem, not ours ; ); see Interbase 6 Language Reference (SQL reference) page 76: "Computed columns are based on an expression. Column values are computed each time the table is accessed." Yes, you could generate the same effect with a trigger but that would be a regular field filled by a trigger, which is different. ---------------------------------------------------------------------- taazz · 2014-01-16 13:24 the other way around, you use the trigger to break the computed value to their respected fields not combine them in to one. The user types in +01555675987 and this breaks up in the trigger to country code = 001, area code = 555, phone number  = 675987 and the read only field is ignored. Granted this is mostly used with updatable views not tables but you get the point. ---------------------------------------------------------------------- BigChimp · 2014-01-16 14:30 QuoteIn some cases it might be updatable eg have trigger that parses the full_name to first,midle and last names and update them instead. I'm assuming with it you mean "computed by" field, say full_name. Firebird will not accept any updates to full_name at all, unless you resort to updatable views etc, yes. In that case, Firebird will presumably report a NULL rdb$fields.rdb$computed_source (see patch in link below) as that applies to the edit: column in the underlying table, not the one in the view. I don't really see any mechanism except updatable views where this kind of thing could work though... Admittedly I haven't tested this because: 1. As said, performance constraints will likely render my patch useless 2. The patch as is doesn't seem to run. Suggestions for improvements welcome... Probably me again messing with pointers that $(deity) hadn't intended for mere mortals... ehrm the likes of me. See http://bugs.freepascal.org/view.php?id=25513 Thanks. ---------------------------------------------------------------------- taazz · 2014-01-16 15:24 1) the readonly status is present when you first create the fields/fielddefs as well there is no need to run a new query on the server just before you commit just make sure that the fields. Readonly property is set when the fields are created and you are done. 2) A New property is needed to give the user a choice to leave out read only fields from the update-insert etc or not, just in case the underline object is not a table but a view and readonly fields needs to be included so the triggers would work. In any case it is up to the user to select how s/he want the query to behave a blanket type of property, that will enable/disable the inclusion of the readonly fields to the final sql, would be very useful but not required at this point. to put it simple : One must know what one is doing with his/her  fields before one is allowed to insert/update anything to a production database. So the current behavior is in my book desired and if well documented should not be changed. Just my .002 cents. ---------------------------------------------------------------------- BigChimp · 2014-01-16 15:54 Quote from: taazz on January 16, 2014, 04:24:42 pm1) the readonly status is present when you first create the fields/fielddefs as well there is no need to run a new query on the server just before you commit just make sure that the fields. Readonly property is set when the fields are created and you are done. AddFieldDefs is run once for each query preparation - moving it somewhere else may be doable but has to take into account that Firebird is a multi-user db. A table we just used may now have an additional field etc. Not likely, but possible. Quote from: taazz on January 16, 2014, 04:24:42 pm2) A New property is needed to give the user a choice to leave out read only fields from the update-insert etc or not, just in case the underline object is not a table but a view and readonly fields needs to be included so the triggers would work. Assumptions here - unless you checked what updatable views return in the column I mentioned. Quote from: taazz on January 16, 2014, 04:24:42 pmIn any case it is up to the user to select how s/he want the query to behave a blanket type of property, that will enable/disable the inclusion of the readonly fields to the final sql, would be very useful but not required at this point. Well, having the db layer provide sensible defaults is IMO important. If the user knows what he's doing he's free to deviate from those defaults. Cf the way insertsql etc get generated: they are provided for the user but the user can change them. Quote from: taazz on January 16, 2014, 04:24:42 pmto put it simple : One must know what one is doing with his/her  fields before one is allowed to insert/update anything to a production database. So the current behavior is in my book desired and if well documented should not be changed. Agreed. However, you may be coming from an Interbase/Delphi background where it is obvious that these kinds of fields are not set read-only by the db layer. I and others don't - but as you say, if properly documented, it certainly works. Just my 2 cents ---------------------------------------------------------------------- taazz · 2014-01-16 17:37 Quote from: BigChimp on January 16, 2014, 04:54:49 pmQuote from: taazz on January 16, 2014, 04:24:42 pm1) the readonly status is present when you first create the fields/fielddefs as well there is no need to run a new query on the server just before you commit just make sure that the fields. Readonly property is set when the fields are created and you are done. AddFieldDefs is run once for each query preparation - moving it somewhere else may be doable but has to take into account that Firebird is a multi-user db. A table we just used may now have an additional field etc. Not likely, but possible. erm I do get the feeling that I am missing something important or I've lost all eloquence and reson ( not that I had much to begin with). I'm only stating that placing the checks of read only fields in the addfielddefs procedure instead of the updaterecord procedure is the prefered way to handle things. I never said to move the addfieldsdefs from its current position to somewhere else. at least that is what I get from your statement that you understood. Quote from: BigChimp on January 16, 2014, 04:54:49 pmQuote from: taazz on January 16, 2014, 04:24:42 pm2) A New property is needed to give the user a choice to leave out read only fields from the update-insert etc or not, just in case the underline object is not a table but a view and readonly fields needs to be included so the triggers would work. Assumptions here - unless you checked what updatable views return in the column I mentioned. No no assumptions don't look the firebird only case what ever you do on the sqlquery component is global to all databases. Quote from: BigChimp on January 16, 2014, 04:54:49 pm Quote from: taazz on January 16, 2014, 04:24:42 pmIn any case it is up to the user to select how s/he want the query to behave a blanket type of property, that will enable/disable the inclusion of the readonly fields to the final sql, would be very useful but not required at this point. Well, having the db layer provide sensible defaults is IMO important. If the user knows what he's doing he's free to deviate from those defaults. Cf the way insertsql etc get generated: they are provided for the user but the user can change them. Agreed! I'm only saying that it already provides sensible defaults. Quote from: BigChimp on January 16, 2014, 04:54:49 pm Quote from: taazz on January 16, 2014, 04:24:42 pmto put it simple : One must know what one is doing with his/her  fields before one is allowed to insert/update anything to a production database. So the current behavior is in my book desired and if well documented should not be changed. Agreed. However, you may be coming from an Interbase/Delphi background where it is obvious that these kinds of fields are not set read-only by the db layer. I and others don't - but as you say, if properly documented, it certainly works. Just my 2 cents Not really my main line of data server was MSSQL from 6 to 2015 firebird in comparison is on the constipated side of the fence if it did not had the wonderful embedded server as a single dll to share with your application I would have never used it to begin with, not when postgreSQL is a few clicks away and MSSQL express literally covers any none enterprise use I had so far on windows environments with out problems.  PS. Still haven't read the link you provided about calculated fields on firebird, probably will not before Monday either. ---------------------------------------------------------------------- BigChimp · 2014-01-16 18:21 Quote from: taazz on January 16, 2014, 06:37:41 pmerm I do get the feeling that I am missing something important or I've lost all eloquence and reson ( not that I had much to begin with). Me likewise Quote from: taazz on January 16, 2014, 06:37:41 pmI'm only stating that placing the checks of read only fields in the addfielddefs procedure instead of the updaterecord procedure is the prefered way to handle things. I never said to move the addfieldsdefs from its current position to somewhere else. at least that is what I get from your statement that you understood. More or less, yes. Glad that's sorted out. Quote from: taazz on January 16, 2014, 06:37:41 pmNo no assumptions don't look the firebird only case what ever you do on the sqlquery component is global to all databases. The code we're talking about is Firebird only though: it's in ibconnection.pas, not in the sqlquery code. (I'll leave the question about what kind of metadata a updatable view on FB against a computed by field would produce as is, it doesn't really matter anyway...) Quote from: taazz on January 16, 2014, 06:37:41 pmNot really my main line of data server was MSSQL from 6 to 2015 firebird in comparison is on the constipated side of the fence if it did not had the wonderful embedded server as a single dll to share with your application I would have never used it to begin with, not when postgreSQL is a few clicks away and MSSQL express literally covers any none enterprise use I had so far on windows environments with out problems.  PS. Still haven't read the link you provided about calculated fields on firebird, probably will not before Monday either. Ok no problem. It's not as if we're rushing to fix something here anyway - just chatting along Just to (hopefully) clarify or perhaps painfully harp on: I'm talking about a firebird specific field type called a "computed by" field... which probably has equivalent/similar manifestations in other dbs, but I'm *only* talking about the Firebird defintion. Likewise I'm excluding fields for which a user may have select but not insert/update grants etc. ---------------------------------------------------------------------- mariodosreis · 2022-06-21 15:39 The above examples arte ok for displaying a imaage. I do beleave we need something like EDBImage; i use it since Delphi 3... I tried to convert for Lazarus:  TEDBImage and TQREDBImage v1.6 (Enhaced TDBImage and TQRDBImage):   by Sebastián Mayorá - Argentina - DelphiHelper@yahoo.com.ar TQREDBimage was designed for printing image files. It has the same features that TEDBImage has. »EDBImage works like TDBImage except :    - It can manage .ico .bmp .wmf .emf .jpg .jpeg. Without a line of code !!!    - Can copy to clipboard .bmp .wmf .jpg .jpeg       - Event OnLoadCustomImage is fired when the image type is unknown, so you can load "any" type of images (gif, tiff, png,....) **NEW ver 1.5**:    - property ZoomToFit: boolean  : when TRUE and the image size is smaller than component the image is zoomed to component size (keeping aspect ratio).    - property ShrinkToFit: boolean: when TRUE and the image size is bigger than component the image is reduced to component size (keeping aspect ratio)    - If you download (Highly recomended) GraphicEx ((c) Dipl. Ing. Mike Lischke)from www.lischke-online.de  .Tiff, .gif, .tga,        and 25 more formats available (yes, 25 formats).    In order to use .tiff, .gif , etc from GraphicEx ((c) Dipl. Ing. Mike Lischke) YOU MUST AGREE GraphicEx license (read License.txt of GraphicEx).    To provide support for these formats you must change GraphicConfiguration.inc before installing TEDBImage and TQREDBImage   »Changing GraphicConfiguration.inc 1- Read carefully License.txt and GraphicConfiguration.inc. 2- If you do not agree, please don't change anything. 3- To enable a format (eg. Tiff) {$define TIFFGraphic} 4- To Disable a format (eg. Tiff  {.$define TIFFGraphic} or comment line  //{$define TIFFGraphic} 5- Disable as much formats as you can to save memory (exe file grow 550 Kb with all formats) 6- Save all files modified and recompile packages. (Use Build All if available) Note: for TESTING PURPOSES ONLY, I have this configuration {.$define SGIGraphic}             // *.bw, *.rgb, *.rgba, *.sgi images are supported {.$define AutodeskGraphic}        // *.cel, *.pic images {$define TIFFGraphic}            // *.tif, *.tiff images {.$define TargaGraphic}           // *.tga, *.vst, *.icb, *.vda, *.win images {.$define PCXGraphic}             // *.pcx, *.pcc, *.scr images {.$define PCDGraphic}             // *.pcd images {.$define PortableMapGraphic}     // *.ppm, *.pgm, *.pbm images {.$define CUTGraphic}             // *.cut (+ *.pal) images {$define GIFGraphic}             // *.gif images {.$define RLAGraphic}             // *.rla, *.rpf images {.$define PhotoshopGraphic}       // *.psd, *.pdd images {.$define PaintshopProGraphic}    // *.psp images {.$define PortableNetworkGraphic} // *.png images {.$define EPSGraphic}             // *.eps images If you don't want to use GraphicEx comment the line {$DEFINE GraphicEX} in uEDBR.pas and recompile.   »What you can do with EDBImage is:   - Copy, Cut and paste from clipboard. No code needed.   - LoadFromFile and SaveToFile (New in v1.3)   - Load "any" type of TGraphic using OnLoadCustomImage event:    If you need OTHER kind of graphics (such GIF, TIFF, etc)       then you should write something like this in OnLoadCustomImage Event:        procedure TForm1.EDBImage1LoadCustomImage(var B: TGraphic; Stream: TStream);        begin              B := TXXX.Create;      {XXX is your class of Graphic (TGifImage, TTiffImage, etc).}            B.LoadFromStream( Stream );        end;              //That is ALL.!!! - do not call B.Free. »Please mail me for: - Bugs                     - Suggestions                     - say Hello.                     - Comments                     - etc... »New in version. 1.6 - Packages for Delphi 7 (vclSer70.dpk, dclSer70.dpk) - Fixed problem with DBCtrlGrid. - Fixed problem when not using GraphicEx. (Thanks to Roberto Mamoru Matuda) - Listen to Ctrl + Z and Esc keys. - Thanks to Nick Spurrier, Roberto Mamoru Matuda, John Faubion, Pierre du Plessis,    Jaro Griscik, david david, Daniel Cañas, Rolf-Dieter Schenkel, Mauricio Vargas Echeverry,    Thiago de Goz Ferreira, Shraga Milon, Juan Badell for their support, emails and suggestions »New in version. 1.4 - Optimized LoadPicture; - Some bugs fixed - Added LoadFromFile and SavetoFile methods »Known Issues - Current version Tested with D7, D6. Previous version tested with D6, D5 and D4. - OnLoadCustomImage  tested with TGIFImage (from RXLib) - Some random bugs with .gif (using GraphicEx) - QREDBImage: set ZoomToFit and ShrinkToFit always to TRUE to avoid some strange QR behavior. Thanks to:   - Thanks to Nick Spurrier, Roberto Mamoru Matuda, John Faubion, Pierre du Plessis,     Jaro Griscik, david david, Daniel Cañas, Rolf-Dieter Schenkel, Mauricio Vargas Echeverry,     Thiago de Goz Ferreira, Shraga Milon, Juan Badell for their support, emails and suggestions   - Mohsen Rahmani, Mr. Hong, René Simon, Dayne and everyone for their help.   - Dipl. Ing. Mike Lischke for making GraphicEx, it is wonderful.   - Thanks you for try it. THIS IS FREEWARE - USE AT YOUR OWN RISK, ETC, ETC    »Install 0- Before install, remove previous versions of EDBImage (and QREDBImage)    Choose Component | Install Packages..., select EDBimage and hit Remove.    (delete or rename: edbImage.*, qrEDBimage.* ) 1-Open VCLser40.dpk (Dephi4), VCLser50.dpk (Delphi5), VCLser60.dpk (Delphi6) or VCLser70.dpk (Delphi7) Menu Project-Options in Directory/Conditionals tab set OutputDirectory to C:\Windows\System (or your system directory) Compile it. DO NOT install, it is just a runtime package. 2-Open DCLser40.dpk (Dephi4), DCLser50.dpk (Delphi5), DCLser60.dpk (Delphi6) or  DCLser70.dpk (Delphi7) Compile it, then Install It. This is the Designtime package. 3- Enjoy!! 4- Send me an email with your opinion. Thank you! ---------------------------------------------------------------------- wp · 2022-06-21 17:02 I am rather sure that our TDBImage contains much of what you request. Please prepare a sample project demonstrating where DBImage is not sufficient. ---------------------------------------------------------------------- mariodosreis · 2022-06-22 16:22 TDBimage does not work with Zeos  no even with: procedure TForm1.DBImage1DBImageRead(Sender: TObject; S: TStream;   var GraphExt: string); begin    GraphExt := 'jpg'; end; procedure TForm1.DBImage1DBImageWrite(Sender: TObject; S: TStream;   GraphExt: string); begin   if GraphExt <> 'jpg' then     raise Exception.Create('Só há suporte para imagens *.JPEG'); end; However it work's prety good with Firebird3 + IBX from https://www.mwasoftware.co.uk/personal-databases ---------------------------------------------------------------------- wp · 2022-06-22 21:20 I wrote a small demo which collects several image types in an sqlite3 database and displays them in a DBImage. It's working correctly for me. ---------------------------------------------------------------------- rvk · 2022-06-23 06:59 Quote from: mariodosreis on June 22, 2022, 06:22:18 pmTDBimage does not work with Zeos  no even with: However it work's prety good with Firebird3 + IBX from https://www.mwasoftware.co.uk/personal-databases WHAT doesn't work? Do you get errors? If it works with IBX but not with Zeos, the problem could be in the way you use zeos. Like wp suggested, create a small sample project to show the problem.