I am having difficulty sorting a custom class based collection on two fields and am wondering if anyone can assist me. I have a class that looks like so:
ClassmyClassprivate ID asStringprivate Name asStringprivate TK asStringprivate Di asStringprivate M asStringEndClass
Using this class i add to a Collection a number of items, e.g.
Private colClass As Collection
Private clsTheClass AsmyClassSet colClass = New Collection
Set clsTheClass = NewmyClass
clsTheClass.Name = "A"
clsTheClass.TKs = "100"
clsTheClass.Di = "5"
clsTheClass.ID = "1"
clsTheClass.M = "9"
What i end up with it is a collection that looks like so after adding all the items:
ID |Name |TK |Di |M
1 A 100592 B 100393 C 10594 D 10795 E 10196 F 400957 F 40045
I need to sort the collection On TK, and then DI. That should make the collection look like this:
ID |Name |TK |Di |M
6 F 400957 F 400451 A 100592 B 100394 D 10793 C 10595 E 1019
I am currently using this method to sort on TK, but i cannot get it to work how i need the output:
PublicSub SortCollection(ColVar As Collection)
Dim oCol As Collection
Dim i AsIntegerDim i2 AsIntegerDim iBefore AsIntegerIfNot (ColVar IsNothing) ThenIf ColVar.Count > 0ThenSet oCol = New Collection
For i = 1To ColVar.Count
If oCol.Count = 0Then
iBefore = 0For i2 = oCol.Count To1Step -1
IfCLng(ColVar(i).TK) < CLng(oCol(i2).TK) Then
iBefore = i2
ElseExitForEndIfNextIf iBefore = 0Then
oCol.Add ColVar(i), , iBefore
EndIfEndIfNext'WE now have it sorted by TK in Asc order so we need to reverse it'Reverse the collectionDim MyNewCol AsNew Collection
Dim obj AsObjectForEach obj In oCol
If MyNewCol.Count > 0Then
MyNewCol.Add Item:=obj, before:=1
EndIfNextSet ColVar = MyNewCol
Set oCol = NothingEndIfEndIfEndSub
Anyone got any pointers as to what i need to change in the sort routine?
Whenever I sort, I find the largest, or the least first and set the value to "x". From there I work up, or down assigning to a temp object, collection or array, and replacing "x" as the largest each time.
x = 0
for each item in collection
if item > x then
x = item
This gets the largest to begin.
while tempcollection.count isnot collection.count
for each item in collection
set x if the item is less than the last in tempcollection and is not less than x
That is a level one sort, but you should be able to expand to code easily enough. Sorry that I lack any time, or I would have done it for you!
You could implement the IComparable interface in your class, and then define the CompareTo function. Put your comparison logic in this CompareTo function. Then all you would need to do is call the Sort method on your collection.
Read this article and maybe you'll be able to work around the problem.
Also, setting the WindowState for a form that doesn't exist yet won't work, which has also been mentioned elsewhere.
"The problem with dotnet smartdevice forms is, that using FormState in the Forms constructor has no effect. As the contructor is called, you cannot alter the formstate, you have to use a schedule to set the formstate to Minimized. Or, better, do not use a form at all."
Ignoring the project type does your IDE have the same layout/windows as Figure 3 here?
If you look at the bottom right-hand corner that's where you'll see it.
Sorry I can't find a better example on msdn site, they've taken dowm a lot of the WinCE VB stuff, but using VS2008 doesn't help either. I don't have VS2008 installed right now, but I'll try and sort something out so that I can see what/where the problem lies.
"It's true that hard work never killed anyone. But I figure, why take the chance." - Ronald Reagan
I have an interesting problem (Interesting to me, anyway ).
I have a form loading, and in the process, an RTB is being loaded with a really super long RTF string. In the process, I get the ContextSwitchDeadlock message box. Now, from what I can gather, it seems to be telling me that system requests have not been able to be carried out for at least 60 seconds while the string is being loaded, and the message is telling me that you can't expect to be able to do anything else while that is going on, AND there may be an evergrowing queue of system tasks that have been put off until the string finishes loading. If this is true, I imagine I am getting the message because this is not a case where DoEvents() would be of any help...As the RTB is being loaded with the string, all of that activity is not code that a DoEvents() line can be inserted into.
So I started looking around, and discovered talk about message pumps (message loops), but no great information on them in general. So my question is, is a message pump what I need, and if so, how do I implement such a thing?
Your app already has a message pump. It always runs on the UI thread (startup thread) and it's the little bugger that triggers that message "Not responding" when your code blocks the UI thread and the message pump can't be processed because of it.
The message you're getting is because COM interop happens through the message pump. You app is using a COM-based component (whether you know it or not) and COM message are not being processed because the message pump is prevented from running by your extremely long running operating (the RTF load).
Adding a second message pump isn't going to accompish anything because it also will be blocked.
The good news is that message only appears when running the code under the debugger. Even better, you can disable it in your app.config. See this[^].
THe better solution would be to NOT load such a massive document into the RTB.
I was trying add current date to a textbox in the current control when a user press something like Alt+D. I used an example from this Article: Setting A Global Hot Key I modified the code to something like this:
ProtectedOverridesSub WndProc(ByRef msg As System.Windows.Forms.Message)
'We only care about hotkey messagesCase ForcHotKey.WM_HOTKEY
'if this is our hotkey and the ActiveControl from the ActiveForm is a textbox, Insert the current date.IfCShort(msg.WParam) = m_HotkeyID ThenIfTypeOf (Me.ActiveForm.ActiveControl) Is TextBox ThenMe.ActiveForm.ActiveControl.Text = Me.ActiveForm.ActiveControl.Text.Insert(Me.ActiveForm.ActiveControl.Text.Length, DateTime.Now.ToShortDateString)
'move the cursor to endDim tb As TextBox
tb = Me.ActiveForm.ActiveControl
EndIfEndIfExitSelectCaseElse'pass it back to main WndProcMyBase.WndProc(msg)
All I have to do is to register the hotkey in the main MDI Form. No matter which form I'm at, while typing in the textbox whenever I press hotkey I get the current date.