|
I am converting a vb6 project to .net, slowly but surely. If the VB6 project I had a DLL we wrote, I add a reference in the VB6 program and wala I could use it.
I tried a similar thing in .net but I get a "Object reference not set to an instance of an object." when I try to call something in the dll.
I am not sure how to properly do this in VS2008, do I need to do some additional initialization? How would I do it if I wanted to debug the code of the DLL when I am running the secondary project? in VB6 I could point a reference to the VB project for the DLL, not sure how to do that either.
If it not a quick answer, can any one point me to a tutorial of some nature? Not quite what to google...
|
|
|
|
|
Without seeing the code that's throwing the exception, it's pretty difficult to tell you what went wrong.
But, you only get that message when you try to use a variable that contains null (Nothing in VB).
The whole process is really not very different than it was in VB6.
|
|
|
|
|
Assuming your DLL contains native code, you would need P/Invoke to call that from a managed language such as C# or VB.NET; here is an article that should get you on the right track: pinvoke1[^].
I suggest you start with the simplest call available in the DLL, and learn the techniques step by step.
|
|
|
|
|
I have been compiling applications for years in VB6 (i know, in process of converting to .net) but anyway.. I update the exe, zip it and email to to someone... been doing this for many many years.
I compiled a couple in the last few days and tried to send them through outlook. (I zip them first). Outlook seems fit to strip the file from my message claiming it has a virus.
my computer is . er uh, ahem.... managed by the company, which means regular scanning, constant virus updates every windows update ever created, all 1000+ of them and so-on, so I would really be surprised if I did indeed have a virus.
Their solution was to run "superAntiSpyware" scan, which seems to pick out a few other of my applications (I have hundreds) as being infected by Trojan.agent/GenBancos. Many of the ones it seems to think are infected are over 10 years old, so I am thinking false positive on them. It does not pick up any on the applications I have tried sending the last couple days.
Has anyone ever heard of or is it possible to compile a virus into an application unknowingly? (i.e. a virus lurking and attached itself to the file when I compile?) If so, given that my computer is scanned daily with virus definitions updated almost as regularly, how likely is this to be the issue?
or am I getting jerked around by outlook and the glorious support staff?
|
|
|
|
|
Sounds like false positives to me.
Why is common sense not common?
Never argue with an idiot. They will drag you down to their level where they are an expert.
Sometimes it takes a lot of work to be lazy
Please stand in front of my pistol, smile and wait for the flash - JSOP 2012
|
|
|
|
|
Either you have written a virus or your company email policy / spyware program seems to have been changed suddenly.
|
|
|
|
|
Those are false positive results by their virus scanner. That's nothing unusual. Talk to the manufacturer of their virus scanner.
|
|
|
|
|
thanks all for your comments, that is about what I was thinking
|
|
|
|
|
Is there a way that I can fire an event when the user scrolls to the end of the flowlayoutpanel? if so then can you please tell how to do it?
just a quick note: I am using the autoscroll/horizontal scrollbar.
Algorithm:
If scroll.value = endofthispage then
msgbox("You are at the end of this page")
else
'do nothing
end if
|
|
|
|
|
Hey,
there is a scroll event for controls. see this[^] for info and how to get/use it.
Nick
|
|
|
|
|
So I tried to do something like that today.
If e.NewValue = e.OldValue Then
MsgBox("hi")
End If
but it is not working the way I want it to work... The problem is that now if I click the arrows on the scroll bar, then only it works, if I use the (bar) *not the left/top right/bottom arrows, it shows the message box like 100x times. but even then I am having a problem. the problem is that, when I scroll back to the beginning, it shows that message box again.
|
|
|
|
|
Perhaps its not as MS once intended it. or perhaps it is...but the scrolling and value changed are two differed events.
if you press one of the scrolls arrows the program will make it scroll in that direction once. and then change the value. but when you drag the bar you scroll every time you move a little...but the value is only changed upon the key release.
a easy thing to do is to declare a private boolean (outside the event). and switch it true/false so the message box only displays once.
Private ScrollingMessage as Boolean = true
If e.NewValue = e.OldValue and ScrollingMessage Then
MsgBox("hi")
ScrollingMessage = false
elseif e.NewValue <> e.OldValue then
scrollingmessage = true
End If
|
|
|
|
|
yeah but this still causes the issue of 100x message boxes that are displayed when I use the bar instead of the arrows.
Edit:
And the issue of back scroll is still there..
|
|
|
|
|
Oke started a little project to test a bit around and i think you might find this interesting. i used a form called form1. and placed a listbox on it i called txtscroll.
I suggest you make a same sort of window and paste the following code in to see how it works:
Public Class Form1
Dim WithEvents scrollhandler As MyListener
Private scrolled As Boolean = False
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim index As Int32 = 0
Do While index < 100
txtscroll.Items.Add(index.ToString())
index += 1
Loop
scrollhandler = New MyListener(txtscroll)
End Sub
Private Sub scrollhandler_MyScroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles scrollhandler.MyScroll
End Sub
Private Sub txtscroll_MouseWheelScroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtscroll.MouseWheel
scrollhandler_MyScroll(e, e)
End Sub
Private Class MyListener
Inherits NativeWindow
Public Event MyScroll(ByVal sender As Object, ByVal e As EventArgs)
Const WM_MOUSEACTIVATE = &H21
Const WM_MOUSEMOVE = &H200
Private control As Control
Public Sub New(ByVal control As Control)
AssignHandle(control.Handle)
End Sub
Protected Overrides Sub WndProc(ByRef Messageevent As Message)
Const WM_HSCROLL = &H114
Const WM_VSCROLL = &H115
If Messageevent.Msg = WM_HSCROLL Or Messageevent.Msg = WM_VSCROLL Then
RaiseEvent MyScroll(control, New EventArgs)
End If
MyBase.WndProc(Messageevent)
End Sub
Protected Overrides Sub Finalize()
ReleaseHandle()
MyBase.Finalize()
End Sub
End Class
End Class
|
|
|
|
|
Thanks for the example. but I still can't figure out how I can use this to know if the user has scrolled to the end.
|
|
|
|
|
hmm, oke im not really sure why you want to show that messagebox. but I thrown in some more trail and error and i came up with the code below. Note that I ran a little low on time so its a bit of a mess...i recommend throwing in a breakpoint to figure out exactly how the code works before putting it into your project. to test it again make a form (called form1) and add a listbox (txtscroll) in it. then copy paste the code into your form.
Imports System.Runtime.InteropServices
Public Class Form1
Dim WithEvents scrollhandler As MyListener
Private scrolled As Boolean = False
Private maxscroll As Int64
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function GetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer) As Integer
End Function
<DllImport("user32.dll")> _
Private Shared Function SetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer, ByVal nPos As Integer, ByVal bRedraw As Boolean) As Integer
End Function
Private Const SB_HORZ As Integer = &H0
Private Const SB_VERT As Integer = &H1
Public Property HScrollPos() As Integer
Get
Return GetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_HORZ)
End Get
Set(ByVal value As Integer)
SetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_HORZ, value, True)
End Set
End Property
Public Property VScrollPos() As Integer
Get
Return GetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_VERT)
End Get
Set(ByVal value As Integer)
SetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_VERT, value, True)
End Set
End Property
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim index As Int32 = 0
Do While index < 1000
txtscroll.Items.Add(index.ToString())
index += 1
Loop
maxscroll = index - 18
scrollhandler = New MyListener(txtscroll)
End Sub
Private Sub scrollhandler_MyScroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles scrollhandler.MyScroll
If VScrollPos = maxscroll And scrolled Then
MessageBox.Show("you reached the max on the verticle scrollbar!", "yay")
scrolled = False
ElseIf VScrollPos < maxscroll Then
scrolled = True
End If
End Sub
Private Sub txtscroll_MouseWheelScroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtscroll.MouseWheel
scrollhandler_MyScroll(e, e)
End Sub
Private Class MyListener
Inherits NativeWindow
Public Event MyScroll(ByVal sender As Object, ByVal e As EventArgs)
Const WM_MOUSEACTIVATE = &H21
Const WM_MOUSEMOVE = &H200
Private control As Control
Public Sub New(ByVal control As Control)
AssignHandle(control.Handle)
End Sub
Protected Overrides Sub WndProc(ByRef Messageevent As Message)
Const WM_HSCROLL = &H114
Const WM_VSCROLL = &H115
If Messageevent.Msg = WM_HSCROLL Or Messageevent.Msg = WM_VSCROLL Then
RaiseEvent MyScroll(control, New EventArgs)
End If
MyBase.WndProc(Messageevent)
End Sub
Protected Overrides Sub Finalize()
ReleaseHandle()
MyBase.Finalize()
End Sub
End Class
End Class
EDIT: oh before i forget it: the maximum of your scroll bar is calculated by the total amount of items - the amount of items that can be displayed without a scroll bar
modified 2-Jul-12 4:52am.
|
|
|
|
|
Did you test the code...?
Well... Because the above didn't work for me. I made a test project to see how it works. but it didn't show me any message...
|
|
|
|
|
Did you recalculate the max value of your scrollbar? if your listbox is of a differed size then mine (witch it probably is) you have to recalculate it.
just run the program. dont scroll and see how many items fit into the listbox (for me that where 18). you want to do the index - [the number you found]. after that it should work.
maxscroll = index - 18
|
|
|
|
|
Oh that kinda worked... but how am I ganna calculate the value in a control like this one:
When its normal screen size:
http://foto.pk/images/minx.png[^]
When its maximized:
http://foto.pk/images/maxx.png[^]
-------------------------------------------------------------
Btw. You asked why would I want to know this value before...
Answer) I don't actually want to show users "yay u reached the bottom" lol. I want the program to get more tweets when it reaches there.
The above that I am making is a v2 of my current twitter client called TRocket.
TRocket - Twitter Client [Open Source][^]
|
|
|
|
|
How do you fill the listbox? with a loop or a data binding?
EDIT:
oke something just shot to my mind. the items you add to your listbox are controls right? i forgot the object name but i've seen the code of those. this means they have a fixed sized right? you could calculate how much fit into your listbox if you read out the length and hight of it.
lets say for example your listbox is 300 pixels wide and 400 pixels high. your controls are 100 wide and 50 high. this would mean you can fit 3 rows of each 8 items = 24 items without scroll bar. so in a 'math' way:
[ammount of items] - (math.floor([with_listbox]/[with_control])+math.floor([hight_listbox]/[hight_control])) = maximum scroll value
-------------------
Ah oke, yea now its making sense and i already figured it was for Trocket (read the thread about it) when i was helping you with a previous question.
|
|
|
|
|
|
Private Function CalculateMaxScrollValue(ByVal totalitems As Int64, ByVal controlhight As Int32, ByVal controlwith As Int32)
Return totalitems - (Math.Floor(controlwith / 482) * Math.Floor(controlhight / 114))
End Function
Add that function to your code to find the max scroll value.
Use that in combination with the code i send you in the previous posts in this topic. replace the txtscroll with the flowlayoutpanel1 and it should work (cant test it here).
as a side note: you might want to fine tune the if/else of mine a little to a "<" instead of "=". giving a exact value to a 'analog' control gives it a small change to trigger. also it seems like the program is single threaded. i don't know how long it takes to load those messages but your interface will hang (not responding ect) till the load is complete. looking into threading might be interesting.
|
|
|
|
|
Err my laptops fan got fried - is at the repair shop. - sorry for the late reply...
Anyway. So you mean I should just call this function on load? and replace the maxscroll = index - 18 on load?
|
|
|
|
|
Hey,
Sorry for my late response. I unfortunately fell ill.
to get back to your question: No, you call that function every time after the amount of items in your flowlayoutpanel changes.
|
|
|
|
|
so all the code needs to be same. but what should I do with:
maxscroll = index - 18 ?
the index property was giving an error in flowlayoutpanel. can you give me the example on the same code
or better on the project its self.. :
Imports System.Runtime.InteropServices
Public Class Form1
Dim WithEvents scrollhandler As MyListener
Private scrolled As Boolean = False
Private maxscroll As Int64
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function GetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer) As Integer
End Function
<DllImport("user32.dll")> _
Private Shared Function SetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer, ByVal nPos As Integer, ByVal bRedraw As Boolean) As Integer
End Function
Private Const SB_HORZ As Integer = &H0
Private Const SB_VERT As Integer = &H1
Public Property HScrollPos() As Integer
Get
Return GetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_HORZ)
End Get
Set(ByVal value As Integer)
SetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_HORZ, value, True)
End Set
End Property
Public Property VScrollPos() As Integer
Get
Return GetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_VERT)
End Get
Set(ByVal value As Integer)
SetScrollPos(DirectCast(txtscroll.Handle, IntPtr), SB_VERT, value, True)
End Set
End Property
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim index As Int32 = 0
Do While index < 1000
txtscroll.Items.Add(index.ToString())
index += 1
Loop
maxscroll = index - 18
scrollhandler = New MyListener(txtscroll)
End Sub
Private Sub scrollhandler_MyScroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles scrollhandler.MyScroll
If VScrollPos = maxscroll And scrolled Then
MessageBox.Show("you reached the max on the verticle scrollbar!", "yay")
scrolled = False
ElseIf VScrollPos < maxscroll Then
scrolled = True
End If
End Sub
Private Sub txtscroll_MouseWheelScroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtscroll.MouseWheel
scrollhandler_MyScroll(e, e)
End Sub
Private Class MyListener
Inherits NativeWindow
Public Event MyScroll(ByVal sender As Object, ByVal e As EventArgs)
Const WM_MOUSEACTIVATE = &H21
Const WM_MOUSEMOVE = &H200
Private control As Control
Public Sub New(ByVal control As Control)
AssignHandle(control.Handle)
End Sub
Protected Overrides Sub WndProc(ByRef Messageevent As Message)
Const WM_HSCROLL = &H114
Const WM_VSCROLL = &H115
If Messageevent.Msg = WM_HSCROLL Or Messageevent.Msg = WM_VSCROLL Then
RaiseEvent MyScroll(control, New EventArgs)
End If
MyBase.WndProc(Messageevent)
End Sub
Protected Overrides Sub Finalize()
ReleaseHandle()
MyBase.Finalize()
End Sub
End Class
End Class
|
|
|
|