Recent

Author Topic: Dynamically load Qt ?  (Read 12954 times)

Fred vS

  • Hero Member
  • *****
  • Posts: 1675
    • miXimum is the DJ's best friend
Dynamically load Qt ?
« on: February 05, 2013, 10:49:05 pm »
Hello everybody  ;)

It is maybe a strange question, but could it be possible to load Qt dynamically ?
I do not talk about the conversion of qt4.pas into dyn_qt4.pas ( easy  8-) ) but after that at init of your prog you must specify where are the qt4pas libraries... and that is the question : is it possible ?

EDIT :
Quote
( easy  8-) )
Hum, not so easy, more than hundreds procedures  :-X
« Last Edit: February 05, 2013, 11:12:24 pm by Fred vS »
I use Lazarus 1.8.0 32/64 and FPC 3.0.3 32/64 on Linux Mint Mate 17 32/64, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64 and Mac OS X Snow Leopard 32.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt, Carbon.

https://github.com/fredvs

taazz

  • Hero Member
  • *****
  • Posts: 5363
Re: Dynamically load Qt ?
« Reply #1 on: February 05, 2013, 11:42:38 pm »
the problem with qt is that it is a c++ library and does not have a plain C header aka flat header. QT4Pas flats out the object of the qt library to that c header which is then used by your application the problem is not to make those 100 function load dynamicaly the problem is to create a qt4pas dll that will load dynamically the required dlls and that requires c programming not pascal.
I do not know if it possible or how easy it will be but I guess if it was easy to do then it would have been done by the author in the first place instead of static linking.

Let me say at this point that I know less than nothing regarding c programming so I really hope that the swig extension to create mapping for free pascal takes some momentum. I'm sure to use if it does after I find out how to use it  :-[
Good judgement is the result of experience … Experience is the result of bad judgement.

OS : Windows 7 64 bit
Laz: Lazarus 1.4.4 FPC 2.6.4 i386-win32-win32/win64

Fred vS

  • Hero Member
  • *****
  • Posts: 1675
    • miXimum is the DJ's best friend
Re: Dynamically load Qt ?
« Reply #2 on: February 05, 2013, 11:51:55 pm »
Quote
qt4pas dll that will load dynamically the required dlls

