Page 1 of 2 1 2 LastLast
Results 1 to 15 of 22

Thread: Datasnap tclientdataset server naar android BLOB fields werken niet?

  1. #1

    Datasnap tclientdataset server naar android BLOB fields werken niet?

    Ik heb een Datasnap applicatie van windows server naar een firemonkey app op de android. Ik kan eigenlijk alles netjes opvragen vanuit de Android client. Er staan echter ook bmp plaatjes in de database die ik ook wil displayen in de firemonkey app maar de blobvelden (lijken) geen inhoud te hebben als ze eenmaal in de clientdataset binnen zijn gekomen.
    Ik probeer het plaatje binnen te halen, maar het lukt niet.

    Jpeg := TBitmap.Create;

    JpegStream := TMemoryStream.Create;

    TBlobField(BindSourceDB1.DataSet.FieldByName('VOER TUIGJPG')).SaveToStream(JpegStream) ;

    jpegstream.Position := 0;
    Jpeg.LoadFromStream(JpegStream);



    Image1.Bitmap.Assign(jpeg);

    Wat doe ik fout?

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    9,594
    Je heb nergens een jpg specifieke klasse, en niet eens een extensie waaraan het systeem kan afleiden dat het JPG is. Probeer eens of er ergens een tjpegimage is.

  3. #3
    Quote Originally Posted by marcov View Post
    Je heb nergens een jpg specifieke klasse, en niet eens een extensie waaraan het systeem kan afleiden dat het JPG is. Probeer eens of er ergens een tjpegimage is.
    Probleem is niet de jpg klasse, het gaat om een bmp plaatje. Probleem is echter dat het blob veld volgens mij gewoon leeg is na opvraag in de tclientdataset op een FMX form.

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,120
    Allereerst welkom!

    Door je variabele "Jpeg" te noemen maar je het er ook niet echt duidelijker op.
    Als je niet precies weet wat en of er iets uit je database geplukt wordt, dan moet je
    daar eerst achteraan (ongeacht of de data die uit de database komt wel daadwerkelijk
    van het type is dat je verwacht).

    Wat is bijvoorbeeld de grootte van je memorystream nadat je het veld heb opgehaald?
    Als die groter is dan 0, dan kun je (tijdelijk) het resultaat van je stream wegschrijven
    naar een bestand, die je daarna dan kunt openen met een hex-editor om te zien wat
    er precies aan data in je stream staat.

    Delphi Code:
    1. var
    2.   Stream: TMemoryStream;
    3.   Bitmap: TBitmap;
    4. begin
    5.   Stream := TMemoryStream.Create;
    6.   try
    7.     TBlobField(BindSourceDB1.DataSet.FieldByName('VOERTUIGJPG')).SaveToStream(Stream);
    8.     if (Stream.Size > 0) and
    9.        (Stream.Seek(0, soFromBeginning) = 0) then
    10.     begin
    11.       Stream.SaveToFile('DitIsEenBlobTest.bmp');
    12. //      Bitmap := TBitmap.Create;
    13. //      try
    14. //        Bitmap.LoadFromStream(Stream);
    15. //        Image1.Bitmap.Assign(Bitmap);
    16. //      finally
    17. //        Bitmap.Free;
    18. //      end;
    19.     end
    20.     else
    21.       ShowMessage('Stream is leeg');
    22.   finally
    23.     Stream.Free;
    24.   end;
    25. end;
    TMemoryLeak.Create(Nil);

  5. #5

    Unhappy

    Quote Originally Posted by VideoRipper View Post
    Allereerst welkom!

    Door je variabele "Jpeg" te noemen maar je het er ook niet echt duidelijker op.
    Als je niet precies weet wat en of er iets uit je database geplukt wordt, dan moet je
    daar eerst achteraan (ongeacht of de data die uit de database komt wel daadwerkelijk
    van het type is dat je verwacht).

    Wat is bijvoorbeeld de grootte van je memorystream nadat je het veld heb opgehaald?
    Als die groter is dan 0, dan kun je (tijdelijk) het resultaat van je stream wegschrijven
    naar een bestand, die je daarna dan kunt openen met een hex-editor om te zien wat
    er precies aan data in je stream staat.

    Delphi Code:
    1. var
    2.   Stream: TMemoryStream;
    3.   Bitmap: TBitmap;
    4. begin
    5.   Stream := TMemoryStream.Create;
    6.   try
    7.     TBlobField(BindSourceDB1.DataSet.FieldByName('VOERTUIGJPG')).SaveToStream(Stream);
    8.     if (Stream.Size > 0) and
    9.        (Stream.Seek(0, soFromBeginning) = 0) then
    10.     begin
    11.       Stream.SaveToFile('DitIsEenBlobTest.bmp');
    12. //      Bitmap := TBitmap.Create;
    13. //      try
    14. //        Bitmap.LoadFromStream(Stream);
    15. //        Image1.Bitmap.Assign(Bitmap);
    16. //      finally
    17. //        Bitmap.Free;
    18. //      end;
    19.     end
    20.     else
    21.       ShowMessage('Stream is leeg');
    22.   finally
    23.     Stream.Free;
    24.   end;
    25. end;

    Dat is inderdaad een leuke test, wat ik ook doe binnen de Firemonkey client, ik krijg altijd een bestandje van 1K groor met daarin alleen dit: ÿØÿáDExif

    Dat terwijl als ik dit veld op de zelfde manier in een TImage zet, maar dan zonder de tussenkomst van een Tclientdataset alles perfect gaat en de foto verschijnt.
    Denk dus dat ik wel wat stoms gedaan heb waardoor het via de Tclientdataset niet werkt onder Firemonkey, maar wat doe ik voor iets stoms fout?

  6. #6
    Quote Originally Posted by andregr View Post
    ... ik krijg altijd een bestandje van 1K groor met daarin alleen dit: ÿØÿáDExif
    Dan hebben we het hier dus NIET over een BMP bestand maar een JPEG bestand. (Een BMP bevat geen Exif in de header en JPEG wel)

    Hernoem die DitIsEenBlobTest.bmp een naar DitIsEenBlobTest.jpg en probeer hem eens te openen (via de verkenner).

    Je moet het bestand (omdat het een jpg bestand is) dus in ieder geval niet zomaar met TBitmap inlezen. Want dat gaat niet.

    En wat bedoel je met... "als ik dit veld op de zelfde manier in een TImage zet" ?
    Met welke code doe je dat dan? (want hoe wil je een veld zonder TClientDataset uit de database halen?)

    En hoe heb je de foto in de database gekregen?

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,120
    Quote Originally Posted by andregr View Post
    ÿØÿáDExif
    ...is inderdaad JPEG zoals Rik zegt.

    Overigens betwijfel ik of het wel wijs is om bitmaps (*.bmp-bestanden) te gebruiken in FireMonkey.
    Bitmaps zijn een typisch Windows-formaat en wordt (officieel, voor zover ik weet) niet (volledig) ondersteunt
    door bijvoorbeeld webbrowsers; het zou me niets verbazen als MacOS/iOs/Android ook niet echt blij zijn met
    plaatjes in dit formaat (maar ik ben verder totaal niet bekend met FM of de ontwikkeling voor iOs/Android).

    Mocht je toch verschillende formaten (dus bijvoorbeeld JPEG, PNG en BMP) op willen staan in een database,
    maak dan een extra veld aan waarin je opgeeft wat het formaat van het plaatje is.
    Bij het uitlezen kun je dan de correcte klasse aanmaken (TJPEGImage, TPNGImage, TBitmap) voordat je
    daadwerkelijk de blobdata in het object laadt.
    TMemoryLeak.Create(Nil);

  8. #8
    Quote Originally Posted by rvk View Post
    Dan hebben we het hier dus NIET over een BMP bestand maar een JPEG bestand. (Een BMP bevat geen Exif in de header en JPEG wel)

    Hernoem die DitIsEenBlobTest.bmp een naar DitIsEenBlobTest.jpg en probeer hem eens te openen (via de verkenner).

    Je moet het bestand (omdat het een jpg bestand is) dus in ieder geval niet zomaar met TBitmap inlezen. Want dat gaat niet.

    En wat bedoel je met... "als ik dit veld op de zelfde manier in een TImage zet" ?
    Met welke code doe je dat dan? (want hoe wil je een veld zonder TClientDataset uit de database halen?)

    En hoe heb je de foto in de database gekregen?
    Voor zover ik goed ingelezen ben is TBitmap onder Firemonkey bruikbaar voor meerdere formaten: http://docwiki.embarcadero.com/Libra..._Image_Formats
    Maar ik weet het, ik doe wat fout hierin.
    Het renamen naar .jpg heb ik al gedaan maar het bestandje kan niet geopend worden, behalve dan geforceerd met notepad om te kijken wat er in dat te kleine bestand staat.

    Zodra ik dus een dbx connexion en een dbx table op dat zelfde FMX client form plaats en ik pak de zelfde db, table en record dan komt er netjes met de zelfde code een plaatje op mijn form te staan.
    Dus ik weet het nu even niet meer......help!

  9. #9
    FMX.Graphics.TBitmapCodecManager

  10. #10
    Ik neem aan dat je het plaatje op dezelfde manier (met TBlobField) uit de dbx table haalt.

    Dan lijkt het er inderdaad op dat de BindSourceDB1 je veld niet als BLOB ziet.
    Als het bestand via Stream.SaveToFile opgeslagen wordt en afgekapt wordt (ik neem aan dat je foto zelf groter is) dan zou het kunnen zijn dat BindSourceDB1 je veld dus niet als BLOB maar als string ziet (en dus afkapt op #0).

    Het is n.l. ook niet zo dat je BLOB-veld in BindSourceDB1 echt leeg is (want je krijgt wel die ÿØÿáDExif in het bestand).

    Kun je zien wat de volgende waardes zijn:
    Code:
    BindSourceDB1.DataSet.FieldByName('VOERTUIGJPG')).DataType
    BindSourceDB1.DataSet.FieldByName('VOERTUIGJPG')).DataSize

  11. #11
    Quote Originally Posted by rvk View Post
    Ik neem aan dat je het plaatje op dezelfde manier (met TBlobField) uit de dbx table haalt.

    Dan lijkt het er inderdaad op dat de BindSourceDB1 je veld niet als BLOB ziet.
    Als het bestand via Stream.SaveToFile opgeslagen wordt en afgekapt wordt (ik neem aan dat je foto zelf groter is) dan zou het kunnen zijn dat BindSourceDB1 je veld dus niet als BLOB maar als string ziet (en dus afkapt op #0).

    Het is n.l. ook niet zo dat je BLOB-veld in BindSourceDB1 echt leeg is (want je krijgt wel die ÿØÿáDExif in het bestand).

    Kun je zien wat de volgende waardes zijn:
    Code:
    BindSourceDB1.DataSet.FieldByName('VOERTUIGJPG')).DataType
    BindSourceDB1.DataSet.FieldByName('VOERTUIGJPG')).DataSize
    Datatype = Inaccessible value
    Datasize= 0

    Ondanks dat de datasize dus zogenaamd 0 is gaat ie toch bij de check van stream gewoon door de 0 heen omdat er idd wel inhoud is.

    if (Stream.Size > 0) and
    (Stream.Seek(0, soFromBeginning) = 0) then
    begin

  12. #12
    Je kunt voor de zekerheid even kijken wat Stream.Size als waarde heeft.
    Het zou vreemd zijn als dat 0 is want dan zou ie toch echt niet door die if mogen komen.

    De datatype kun je misschien niet in de debugger zien.
    Wat geeft
    Delphi Code:
    1. Showmessage(IntToStr(Integer(BindSourceDB1.DataSet.FieldByName('VOERTUIGJPG')).DataType)));


    Ik heb geen ervaring met LiveBindings maar ik zie wel dat de voorbeelden een TImageControl gebruiken i.p.v. TImage.

    Je kunt de voorbeelden eens bekijken.
    Daar zie je dan een TImageControl met de naam ImageWithHandler.

    De voorbeelden staan in C:\Users\Public\Documents\Embarcadero\Studio\19.0\ Samples\Object Pascal\LiveBindings

    http://docwiki.embarcadero.com/CodeE...LinkFMX_Sample
    https://stackoverflow.com/questions/...elphi-with-fir

  13. #13
    De showmessage geeft nu de waarde 16 als datatype terug.

    Als ik een timagecontrol via lifebidings aan het blobveld probeer te koppelen dan krijg ik onderstaande error:

    Click image for larger version. 

Name:	error.PNG 
Views:	1 
Size:	12.1 KB 
ID:	7704

  14. #14
    Zo'n vermoeden had ik al.
    DataType 16 is ftMemo.
    DataType 15 is ftBlob.

    Dus de database/fmx ziet je veld als een ftMemo, wat eigenlijk gewoon tekst (string) is.

    De foutmelding geeft het ook al aan. Er kan niet tussen String en TBitmap geconverteerd worden.

    Ik weet niet of je in die LiveBinding ergens zelf op kunt geven wat voor veld VOERTUIGJPG precies is?

    Wat is de onderliggende database?

  15. #15
    Ik kan in de clientdataset het veldtype forceren voor dat veld naar FTBlob, maar het eindresultaat blijft de zelfde. Binnen de livebindings kan ik blijkbaar niets aanpassen.
    Het hoeft van mij ook niet via livebindings, als ik middels de memorystream de image kan vullen is dat ook prima. Onder de VCL lijkt dit wel te werken, onder de FMX dus blijkbaar niet, of ik zit er naast...
    De onderliggende db is firebird.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •