Krool's CommonControls cut out for Onesie-Twosie use
Update: On Jan 1, 2023, Krool notified me that there was a bug in the VTableHandle.bas module that he was concerned about (that he fixed subsequent to Nov 14, 2021). That VTableHandle.bas module has been replaced in all 18 of the following attachments, with spot testing (that shows everything seems to still work). For more minor changes, you are referred to Krool's full set.
Ok, this is Krool's work, not mine. And this is done "with his permission".
I just downloaded his most recent copy (on November 14, 2021), and I'll probably stick with this copy, as I do feel that his work is quite mature at this point. If you want a more recent version of his code, you're on your own.
What I've done (and will build upon) is to "cut out" the individual controls from his "controls package". I'm also cutting out any/all of his custom property pages, so, if you wish to have Unicode text, captions, etc, you must set them at runtime. I cut out these property pages because leaving them makes this all much more complex, as his property pages also use his controls, which makes everything quite "interwoven". Without these property pages, it's much easier to isolate individual controls.
I'm just going to post small "demo" projects that have the individual "cut out" controls. In all cases, it'll just be a Project1.vbp and a Form1.frm (with Krool's single control on it). There are no sub-folders in the attached zip files. Everything you need is just all together.
In almost all cases, Krool also requires use of his OLEGuids.tlb typelib. And, this must be registered (with RegTLib.exe) on your computer, and then the reference in the Project1.vbp must be updated.
This piece can be a bit tricky:
I'd delete any older copies of Krool's OLEGuids.tlb file from your computer, as older versions aren't compatible with his most recent release.
I've included a copy of this OLEGuids.tlb in each of the following projects, but it's only needed once. In fact, personally, I keep the most recent version in my C:\Windows\SysWOW64 folder, registered there with RegTLib.exe. ( C:\windows\syswow64>regtlib oleguids.tlb )
Note that this OLEGuids.tlb file is no longer needed once your project is compiled to an executable (exe). In other words, it's only needed on your development machine, and other users won't need to worry about it.
When refreshing the reference to this OLEGuids.tlb file in any project, you typically must unreference any prior reference, and then browse to and re-reference the copy you've got registered on your computer, using the Project --> References option in your VB6 IDE.
All this should make it easy to add a single (or a couple) of Krool's controls to your own project. Just drag all the necessary files to your project (and also reference the OLEGuids.tlb in your project), and then you can use the control(s) from your toolbox.
Anytime I've made any change to Krool's code, I will make notes on that in these posts. I hope to not make any changes at all.
Also, as a note, if you intend to use two or three of Krool's controls in a single project (getting them from this CodeBank thread), you'll run into module redundancy. For instance, Krool's Common.bas module is used by pretty much all of his controls. However, I've included a copy of it in each of the "cut out" controls in this thread. But, since I haven't made any changes to his source code, just ignore that redundancy, and just include a single copy in your project.
Also, you can individually compile these as OCXs, but you're on your own regarding that one. If you're going to do that, I don't see why you don't just use Krool's complete OCX.
That's about it. I'll start with his TextBoxW control, and add more as I get them done. Only five attachments per post, so see subsequent posts.
p.s. I probably won't do every single one, as I'll focus on the controls in my primary project. However, you should be able to use my work as a template for pulling out any of Krool's controls from his larger project.
Last edited by Elroy; Jan 25th, 2023 at 10:55 AM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
More...
Last edited by Elroy; Jan 25th, 2023 at 10:47 AM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
And more...
Last edited by Elroy; Jan 25th, 2023 at 10:51 AM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
And yet more...
(And other than the MsFlxGrd control, which Krool as done separately, and the SSTab control, which Eduardo has done ... that's about all I'd ever use. Again, it's an easy template to follow if you want to isolate other controls that Krool as done.)
Last edited by Elroy; Jan 25th, 2023 at 10:52 AM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Skillset: VMS,DOS,Windows Sysadmin from 1985, fault-tolerance, VaxCluster, Alpha,Sparc. DCL,QB,VBDOS- VB6,.NET, PHP,NODE.JS, Graphic Design, Project Manager, CMS, Quad Electronics. classic cars & m'bikes. Artist in water & oils. Historian.
By the power invested in me, all the threads I start are battle free zones - no arguing about the benefits of VB6 over .NET here please. Happiness must reign.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Elroy, can you just check your TextBoxW vbp and see if it compiles, I am receiving a Compile error:
"Procedure declaration does not match description of event or procedure having the same name"
in:
Private Sub IOleInPlaceActiveObjectVB_TranslateAccelerator(ByRef Handled As Boolean, ByRef RetVal As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal Shift As Long)
I have the project references set and the typelib registered. I feel that I managed to get to the same point when I was stripping out Krool's code myself to just the TextBoxW. I couldn't move past this as I am at the limits of my understanding and capability.
Skillset: VMS,DOS,Windows Sysadmin from 1985, fault-tolerance, VaxCluster, Alpha,Sparc. DCL,QB,VBDOS- VB6,.NET, PHP,NODE.JS, Graphic Design, Project Manager, CMS, Quad Electronics. classic cars & m'bikes. Artist in water & oils. Historian.
By the power invested in me, all the threads I start are battle free zones - no arguing about the benefits of VB6 over .NET here please. Happiness must reign.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by yereverluvinuncleber
Elroy, can you just check your TextBoxW vbp and see if it compiles, I am receiving a Compile error:
"Procedure declaration does not match description of event or procedure having the same name"
in:
Private Sub IOleInPlaceActiveObjectVB_TranslateAccelerator(ByRef Handled As Boolean, ByRef RetVal As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal Shift As Long)
I have the project references set and the typelib registered. I feel that I managed to get to the same point when I was stripping out Krool's code myself to just the TextBoxW. I couldn't move past this as I am at the limits of my understanding and capability.
Ber, you don't have the OLEGuids.tlb typelib registered and/or the reference to it refreshed correctly. I just tried running it, and also compiled it to an EXE, and everything worked fine. Then, I deleted my registered copy of Krool's OLEGuids.tlb typelib, and then got the same error you're saying. Please read this section of my OP carefully, as you must register (and then refresh that dependency in the project), and then everything will work fine.
Also, just as a note, once compiled (to EXE) you no longer need this typelib ... and it doesn't need to be distributed with your application.
EDIT: I just re-read your post and see that you tried to do what I stated. Hmmm, I'd try a reboot, and then try re-registering and re-refreshing the reference in the IDE of Project1.vbp. Beyond that, I'm not sure, as I can't reproduce the problem here. I suppose you might try loading the Project1.vbp with an editor, deleting the reference line to OLEGuids.tlb, then re-load it in the IDE and re-browse (i.e., refresh the reference) to this typelib.
Last edited by Elroy; Nov 15th, 2021 at 08:45 AM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by DaveDavis
We have to refer back to Krool's original work because he apply updates and bug fixes from time to time.
Dave, you are absolutely correct, and I stated as much in my OP. I just felt that his controls were relatively mature at this point, with few (if any) changes occurring in the future on the ones on which I'd be focusing. However, you should be able to use what I've done as a template for re-doing it with Krool's future versions. All I've done is to gather up the necessary modules to make the individual controls work. In most cases, it's just the ComCtrlsBase.bas, Common.Bas, VisualStyles.bas, VTableHandle.bas, ISubclass.cls, and then the OLEGuids.tlb (registered and reference refreshed) ... along with the CTL and CTX of the control you want.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by Elroy
EDIT: I just re-read your post and see that you tried to do what I stated. Hmmm, I'd try a reboot, and then try re-registering and re-refreshing the reference in the IDE of Project1.vbp. Beyond that, I'm not sure, as I can't reproduce the problem here. I suppose you might try loading the Project1.vbp with an editor, deleting the reference line to OLEGuids.tlb, then re-load it in the IDE and re-browse (i.e., refresh the reference) to this typelib.
I will do that now, thanks for your help, will report back in an hour or two.
FYI - I was able to compile Krool's comCtlsDemo flawlessly so that may prove something.
Skillset: VMS,DOS,Windows Sysadmin from 1985, fault-tolerance, VaxCluster, Alpha,Sparc. DCL,QB,VBDOS- VB6,.NET, PHP,NODE.JS, Graphic Design, Project Manager, CMS, Quad Electronics. classic cars & m'bikes. Artist in water & oils. Historian.
By the power invested in me, all the threads I start are battle free zones - no arguing about the benefits of VB6 over .NET here please. Happiness must reign.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by yereverluvinuncleber
I will do that now, thanks for your help, will report back in an hour or two.
FYI - I was able to compile Krool's comCtlsDemo flawlessly so that may prove something.
While in Project1 in the IDE, and attempting to refresh the reference, be sure you're browsing to your registered copy of the OLEGuids.tlb typelib. Personally, I'd just make a copy of this typelib and place it in my C:\Windows\SysWOW64, and then register it there, pointing all my references to that copy. Again, once compiled to an EXE, you can forget about this OLEGuids.tlb typelib, so it's just a "thing" on your development machine.
EDIT: See my indented edits to the OP for more details on this.
Last edited by Elroy; Nov 15th, 2021 at 01:38 PM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Elroy,
The resource file missing from examples. So if anyone compile one example, gets the wrong idea about the control.
The resource file has an AVI section, I don't now why, I just can't remember where I found it. Perhaps its from Krool's example.
In a module modToolTip.bas copy this. You can update any control, just do the same.
Code:
Private Type TOOLINFO
lSize As Long
lFlags As Long
hWnd As Long
lId As Long
'
'lpRect As RECT
Left As Long
Top As Long
Right As Long ' This is +1 (right - left = width)
Bottom As Long ' This is +1 (bottom - top = height)
'
hInstance As Long
lpStr As String
lParam As Long
End Type
'
Private Declare Function SendMessageLong Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Sub InitCommonControls Lib "comctl32" ()
Private Declare Function CreateWindowExW Lib "user32" (ByVal dwExStyle As Long, ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long
''
Private Const WM_USER As Long = &H400&
Private Const CW_USEDEFAULT As Long = &H80000000
'
Private Const TTM_ACTIVATE As Long = WM_USER + 1&
'Private Const TTM_ADDTOOLA As Long = WM_USER + 4&
Private Const TTM_ADDTOOLW As Long = WM_USER + 50&
Private Const TTM_SETDELAYTIME As Long = WM_USER + 3&
'Private Const TTM_UPDATETIPTEXTA As Long = WM_USER + 12&
Private Const TTM_UPDATETIPTEXTW As Long = WM_USER + 57&
Private Const TTM_SETTIPBKCOLOR As Long = WM_USER + 19&
Private Const TTM_SETTIPTEXTCOLOR As Long = WM_USER + 20&
Private Const TTM_SETMAXTIPWIDTH As Long = WM_USER + 24&
'Private Const TTM_SETTITLEA As Long = WM_USER + 32&
Private Const TTM_SETTITLEW As Long = WM_USER + 33&
'
Private Const TTS_NOPREFIX As Long = &H2&
Private Const TTS_BALLOON As Long = &H40&
Private Const TTS_ALWAYSTIP As Long = &H1&
'
Private Const TTF_CENTERTIP As Long = &H2&
Private Const TTF_IDISHWND As Long = &H1&
Private Const TTF_SUBCLASS As Long = &H10&
Private Const TTF_TRANSPARENT As Long = &H100&
'
Private Const TTDT_AUTOPOP As Long = 2&
Private Const TTDT_INITIAL As Long = 3&
'
Private Const TOOLTIPS_CLASS As String = "tooltips_class32"
'
Public Enum ttIconType
TTNoIcon
TTIconInfo
TTIconWarning
TTIconError
End Enum
#If False Then ' Intellisense fix.
Public TTNoIcon, TTIconInfo, TTIconWarning, TTIconError
#End If
'
Private hwndTT As Long ' hwnd of the tooltip
Public Ide As Boolean
Public Function GetHWndForToolTip(ByVal ctl As Object) As Long
' This returns the control's hWnd, or it keeps crawling up
' into containers until it finds one with a valid hWnd.
' Ultimately, the top-level form always has a hWnd.
On Error Resume Next
Do
GetHWndForToolTip = ctl.hWnd
If Err = 0 Then Exit Do
Err.Clear
Set ctl = ctl.Container ' This will still work for controls nested on a container on a UC.
If Err <> 0 Then ' Apparently it's directly on a UC. At this point, Container will be the UC (if Err).
Err.Clear
Set ctl = ctl.Extender.Container ' Extender must be exposed for this to work.
If Err <> 0 Then
On Error GoTo 0
Error 438 ' Apparently it's on a UC and the Extender wasn't exposed.
Exit Function
End If
End If
Loop
On Error GoTo 0
End Function
Function InIDE() As Boolean
Ide = True
InIDE = True
End Function
Public Function CreateToolTip(ByVal ParentHwnd As Long, _
ByVal TipText As String, _
Optional ByVal uIcon As ttIconType = TTNoIcon, _
Optional ByVal sTitle As String, _
Optional ByVal lForeColor As Long = -1&, _
Optional ByVal lBackColor As Long = -1&, _
Optional ByVal bCentered As Boolean, _
Optional ByVal bBalloon As Boolean, _
Optional ByVal lWrapTextLength As Long = 50&, _
Optional ByVal lDelayTime As Long = 200&, _
Optional ByVal lVisibleTime As Long = 5000& _
) As Boolean
'
' If lWrapTextLength = 0 then there will be no wrap.
' Also, lWrapTextLength = 40 is a minimum value.
' The max for lVisibleTime is 32767.
'
'Static bCommonControlsInitialized As Boolean
Debug.Assert InIDE
If Ide Then Exit Function
CreateToolTip = True
Dim lWinStyle As Long
Dim TI As TOOLINFO
Static PrevParentHwnd As Long
Static PrevTipText As String
Static PrevTitle As String
'
' Don't do anything unless we need to.
If hwndTT <> 0 And ParentHwnd = PrevParentHwnd And TipText = PrevTipText And sTitle = PrevTitle Then Exit Function
'
' If Not bCommonControlsInitialized Then
' InitCommonControls
' bCommonControlsInitialized = True
'End If
'
' Destroy any previous tooltip.
If hwndTT <> 0 Then DestroyWindow hwndTT
'
' Format the text.
FormatTooltipText TipText, lWrapTextLength
'
' Initial style settings.
lWinStyle = TTS_ALWAYSTIP Or TTS_NOPREFIX
If bBalloon Then lWinStyle = lWinStyle Or TTS_BALLOON ' Create baloon style if desired.
' Set the style.
hwndTT = CreateWindowExW(0&, StrPtr(TOOLTIPS_CLASS), 0&, lWinStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0&, 0&, App.hInstance, 0&)
'
' Setup our tooltip info structure.
TI.lFlags = TTF_SUBCLASS Or TTF_IDISHWND
If bCentered Then TI.lFlags = TI.lFlags Or TTF_CENTERTIP
' Set the hwnd prop to our parent control's hwnd.
TI.hWnd = ParentHwnd
TI.lId = ParentHwnd
TI.hInstance = App.hInstance
TI.lpStr = TipText
TI.lSize = LenB(TI)
' Set the tooltip structure
SendMessageLong hwndTT, TTM_ADDTOOLW, 0&, VarPtr(TI)
SendMessageLong hwndTT, TTM_UPDATETIPTEXTW, 0&, VarPtr(TI)
'
' Colors.
If lForeColor <> -1 Then SendMessage hwndTT, TTM_SETTIPTEXTCOLOR, lForeColor, 0&
If lBackColor <> -1 Then SendMessage hwndTT, TTM_SETTIPBKCOLOR, lBackColor, 0&
' If MultiLine = True Then
SendMessage hwndTT, TTM_SETMAXTIPWIDTH, 0&, 0 'Set to multiline
'End If
'
' Title or icon.
If uIcon <> TTNoIcon Or sTitle <> vbNullString Then SendMessageLong hwndTT, TTM_SETTITLEW, CLng(uIcon), StrPtr(sTitle)
'
SendMessageLong hwndTT, TTM_SETDELAYTIME, TTDT_AUTOPOP, lVisibleTime
SendMessageLong hwndTT, TTM_SETDELAYTIME, TTDT_INITIAL, lDelayTime
'
PrevParentHwnd = ParentHwnd
PrevTipText = TipText
PrevTitle = sTitle
End Function
Public Sub DestroyToolTip()
' It's not a bad idea to put this in the Form_Unload event just to make sure.
If hwndTT <> 0 Then DestroyWindow hwndTT
hwndTT = 0
End Sub
Private Sub FormatTooltipText(TipText As String, lLen As Long)
Dim s As String
Dim i As Long
'
' Make sure we need to do anything.
If lLen = 0 Then Exit Sub
If lLen < 40 Then lLen = 40
If Len(TipText) <= lLen Then Exit Sub
'
Do
i = InStrRev(TipText, " ", lLen + 1)
If i = 0 Then
s = s & Left$(TipText, lLen) & vbCrLf ' Build "s" and trim from TipText.
TipText = Mid$(TipText, lLen + 1)
Else
s = s & Left$(TipText, i - 1) & vbCrLf ' Build "s" and trim from TipText.
TipText = Mid$(TipText, i + 1)
End If
If Len(TipText) <= lLen Then
TipText = s & TipText ' Place "s" back into TipText and get out.
Exit Sub
End If
Loop
End Sub
Now in the TextBoxW
At General
Code:
Private PropToolTipText As String, PropToolTipTitle As String
PropToolTipText = .ReadProperty("ToolTipEx", vbNullString)
PropToolTipTitle = .ReadProperty("ToolTipExTitle", vbNullString)
' ----- Upgrade/Downgrade tooltip -- need MouseTrack = True
If Extender.ToolTipText <> "" And PropToolTipText = "" Then
PropToolTipText = Extender.ToolTipText
End If
ToolTipText = PropToolTipText
' --- use this for upgrade automatic all controls----
MouseTrack = PropToolTipText <> vbNullString Or MouseTrack
Public Property Let ToolTipTextTitle(ByVal Value As String)
PropToolTipTitle = Value
UserControl.PropertyChanged "ToolTipExTitle"
End Property
Public Property Get ToolTipTextTitle() As String
ToolTipTextTitle = PropToolTipTitle
End Property
Public Property Get ToolTipTextEx() As String
ToolTipTextEx = PropToolTipText
End Property
Public Property Let ToolTipTextEx(ByVal Value As String)
PropToolTipText = Value
If Value <> vbNullString And Visible Then
If Not CreateToolTip(hWnd, PropToolTipText, , PropToolTipTitle, , , , True) Then
Extender.ToolTipText = PropToolTipText
UserControl.PropertyChanged "ToolTipTextEx"
Else
Extender.ToolTipText = ""
If Not PropMouseTrack Then
PropMouseTrack = True
UserControl.PropertyChanged "MouseTrack"
End If
End If
End If
End Property
And now the trick part. Find that:
Code:
Private Function WindowProcControl(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case wMsg
Go down to Cases showing here and do the changes:
Code:
Case WM_MOUSEMOVE
If TextBoxMouseOver = False And PropMouseTrack = True Then
TextBoxMouseOver = True
Extender.ToolTipText = vbNullString
If Not CreateToolTip(hWnd, PropToolTipText, , PropToolTipTitle, , , , True) Then
Extender.ToolTipText = PropToolTipText
End If
RaiseEvent MouseEnter
Call ComCtlsRequestMouseLeave(hWnd)
End If
RaiseEvent MouseMove(GetMouseStateFromParam(wParam), GetShiftStateFromParam(wParam), X, Y)
And the last case
Code:
Case WM_MOUSELEAVE
If TextBoxMouseOver = True Then
TextBoxMouseOver = False
DestroyToolTip
RaiseEvent MouseLeave
End If
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by georgekar
Elroy,
The resource file missing from examples. So if anyone compile one example, gets the wrong idea about the control.
The resource file has an AVI section, I don't now why, I just can't remember where I found it. Perhaps its from Krool's example.
Ok, you're right, Krool does have his project manifested. Here's the manifest he's using:
I've just tried it with and without that manifest, and I'm not sure I see any difference, or why there'd be any (from what's in that manifest). However, you're certainly welcome to include it. I've attached a file named KroolControlsManifest.txt (which is just the above) and a file named Project1.res (with nothing but that manifest in it) to this post. If you want to use Krool's manifest, just drag that Project1.res file into whatever project you like.
Just FYI, to see that, all I did was run the following in the Immediate window (using his complete demo project): ? StrConv(LoadResData(1, 24), vbUnicode)
The only other thing in his resources is a file named AnimationDemo.avi that he uses to demonstrate his animation control. I doubt I'll be messing with that control, so I won't be needing that file.
-----
Regarding your latest post, I'm not sure what you're getting at, as all I'm trying to do is provide small projects with a single control (one of Krool's controls) in each project. If people want to enhance from there, they're certainly welcome to do whatever they'd like. I'm trying my best to leave his source code untouched, and have so far.
Last edited by Elroy; Nov 15th, 2021 at 05:33 PM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
hi Elroy:
Is it possible to make those individual controls with wqweto's "ModernSubclassingThunk" and remove tlb and ComCtlsBase.bas, Common.bas, VisualStyles.bas dependencies?
I need a stable TextBoxW and ListBoxW. (Right now my app crashed randomly after I swap both controls.)
Last edited by DaveDavis; Jan 24th, 2023 at 08:22 PM.
Re: Krool's CommonControls cut out for Onesie-Twosie use
I use the some of krools controls, and sometime the IDE crashes, but never crash in the compiling exe.
You have to insert in sub main:
Call InitVisualStylesFixes
So you have to adjust the start up object to sub main in Project Properties.
close all user controls designer window. If it is open, first close it and then perform "update controls" in a form which is open (from context menu, the last option is the Update User Controls.
Always save your program at regular steps of editing (when you are sure that is ok until then). I think I save the code very frequent, but this us never a bad idea.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by georgekar
So you have to adjust the start up object to sub main in Project Properties.
It seems like you could put it in Form_Initialize. That's raised before the form is loaded. It's the initialization of the COM/code portion of the form, which gets instantiated before the form is loaded.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
And DaveDavis, it's not going to be me that does the work to use another form of subclassing in Krool's controls. The main reason being that I'd hate to fork Krool's work like that. You'd be better off asking if he'd be interested in doing it.
Also, maybe use Krool's OCX. Yeah, once compiled, you shouldn't have any problems.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by Elroy
And DaveDavis, it's not going to be me that does the work to use another form of subclassing in Krool's controls. The main reason being that I'd hate to fork Krool's work like that. You'd be better off asking if he'd be interested in doing it.
Also, maybe use Krool's OCX. Yeah, once compiled, you shouldn't have any problems.
The reason are:
1. the OLEGuilds.tlb has conflicts (or confuses) with either olexp.tlb or 'Edanmo's OLE interfaces & fuctions V1.81". My UserControl used all three unfortunately.
2. I can't figure out what is the three bas are doing, they are complex for me.
3. The Subclass has less efficiencies (I could be wrong) than Paul or wqweto's Subclassing which can do subclassing On demand.
Re: Krool's CommonControls cut out for Onesie-Twosie use
I've tested almost all of the Subclass techniques except wqweto's Subclassing, but RC5/RC6.Subclass seems to use a similar technique to wqweto's Subclassing.
My conclusion is that as long as you use Subclassing, then you can never avoid IDE crashes.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by DaveDavis
The reason are:
1. the OLEGuilds.tlb has conflicts (or confuses) with either olexp.tlb or 'Edanmo's OLE interfaces & fuctions V1.81". My UserControl used all three unfortunately.
2. I can't figure out what is the three bas are doing, they are complex for me.
3. The Subclass has less efficiencies (I could be wrong) than Paul or wqweto's Subclassing which can do subclassing On demand.
oleexp.tlb is an expansion of olelib.tlb, and I didn't remove anything from the original, so there's no scenario where you'd need both. The newer versions of VBCCR I've seen are good about explicitly qualifying things to reduce conflicts... i.e. declaring interfaces as OLEGuids.IWhatever instead of just IWhatever. The API declares won't conflict because VB prioritizes locally declared versions over TLB-defined versions, so you shouldn't have a problem with VBCCR's subclassing; I use Krool's controls along side oleexp quite a bit and don't have any issues with it.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by SearchingDataOnly
My conclusion is that as long as you use Subclassing, then you can never avoid IDE crashes.
Boy, that statement needs a lot more context. I use subclassing all the time, and I virtually never crash the IDE. The primary time I crash the IDE is while actually developing a subclassing procedure, and I'm possibly not completely sure how to make some API calls within the subclass procedure itself. But, in normal development, with well debugged subclass procedures, I virtually never have problems, and I don't even use a thunk with my subclassing. But I do use the new comctl32 method of subclassing, and I do follow a few rules when I'm working with a project that contains subclassing.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by Elroy
Boy, that statement needs a lot more context. I use subclassing all the time, and I virtually never crash the IDE. The primary time I crash the IDE is while actually developing a subclassing procedure, and I'm possibly not completely sure how to make some API calls within the subclass procedure itself. But, in normal development, with well debugged subclass procedures, I virtually never have problems, and I don't even use a thunk with my subclassing. But I do use the new comctl32 method of subclassing, and I do follow a few rules when I'm working with a project that contains subclassing.
You should tell other people who use Krool's CommonControls how to never crash the IDE.
Re: Krool's CommonControls cut out for Onesie-Twosie use
IStorage and IStream have not been modified at all from olelib, so you can definitely use them with zero change to code besides changing olelib.IStorage to oleexp.IStorage (or just IStorage) and same for IStream.
Re: Krool's CommonControls cut out for Onesie-Twosie use
NOTICE: Krool has contacted me about a bug that needs to be fixed.
ADDED: Now fixed ... see Update notice on OP.
If you're using code from this thread downloaded prior to Jan 25, 2023 and you'd like this update, all that's necessary is that you download any of the above (post #1 thru #4) attachments, and replace the VTableHandle.bas module you're using with the one found in the attachment. It's the exact same file in all the attachments.
Last edited by Elroy; Jan 25th, 2023 at 10:59 AM.
Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by Elroy
NOTICE: Krool has contacted me about a bug that needs to be fixed.
ADDED: Now fixed ... see Update notice on OP.
If you're using code from this thread downloaded prior to Jan 25, 2023 and you'd like this update, all that's necessary is that you download any of the above (post #1 thru #4) attachments, and replace the VTableHandle.bas module you're using with the one found in the attachment. It's the exact same file in all the attachments.
Re: Krool's CommonControls cut out for Onesie-Twosie use
This is great and very helpful to have, however, I think something is being overlooked.
Either Krool needs to keep old releases around OR you should post the full archive exact version that these controls were taken from.
Here's my situation (I could see this happening to others as well), I need to use TabStrip and TreeView. You only have the TreeView. I don't blame you, you can't do everything, BUT the problem is that I am forced to use either the old common files with the new control or the new common files with the old. I don't want weird bugs that just pop out of nowhere, that stuff makes me itch especially when I know what the source of the problem is, but am powerless to fix it.
So I think it is necessary for people who develop controls to save some old versions.
Because the new version is getting bigger and bigger, but for many people, he may only need the most basic functions.
I used to do all these things. I need some modules or a single one of a dozen controls.
You can copy the main modules first and then add the missing APIs or other functions one by one.
Or use plug-ins to automatically delete other redundant files or codes inside.
It would also be nice if there was a way to precisely remove every line of redundant functions or constants from the API.
Previously, I also deleted the property page of a tab control.
In the end, the OCX control was reduced from 1.3mb to just over 700 KB.
Last edited by xiaoyao; Nov 14th, 2023 at 12:25 AM.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by DaveDavis
The reason are:
1. the OLEGuilds.tlb has conflicts (or confuses) with either olexp.tlb or 'Edanmo's OLE interfaces & fuctions V1.81". My UserControl used all three unfortunately.
2. I can't figure out what is the three bas are doing, they are complex for me.
3. The Subclass has less efficiencies (I could be wrong) than Paul or wqweto's Subclassing which can do subclassing On demand.
A project that uses all three TLB type libraries is even more complex.
Re: Krool's CommonControls cut out for Onesie-Twosie use
Originally Posted by xiaoyao
dbeaver,Recently, I found such a free MySQL administration tool.
The official website keeps dozens of old versions.
So I think it is necessary for people who develop controls to save some old versions.
What is the official website? I only found github and the forum posts. Github has releases built into it, but Krool is not using that feature as you can see the releases section of github is blank.
EDIT: I see you must be talking about the SQL tool, not the controls.
I just need to find what is the version that the OP got these controls from?
Re: Krool's CommonControls cut out for Onesie-Twosie use
The two official sources for VB6 are the thread here and GitHub. On GitHub you don't use releases but instead click on the green 'Code' button and 'Download ZIP'