Yes, it is what i fear  :-[

It was too easy to only load libQt4Pas.so dynamically  :'(
I use Lazarus 1.8.0 32/64 and FPC 3.0.3 32/64 on Linux Mint Mate 17 32/64, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64 and Mac OS X Snow Leopard 32.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt, Carbon.

https://github.com/fredvs

Fred vS

  • Hero Member
  • *****
  • Posts: 1675
    • miXimum is the DJ's best friend
Re: Dynamically load Qt ?
« Reply #3 on: February 06, 2013, 12:46:53 am »
After thinking, it must be possible to load dynamically libQt4Pas.so.

Of course if they are some lib missing, libQt4Pas.so gonna complain but it is the same for all dynamically loaded libraries.

Ok, if i have some free time, gonna try the conversion into dyn_qt4.pas.

EDIT Oops, it is not hundreds but thousands of procedures  :o
No, sorry, i never can find that free time... :-[
« Last Edit: February 06, 2013, 01:05:22 am by Fred vS »
I use Lazarus 1.8.0 32/64 and FPC 3.0.3 32/64 on Linux Mint Mate 17 32/64, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64 and Mac OS X Snow Leopard 32.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt, Carbon.

https://github.com/fredvs

BigChimp

  • Hero Member
  • *****
  • Posts: 5740
  • Add to the wiki - it's free ;)
    • FPCUp, PaperTiger scanning and other open source projects
Re: Dynamically load Qt ?
« Reply #4 on: February 06, 2013, 08:55:02 am »
After thinking, it must be possible to load dynamically libQt4Pas.so.

Of course if they are some lib missing, libQt4Pas.so gonna complain but it is the same for all dynamically loaded libraries.

Ok, if i have some free time, gonna try the conversion into dyn_qt4.pas.
Yep, in theory, I suppose you could load the dependent .sos using Pascal... in practice, there's a lot of them so you'd have to have some way to automatically parse dependencies, load them etc.
No idea if this is simple or difficult...
Want quicker answers to your questions? Read http://wiki.lazarus.freepascal.org/Lazarus_Faq#What_is_the_correct_way_to_ask_questions_in_the_forum.3F

Open source including papertiger OCR/PDF scanning:
https://bitbucket.org/reiniero

Lazarus trunk+FPC trunk x86, Windows x64 unless otherwise specified

theo

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1890
Re: Dynamically load Qt ?
« Reply #5 on: February 06, 2013, 12:24:32 pm »
I don't understand why you want to do this.

If your libraries are not in the standard paths on Linux, you can write a start script for your application setting:

Code: [Select]
#/bin/sh
export LD_LIBRARY_PATH=<Your Path To Libs>
MyApplication

Fred vS

  • Hero Member
  • *****
  • Posts: 1675
    • miXimum is the DJ's best friend
Re: Dynamically load Qt ?
« Reply #6 on: February 06, 2013, 01:31:02 pm »
@ BigChimp and Theo : many thanks for answers.  ::)

Quote
I don't understand why you want to do this.

To reduce the lots of
Quote
"I can not use your program, i get a message "Qt4pas is missing..."
or
Quote
Where must i install qt4pas libraries?
or
Quote
Where can i find qt4pas lib ?
or
Quote
The version of Qt4pas in not compatible...

Etc...
« Last Edit: February 06, 2013, 01:33:07 pm by Fred vS »
I use Lazarus 1.8.0 32/64 and FPC 3.0.3 32/64 on Linux Mint Mate 17 32/64, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64 and Mac OS X Snow Leopard 32.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt, Carbon.

https://github.com/fredvs

theo

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1890
Re: Dynamically load Qt ?
« Reply #7 on: February 06, 2013, 01:53:51 pm »
It's an installation problem, no?

Dibo

  • Hero Member
  • *****
  • Posts: 1045
Re: Dynamically load Qt ?
« Reply #8 on: February 06, 2013, 04:39:14 pm »
I'm also fan of dynamic libs loading because my applications are mostly "out of the box" for simple users. User just download it and run. On windows it is easy to deploy, just put all libs in application dir, but on linux it is more complicated. On linux solutions is create distro package (deb, rpm) with dependencies or prepare sh script which temporary add own path to library path. Anyway, I would like to have dynamic QT ;)

Fred vS

  • Hero Member
  • *****
  • Posts: 1675
    • miXimum is the DJ's best friend
Re: Dynamically load Qt ?
« Reply #9 on: February 06, 2013, 08:30:33 pm »
Quote
It's an installation problem, no?

Of course, but like Dibo said, users (and me too) do not like to be obliged to install static libraries, you must have root permission, it change your /usr/lib content,...etc.

And with dynamic load of Qt, bye-bye all that problems.
I use Lazarus 1.8.0 32/64 and FPC 3.0.3 32/64 on Linux Mint Mate 17 32/64, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64 and Mac OS X Snow Leopard 32.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt, Carbon.

https://github.com/fredvs

theo

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1890
Re: Dynamically load Qt ?
« Reply #10 on: February 07, 2013, 11:36:24 am »
And with dynamic load of Qt, bye-bye all that problems.

It think a start script would be much easier.

export LD_LIBRARY_PATH=<Your Path To Libs>

Fred vS

  • Hero Member
  • *****
  • Posts: 1675
    • miXimum is the DJ's best friend
Re: Dynamically load Qt ?
« Reply #11 on: March 05, 2013, 11:40:29 pm »
Hello everybody.  ;)

One more problem with static libraries :

How can i do for loading qt4pas libraries with multi-arch system ?

I have enabled multi-arch system on my Ubuntu 13.04 64 bit system.
Perfect, i can load all the 32 bit applications i have but only one do not want to load : the one using qt4pas libraries, i get :

Quote
error while loading shared libraries: libQt4Pas.so.5: cannot open shared object file: No such file or directory

Of course, the static installed libQt4Pas.so.5 lib is 64 bit and not compatible with the 32 bit applications.  :-[
I use Lazarus 1.8.0 32/64 and FPC 3.0.3 32/64 on Linux Mint Mate 17 32/64, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64 and Mac OS X Snow Leopard 32.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt, Carbon.

https://github.com/fredvs

Blaazen

  • Hero Member
  • *****
  • Posts: 2782
  • POKE 54296,15
    • Eye-Candy Controls
Re: Dynamically load Qt ?
« Reply #12 on: March 06, 2013, 12:02:05 am »
I have no experience with multiarch, however I found this: http://askubuntu.com/questions/145688/multi-architectures-and-their-binaries
So you should download the 32-bit version from here: http://users.telenet.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html
and copy it (as "sudo") to the path described in the first link, probably: /usr/lib/i386-linux-gnu/ - if you have it there  :)
Maybe you should create the symlinks too, I mean finally you should have:
Code: [Select]
/usr/lib/i386-linux-gnu/libQt4Pas.so
/usr/lib/i386-linux-gnu/libQt4Pas.so.5
/usr/lib/i386-linux-gnu/libQt4Pas.so.5.2
/usr/lib/i386-linux-gnu/libQt4Pas.so.5.2.5
Lazarus 2.1.0 r61214:62238 FPC 3.3.1 r40507 x86_64-linux-qt Chakra, Qt 4.8.7/5.13.2, Plasma 5.17.3
Lazarus 1.8.2 r57369 FPC 3.0.4 i386-win32-win32/win64 Wine 3.21

