[VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
This is the ActiveX Control version that comes out of the Std-EXE version.
Current version: 1.7.32
The development state of the ActiveX Control version does not necessarily match to the Std-EXE version.
That comes because the Std-EXE version is the "leading source" and the ActiveX Control version is derived from the Std-EXE version after a certain time.
Reason why is that it is not practicable to release a new ActiveX Control after each new feature.
However, certain bugfixes can and will be implemented into the current ActiveX Control version. (Revision)
It is not recommended to use the source code to compile another binary.
If own modification is necessary please rename the library to avoid redundancies.
The source code of the project can also be viewed on GitHub.
All controls are marked as "Safe for Initialization and Scripting" by the IObjectSafety interface.
Also everything is 100% IDE-Safe.
Here is a solution to use the VBFLXGRD17.OCX Registration-Free. (Side-by-side)
Keep in mind that this technology needs at minimum Windows XP SP2 or Windows Server 2003.
Tutorial:
The "Development" machine needs to register the VBFLXGRD17.OCX as usual and use the components for e.g. in a Std-EXE project.
The source project needs to include the Side-by-side resources. (see below)
Then on the "End user" machine you only need the VBFLXGRD17.OCX and the .exe (Std-EXE project) on the same folder.
It will work then without any registration.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Hello Krool,
I have just downloaded and tried your VBFlexGrid
It is nice!
However, using late-binding slows down the grid performance drastically compared to MSFlexGrid
May I know the reason behind it? Also, what can be done to improve speed?
The following code takes about 10 seconds to execute.( 10 times more than MSFlexGrid)
Code:
Dim objGrid As Object
Dim w as Long
Set objGrid = VBFlexGrid1 'Grid added in design
With objGrid
.Rows = 5000
.Cols = 50
For i = 0 To 4999
For j = 0 To 49
w = objGrid.ColWidth(j)
Next j
Next i
End With
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Yes, I did
Here is the report of time taken in seconds for early bound and late bound VBFlexGrid and MSFlexGrid as in the code snippet below
Case1: VBFlexGrid (early bound), time = 7.271313 s
Case2: MSFlexGrid (early bound), time = 6.834063 s
Case3: VBFlexGrid (late bound), time = 20.11294 s
Case4: MSFlexGrid (late bound), time =7.252 s
Code:
Dim objGrid As VBFlexGrid ' Case1
'Dim objGrid As MSFlexGrid ' Case2
'Dim objGrid As Object ' Case3
'Set objGrid = VBFlexGrid1 ' Case3
'Dim objGrid As Object ' Case4
'Set objGrid = MSFlexGrid1 ' Case4
Dim s as String
With objGrid
.Rows = 5000
.Cols = 50
For i = 0 To 4999
For j = 0 To 49
s = objGrid.TextMatrix(i,j))
Next j
Next i
End With
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Hi Krool,
I have checked the new update. It is really good
The new sort options and the row/column autofit features are awesome and very useful
I have also checked the speed for the late bound grid in the latest update. It is found to be same as the previous update. We have managed to use early bound VBFlexGrid for now. Any improvements in speed for the late bound grid would be of great use for our requirements here.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Hi Krool,
I would like to replace C1 vsFlexGrid (that I use for years) with your VBFlexGrid as it seems to be up there with it.
In vsFlexGrid I'm able to "replace" the standard EditWindow with a DateTimePicker by catching the StartEdit event and turn a previously created DTPicker visibility on, right over the cell (StartEdit is called with Row, Col, and Cancel parameters).
I see that the event StartEdit doesn't exist in VBFlexGrid, thought there is a method with the same name. Will I be able to create a similar behavior with VBFlexGrid?
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
still amazed on how VB6 still popular out there, and still many support additional control. like me. I am one of VB6 programmer and really appreciate this kind of thread..keep it up
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by smileyoufucn
Can I add the attribute "GetColIndex" Property?
Public Property Get GetColIndex(ByVal Key As String) As Long 'Add
''''''''
End Property 'Add
There is already a ColIndex property available which just does what you suggested with your "GetColIndex".
Code:
Public Property Get ColIndex(ByVal Key As String) As Long
Originally Posted by Carlos Rocha
I would like to replace C1 vsFlexGrid (that I use for years) with your VBFlexGrid as it seems to be up there with it.
In vsFlexGrid I'm able to "replace" the standard EditWindow with a DateTimePicker by catching the StartEdit event and turn a previously created DTPicker visibility on, right over the cell (StartEdit is called with Row, Col, and Cancel parameters).
I see that the event StartEdit doesn't exist in VBFlexGrid, thought there is a method with the same name. Will I be able to create a similar behavior with VBFlexGrid?
You can catch the BeforeEdit event (EditWindow not yet created) and set Cancel = True and turn on your own DTPicker.
If you catch EnterEdit event it's already too late as EditWindow is created.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
You can catch the BeforeEdit event (EditWindow not yet created) and set Cancel = True and turn on your own DTPicker.
If you catch EnterEdit event it's already too late as EditWindow is created.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
i have not use this grid before, right now i am focusing on LynxGrid, I tried your Grid before, but somehow the flexibility perhaps add ability for combobox to cell
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by jedifuk
i have not use this grid before, right now i am focusing on LynxGrid, I tried your Grid before, but somehow the flexibility perhaps add ability for combobox to cell
The following combo modes are available in VBFlexGrid:
FlexComboModeNone (only EditWindow)
FlexComboModeDropDown (DropDownList)
FlexComboModeEditable (DropDownCombo)
FlexComboModeButton (Custom)
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
@aklougbo you should have started your own thread for asking something which is not really related to your question.
XtremeVBTalk is gone, no one knows why.
There was no time for admins/mods to save the code libraries, everything is just gone.
Anything specific you needed or wanted from that thread?
The Internet Archive, Wayback Machinee saved parts
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by Krool
The following combo modes are available in VBFlexGrid:
FlexComboModeNone (only EditWindow)
FlexComboModeDropDown (DropDownList)
FlexComboModeEditable (DropDownCombo)
FlexComboModeButton (Custom)
waoww..never know about this, i am using lynxgrid for my app, might switch to vbflexgrid, last thing...vbflexgrid support filter (I supposed so), but i meant filterbar on top of grid, similar to componentone tdgbrid ...thanks
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by Krool
The following combo modes are available in VBFlexGrid:
FlexComboModeNone (only EditWindow)
FlexComboModeDropDown (DropDownList)
FlexComboModeEditable (DropDownCombo)
FlexComboModeButton (Custom)
i couldn't find any documentation or example regarding VBFlexGrid, any information ?
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by Arnoutdv
@aklougbo you should have started your own thread for asking something which is not really related to your question.
XtremeVBTalk is gone, no one knows why.
There was no time for admins/mods to save the code libraries, everything is just gone.
Anything specific you needed or wanted from that thread?
The Internet Archive, Wayback Machinee saved parts
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by jedifuk
i couldn't find any documentation or example regarding VBFlexGrid, any information ?
If you can read the first post you would notice that there is also a Std-EXE version.
In that thread (first post) is a demo project showing the editing feature in one sub-form of the demo project.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by Krool
If you can read the first post you would notice that there is also a Std-EXE version.
In that thread (first post) is a demo project showing the editing feature in one sub-form of the demo project.
waoww...what a dumb i am..might check this right away..
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by Krool
If you can read the first post you would notice that there is also a Std-EXE version.
In that thread (first post) is a demo project showing the editing feature in one sub-form of the demo project.
waoww...what a dumb i am..might check this right away..
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
From Object Browser, VBFLXGRD14.OCX v. 1.4.0.35
Code:
Event ValidateEdit(Cancel As Boolean)
Member of VBFLXGRD14.VBFlexGrid
Occurs before any changes made by a user are committed to a cell. If the validation fails the changes will be discarded and the control will remain in edit mode.
Am I wrong in assuming that this means that when Cancel is set to 'True' in this event that the originally changed value will be restored in the cell, or this is something I have implement myself?
Or maybe I am doing this the wrong or invalid way or is this scenario a bug? This is my scenario:
In the event I check the value in flexgrd.EditText and if not withing a certain range I fire a dialog to ask for a Yes/No confirmation, and if no I set Cancel = True. However, the value in the grid cell remain as the changed value, and the cell is no longer in EditMode. This is my validation code:
Code:
Private Sub grdPlanVals_ValidateEdit(Cancel As Boolean)
Dim X As Long
With grdPlanVals
X = Val(.EditText)
Select Case X
Case 1 To 6
Case Else
Dim cTaskDlg As cTaskDialog
Set cTaskDlg = New cTaskDialog
If X > 6 Then
'"Are you sure this is correct?"
'"Not recommended value"
'"This is a very large value"
If cTaskDlg.SimpleDialog(cLang.GetString(2002), TDCBF_YES_BUTTON Or TDCBF_NO_BUTTON, cLang.GetString(2001), cLang.GetString(2026), TD_WARNING_ICON, Me.hwnd) <> TDCBF_YES_BUTTON Then
Cancel = True
End If
Else
'"Are you sure this is correct?"
'""Not recommended value"
'"This value will eliminate the use of this planet"
If cTaskDlg.SimpleDialog(cLang.GetString(2002), TDCBF_YES_BUTTON Or TDCBF_NO_BUTTON, cLang.GetString(2001), cLang.GetString(2000), TD_WARNING_ICON, Me.hwnd) <> TDCBF_YES_BUTTON Then
Cancel = True
End If
End If
End Select
.HighLight = flexHighlightNever
If Not Cancel Then
mIsDirty = True
gpv(.EditRow) = X
End If
End With
End Sub
I also have code in the BeforeEdit event, the goal here is to prevent the user from edit unless he/she is double clicking in a cell that isn't in the first (fixed) column. Removing that code doesn't seem to have any impact on my issue though.
Code:
Private Sub grdPlanVals_BeforeEdit(Row As Long, Col As Long, ByVal Reason As VBFLXGRD14.FlexEditReasonConstants, Cancel As Boolean)
'If Not CBool(Col) Or Not (Reason = FlexEditReasonDblClick) Then Cancel = True
If Not CBool(Col) Then
Cancel = True
Else
If Not (Reason = FlexEditReasonDblClick) Then
Cancel = True
End If
End If
End Sub
M$ vs. VB6 = The biggest betrayal and strategic mistake of the century!?
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
@7edm, add the normal Validate handler too, like below.
Code:
Private Sub VBFlexGrid1_Validate(Cancel As Boolean)
' This must be handled when validation of the edit control should be for the whole form.
If VBFlexGrid1.hWndEdit <> 0 Then Call VBFlexGrid1_ValidateEdit(Cancel)
End Sub
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Unfortunately, that didn't change anything. I even tried with commenting out the dialog part and simply set 'Cancel = True' if the edited value was out of range, also tried to remove the 'BeforeEdit' event, no change. No button on the form have nether Default or Cancel set to True.
This is the full code I have in the grid events:
Code:
Private Sub grdPlanVals_BeforeEdit(Row As Long, Col As Long, ByVal Reason As VBFLXGRD14.FlexEditReasonConstants, Cancel As Boolean)
'If Not CBool(Col) Or Not (Reason = FlexEditReasonDblClick) Then Cancel = True
If Not CBool(Col) Then
Cancel = True
Else
If Not (Reason = FlexEditReasonDblClick) Then
Cancel = True
End If
End If
Debug.Print "BeforeEdit = Reason: " & CStr(Reason)
Debug.Print "BeforeEdit = Text: " & CStr(grdPlanVals.Text)
End Sub
Private Sub grdPlanVals_CellClick(ByVal Row As Long, ByVal Col As Long, ByVal Button As Integer)
With grdPlanVals
If Col = 1 Then
.HighLight = flexHighlightAlways
End If
End With
End Sub
Private Sub grdPlanVals_EditKeyPress(KeyChar As Integer)
Select Case KeyChar
Case 8, 13, 47 To 58
KeyChar = KeyChar
Case Else
KeyChar = 0
End Select
End Sub
Private Sub grdPlanVals_Validate(Cancel As Boolean)
' This must be handled when validation of the edit control should be for the whole form.
If grdPlanVals.hWndEdit <> 0 Then Call grdPlanVals_ValidateEdit(Cancel)
End Sub
Private Sub grdPlanVals_ValidateEdit(Cancel As Boolean)
Dim X As Long
With grdPlanVals
Debug.Print "ValidateEdit = EditText: " & .EditText
X = Val(.EditText)
Debug.Print "ValidateEdit = EditRow: " & CStr(.EditRow)
Select Case X
Case 1 To 6
Case Else
Dim cTaskDlg As cTaskDialog
Set cTaskDlg = New cTaskDialog
If X > 6 Then
'This is a very large value
'Re-enter value if this is an error
If cTaskDlg.SimpleDialog(cLang.GetString(2002), TDCBF_YES_BUTTON Or TDCBF_NO_BUTTON, cLang.GetString(2001), cLang.GetString(2026), TD_WARNING_ICON, Me.hwnd) <> TDCBF_YES_BUTTON Then
Cancel = True
End If
Else
'Zero Value will eliminate this aspect
'Re-enter value if this is wrong
If cTaskDlg.SimpleDialog(cLang.GetString(2002), TDCBF_YES_BUTTON Or TDCBF_NO_BUTTON, cLang.GetString(2001), cLang.GetString(2000), TD_WARNING_ICON, Me.hwnd) <> TDCBF_YES_BUTTON Then
Cancel = True
End If
End If
End Select
.HighLight = flexHighlightNever
Debug.Print "ValidateEdit = Cancel: " & CStr(Cancel)
Debug.Print "ValidateEdit = EditRow: " & CStr(.EditRow)
Debug.Print "ValidateEdit = EditText: " & .EditText
Debug.Print "ValidateEdit = Text: " & CStr(.Text)
If Not Cancel Then
mIsDirty = True
'gpv(.EditRow) = X 'was aspno
End If
End With
End Sub
And as you see I have put some Debug statements in there, and here are the result of these:
As you can see, the cell text value before edit is 5, I change it to 8, which gets rejected in the validate event, but cell text value still remains at 8, not reset back to 5 as expected.
Please let me know if you need some other info. Maybe I also should mention that this previously was a MSFlexGrid control and I upgraded it by open the form in a text editor, remove the MSFlexGrid Object reference and added
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Sorry, still no go :-( but let me stress or put a few things into focus:
I don't think this issue is related to the bugfix you just did in ValidateEdit, because it's not dependent of if a mesagebox is shown or not, when changing my code above to this
Code:
Private Sub grdPlanVals_ValidateEdit(Cancel As Boolean)
Dim X As Long
With grdPlanVals
Debug.Print "ValidateEdit = EditText: " & .EditText
X = Val(.EditText)
Debug.Print "ValidateEdit = EditRow: " & CStr(.EditRow)
Select Case X
Case 1 To 6
Case Else
Cancel = True
' Dim cTaskDlg As cTaskDialog
'
' Set cTaskDlg = New cTaskDialog
'
' If X > 6 Then
'
' 'This is a very large value
' 'Re-enter value if this is an error
' If cTaskDlg.SimpleDialog(cLang.GetString(2002), TDCBF_YES_BUTTON Or TDCBF_NO_BUTTON, cLang.GetString(2001), cLang.GetString(2026), TD_WARNING_ICON, Me.hwnd) <> TDCBF_YES_BUTTON Then
' Cancel = True
' End If
'
' Else
'
' 'Zero Value will eliminate this aspect
' 'Re-enter value if this is wrong
' If cTaskDlg.SimpleDialog(cLang.GetString(2002), TDCBF_YES_BUTTON Or TDCBF_NO_BUTTON, cLang.GetString(2001), cLang.GetString(2000), TD_WARNING_ICON, Me.hwnd) <> TDCBF_YES_BUTTON Then
' Cancel = True
' End If
' End If
End Select
.HighLight = flexHighlightNever
Debug.Print "ValidateEdit = Cancel: " & CStr(Cancel)
Debug.Print "ValidateEdit = EditRow: " & CStr(.EditRow)
Debug.Print "ValidateEdit = EditText: " & .EditText
Debug.Print "ValidateEdit = Text: " & CStr(.Text)
If Not Cancel Then
mIsDirty = True
'gpv(.EditRow) = X 'was aspno
End If
End With
End Sub
I still get the same result. Let me repeat, with some detail what happens:
I double click on a sell to put it in edit mode. This highlights the current value (5 in this case) and I type to change it to 8.
I then press Enter and this fires the ValidateEdit event, where the value 8 is considered to be outside of allowed range, and
Code:
Cancel = True
The cell value does not switch back to its original value of 5 but stay at 8, and the cursor and focus seems to stay in the cell.
I note one significant different when looking at and comparing the Debug messages in the code above, they have changed and it seems like the validate event fires twice actually.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
It is intended that a Cancel = True on ValidateEdit event will only keep your cursor or mouse in the cell, giving the user a chance to amend current input.
It's your choice to call .CancelEdit or resetting the text and remain in edit mode, .EditText = .Text in the event.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Hi Krool, You who are an expert in user control believe that your user control:
You can add properties such as:
1.- Sort in ascending and descending order by clicking on the column header.
2.- Add an Extendedlastcol similar to that of VsFlexgrid8.
3.- Add some function so that the grid at runtime or design time acquires the Windows theme regardless of the version.
4.- That the selected row is Windows 7 style.
Re: [VB6] ActiveX VBFlexGrid (Replacement of the MSFlexGrid control)
Originally Posted by R.J. Dunnill
It would work in 32-bit Excel but not 64-bit Excel. At least until I finish porting it.
I have 32-bit Excel, but how do I go about adding and using it? I added a reference to the ocx and tlb but cannot see a control to add to the palette in the form builder. What are the steps please?