Try Eye-Candy Controls: https://sourceforge.net/projects/eccontrols/files/

Fred vS

  • Hero Member
  • *****
  • Posts: 1675
    • miXimum is the DJ's best friend
Re: Dynamically load Qt ?
« Reply #13 on: March 06, 2013, 10:05:34 pm »
@ Blaazen : many thanks ( but i have already do it  :-X ).

With libQt4pas.o 32 bits in /lib/i386-linux-gnu i get that message :

Quote
/usr/lib/codetyphon/fpc/bin/x86_64-linux/i386-linux-ld: warning: link.res contains output sections; did you forget -T?
/usr/lib/codetyphon/fpc/bin/x86_64-linux/i386-linux-ld: warning: libGL.so.1, needed by /usr/lib/i386-linux-gnu//libQtWebKit.so.4, not found (try using -rpath or -rpath-link)
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glGetDoublev'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXCreatePixmap'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXMakeCurrent'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glClearDepth'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glClearIndex'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glIsTexture'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXCreateGLXPixmap'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glMatrixMode'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glHint'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glClearColor'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPopClientAttrib'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glLineWidth'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTranslated'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPushClientAttrib'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glEndList'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glDepthRange'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glFlush'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glGetTexImage'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glVertexPointer'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTexImage1D'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glDepthFunc'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glDrawElements'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glDisableClientState'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glLoadIdentity'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glColorMask'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glFrontFace'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glOrtho'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glIsEnabled'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXChooseFBConfig'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXGetConfig'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXQueryVersion'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glVertex2d'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPointSize'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGenTextures'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPolygonMode'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glViewport'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glCompressedTexImage2D'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGetString'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTexGeni'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glDepthMask'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPopAttrib'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXGetCurrentDrawable'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXGetVisualFromFBConfig'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glVertex2f'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXUseXFont'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glDrawPixels'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glPolygonOffset'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glTexParameterf'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glEnable'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glClear'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glScissor'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXGetCurrentContext'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXQueryExtensionsString'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glReadPixels'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGetBooleanv'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTexCoord2f'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXQueryServerString'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glStencilMask'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPushMatrix'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glNewList'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glBitmap'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glDrawBuffer'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXSwapBuffers'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glStencilFunc'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXDestroyGLXPixmap'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGetFloatv'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glTexSubImage2D'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glTexParameteri'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXGetFBConfigAttrib'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glStencilOp'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glEnableClientState'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glCompressedTexSubImage2D'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXIsDirect'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glClearStencil'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTexCoord4f'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGetTexParameteriv'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glRotatef'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glShadeModel'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGetIntegerv'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTexEnvf'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glFinish'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glGetTexLevelParameteriv'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXChooseVisual'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glEnd'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXDestroyPixmap'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glAlphaFunc'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPushAttrib'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glDisable'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glCopyTexSubImage2D'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXWaitX'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glPixelStorei'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glBegin'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPopMatrix'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glLoadMatrixd'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXCreateContext'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTexCoordPointer'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glDeleteTextures'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGetError'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glTexImage2D'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glTexGenfv'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glCopyTexImage2D'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glColor4f'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glBlendFunc'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glDrawArrays'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXDestroyContext'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXQueryExtension'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glLoadMatrixf'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glIndexi'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glBindTexture'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glCullFace'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glPixelTransferi'
/usr/lib/i386-linux-gnu//libQtWebKit.so.4: undefined reference to `glGetTexParameterfv'
/usr/lib/i386-linux-gnu//libQtOpenGL.so.4: undefined reference to `glXGetClientString'
 Error: Error while linking
 There were 1 errors compiling module, stopping

PS : Cross-compiling with GTK2 widgetset : no problem, compile ok and running 32 bit app ok as well.  :-[
I use Lazarus 1.8.0 32/64 and FPC 3.0.3 32/64 on Linux Mint Mate 17 32/64, Windows 10, Windows 7 32/64, Windows XP 32,  FreeBSD 64 and Mac OS X Snow Leopard 32.
Widgetset: fpGUI, MSEgui, Win32, GTK2, Qt, Carbon.

https://github.com/fredvs

Blaazen

  • Hero Member
  • *****
  • Posts: 2782
  • POKE 54296,15
    • Eye-Candy Controls
Re: Dynamically load Qt ?
« Reply #14 on: March 06, 2013, 10:24:53 pm »
Hmm, it seems you are missing more 32 bit dependencies.
Lazarus 2.1.0 r61214:62238 FPC 3.3.1 r40507 x86_64-linux-qt Chakra, Qt 4.8.7/5.13.2, Plasma 5.17.3
Lazarus 1.8.2 r57369 FPC 3.0.4 i386-win32-win32/win64 Wine 3.21

Try Eye-Candy Controls: https://sourceforge.net/projects/eccontrols/files/