|
Yazid Aura Robbani wrote: 1 more question friend, I've made a traditional calendar using VB6 and everything goes well, the problem arises when I want to change it to VB2010 express, I've been try to converting the code with my Knowledge and some converting tools, but still stuck with it, because I'm a Newbie in VB2010.
Post the piece that's giving problems and we'll take a look
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Components :
1 Form
2 Modules
1 MSFlexGrid (optional, can use Listview or GridView)
2 ComboBox
How to convert this to VB 2010 Express
Here my old VB6 codes:
<pre lang="vb">
Dim ahari
Dim shari As String
Dim l As Single
Dim l1 As Single
Dim CekTanggal As Boolean
Dim HariIni As Boolean
Public TextTanggalSekarang As String
Const MaxTahun = 2099, MinTahun = 1901
Private Sub CmbTahun_Click()
If CekTanggal = False Then
Exit Sub
End If
TampilkanTanggal
End Sub
Private Sub CmbBulan_Click()
If CekTanggal = False Then
Exit Sub
End If
TampilkanTanggal
End Sub
Private Sub Form_Load()
If App.PrevInstance = True Then
Unload Me
End
End If
CekTanggal = False
Combo_Status_Load
Combo_Tahun_Load
TanggalSekarang = Now
CmbBulan.ListIndex = Month(TanggalSekarang) - 1
CmbTahun.ListIndex = Year(TanggalSekarang) - MinTahun
HariIni = True
TampilkanTanggal
CekTanggal = True
formloaded = True
Timer1.Interval = 300
ahari = Array("Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu")
End Sub
Private Sub Combo_Status_Load()
CmbBulan.List(0) = "Januari"
CmbBulan.List(1) = "Februari"
CmbBulan.List(2) = "Maret"
CmbBulan.List(3) = "April"
CmbBulan.List(4) = "Mei"
CmbBulan.List(5) = "Juni"
CmbBulan.List(6) = "Juli"
CmbBulan.List(7) = "Agustus"
CmbBulan.List(8) = "September"
CmbBulan.List(9) = "Oktober"
CmbBulan.List(10) = "November"
CmbBulan.List(11) = "Desember"
End Sub
Private Sub Combo_Tahun_Load()
Dim i As Integer
For i = 0 To MaxTahun - MinTahun
CmbTahun.List(i) = i + MinTahun
Next
End Sub
Private Sub Grid_Kalender_Load()
Dim i As Integer
CalGrid.Row = 0
CalGrid.Col = 0
CalGrid.CellAlignment = 4
CalGrid.CellFontBold = True
CalGrid.CellBackColor = &HC0C0FF
For i = 1 To 6
CalGrid.Row = 0
CalGrid.Col = i
CalGrid.CellAlignment = 4
CalGrid.CellFontBold = True
CalGrid.CellBackColor = &HD4D4D4
Next
CalGrid.TextMatrix(0, 0) = "Min"
CalGrid.TextMatrix(0, 1) = "Sen"
CalGrid.TextMatrix(0, 2) = "Sel"
CalGrid.TextMatrix(0, 3) = "Rab"
CalGrid.TextMatrix(0, 4) = "Kam"
CalGrid.TextMatrix(0, 5) = "Jum"
CalGrid.TextMatrix(0, 6) = "Sab"
End Sub
Private Sub TampilkanTanggal()
Dim BanyakTanggal As Integer
Dim TahunTampil As Integer
Dim CekKabisat As Boolean
Dim HariPertama As Integer
Dim BulanTampil As Integer
Dim a As Long
Dim b As Long
Dim i As Integer
'tanggal hari ini
TanggalSekarang = Now
TanggalSekarang = Day(TanggalSekarang)
'hapus tanggal lama
For a = 1 To 6
For b = 0 To 6
CalGrid.Row = a
CalGrid.Col = b
CalGrid.Clear
Next b
Next a
'inisiasi
Grid_Kalender_Load
BulanTampil = CmbBulan.ListIndex + 1
TahunTampil = CmbTahun.ListIndex + MinTahun
HariPertama = Program_HariPertama(BulanTampil, TahunTampil)
CekKabisat = Program_CekKabisat(TahunTampil)
If BulanTampil = 4 Or BulanTampil = 6 Or BulanTampil = 9 Or BulanTampil = 11 Then
BanyakTanggal = 30
ElseIf (BulanTampil = 2 And CekKabisat = True) Then
BanyakTanggal = 29
ElseIf (BulanTampil = 2 And CekKabisat = False) Then
BanyakTanggal = 28
Else
BanyakTanggal = 31
End If
'cari hari pertama jawa kabisat
Dim HariPertamaJawa As Integer
Dim HariJawa As Integer
Dim TahunTampil_temp As Integer
If (TahunTampil > 2000) Then
TahunTampil_temp = TahunTampil - 100
Else
TahunTampil_temp = TahunTampil
End If
If (CekKabisat = True) Then
HariPertamaJawa = Program_HariJawaKabisat(BulanTampil, TahunTampil_temp)
Else
HariPertamaJawa = Program_HariJawaBiasa(BulanTampil, TahunTampil_temp)
End If
'menuliskan tanggal
HariJawa = HariPertamaJawa
a = 1
b = HariPertama - 1
For i = 1 To BanyakTanggal
CalGrid.Row = a
CalGrid.Col = b
CalGrid.CellAlignment = 4
CalGrid.WordWrap = True
If (HariIni = True And i = TanggalSekarang) Then
CalGrid.CellBackColor = &HE0E0E0
TextTanggalSekarang = GetNamaHari(b + 1) & " " & NamaJawa(HariJawa) & "," & i & " " & CmbBulan.List(CmbBulan.ListIndex) & " " & TahunTampil
End If
CalGrid.Text = i & vbNewLine & NamaJawa(HariJawa)
If (HariJawa = 5) Then
HariJawa = 1
Else
HariJawa = HariJawa + 1
End If
If (b = 6) Then
a = a + 1
b = -1
End If
b = b + 1
Next
HariIni = False
End Sub
Private Sub SysTrayBtn_Click()
Me.Hide
Dim nid As NOTIFYICONDATA
With nid
.cbSize = Len(nid)
.hWnd = FormMain.hWnd
.uID = 0
.uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
.uCallbackMessage = 1400
.hIcon = FormMain.Icon
.szTip = TextTanggalSekarang & vbNullChar
End With
Shell_NotifyIconA NIM_ADD, nid
oldproc = SetWindowLongA(Me.hWnd, -4, AddressOf proc)
Me.Hide
End Sub
Private Sub Form_Paint()
formloaded = True
End Sub
Private Sub KalenderTray_Click()
Dim nid As NOTIFYICONDATA
With nid
.hWnd = Me.hWnd
.cbSize = Len(nid)
.uID = 0
End With
Shell_NotifyIconA NIM_DELETE, nid
SetWindowLongA Me.hWnd, -4, oldproc
Me.Show
Form_Load
End Sub
Private Sub Timer1_Timer()
shari = ahari(Abs(Weekday(Date) - 1))
Label5(1).Caption = "" & shari & ", " & Format(Date, "dd mmmm yyyy")
Label4(1).Caption = Format(Time, "hh:mm:ss")
End Sub
</pre>
|
|
|
|
|
Yazid Aura Robbani wrote: How to convert this to VB 2010 Express Here my old VB6 codes: Copy & paste to a .NET project and try to run it, focussing on the lines that give a compile-error. As is now, I only see a request to translate a complete project. I'll gladly help looking for a .NET alternative if there's a line that cannot be translated, but you'll have to do the majority of translating on your own
There's a NotifyIcon control that makes showing a tray-icon easy. There's an example on it's use here[^].
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Okay, i will try
Thanks a lot for your suggestion dude
|
|
|
|
|
I want to send message WM_COPYDATA from VB for CE to eVC++. My code is looking like this:
Private Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As Integer
End Structure
Public Sub CopyData(ByVal strToSend As String)
Dim hWndREC As Long
Dim MyData As COPYDATASTRUCT
hWndREC = FindWindow(vbNullString, "Test 1.0")
MyData.dwData = 0
MyData.lpData = strPtr(strToSend)
MyData.cbData = Len(strToSend) * 2
SendMessage(hWndREC, WM_COPYDATA, Me.Handle, MyData)
End Sub
The problem is that a compiler does not recognize a function strPtr. I have also similar problem with MyData, because they cannot be converted on Integer. What can I do?
modified 15-Apr-13 8:13am.
|
|
|
|
|
Member 9891334 wrote: I have also similar problem with MyData, because they cannot be converted on Integer. What can I do?
According to P/Invoke.NET[^], two of those integers would be pointers. Does eVB have an IntPtr or something similar?
Perhaps this CodeProject-article[^] could help?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
eVB is closer to VBScript and only supports type VARIANT.
It also doesn't support a slew of other VB stuff found in the desktop version.
Compiled to p-code. Interpreted.
Moving over to VB.Net would be a better choice.
"It's true that hard work never killed anyone. But I figure, why take the chance." - Ronald Reagan
That's what machines are for.
Got a problem?
Sleep on it.
|
|
|
|
|
Which version of VB for CE?
"It's true that hard work never killed anyone. But I figure, why take the chance." - Ronald Reagan
That's what machines are for.
Got a problem?
Sleep on it.
|
|
|
|
|
VB 2008 for Windows CE ver. 5.0
|
|
|
|
|
I know, I admit this is a jerk question about VB6.
Anyway, I have a Siemens card reader and they provide an SDK which includes an OCX you use to communicate with it. Until I can get the essential communication request/replies working I'm avoiding using Dotnet so as not to have to worry about the interop malarkey for now. I installed VB6 with the idea it gets me right in bed with the OCX. I'm sure you can understand my reasons for doing so in the first-wave of testing.
Anyway, many of the documented methods contain sample prototypes and one I'm dealing with is like this:
void SetData(LONG pinginterval, LPCTSTR key, LPCTSTR user, LPCTSTR unc, LONG port)
The arguments I'd like to clarify are the LPCTSTR. When I use the conventional data types I can't connect to the device. This might be because it can't make sense of what I'm passing in or there might be another problem in the protocol I need to look into. So, if I declare say, key, like this:
Dim key As String
key = "fred"
Is this usage of key compatible with LPCTSTR key in the documentation?
I've tried key = "fred" & Chr(0) to use it as a sort of null terminated string but nothing I've tried seems to work. I'm not a VB6 developer so I've more or less run out of ideas. If anyone can offer any help it's be much appreciated.
Many thanks.
If there is one thing more dangerous than getting between a bear and her cubs it's getting between my wife and her chocolate.
|
|
|
|
|
PHS241 wrote: I'm avoiding using Dotnet so as not to have to worry about the interop malarkey for now
..and what are you doing now? Interopping from VB6.
Open the .NET IDE, create a Forms-project. Choose "Add reference". Select the "COM" tab. Double-click on the library.
Every time VB6 is mentioned, God kills a kitten. And a puppy.
|
|
|
|
|
Eddy, it's been a long day. I've no problem adding a reference to VS. The Siemens documentation doesn't say it can't be used in VS but neither do they it has. Elsewhere, they say it's been used in VBA, Excel, Delphi. I saw VBA and connected that to meaning the same as VB6 so I thought I might stand a better chance if I got as close to the coalface as I can. I have the control on a form. VB6 (like VS) lists the methods I can use and they're the same in both. I sort of come back to the original question and it's not about using it but trying to eliminate the possibility of using the wrong parameters. They even list some VB code which I've copied verbatim requiring only a change to the IP and port values. The connection to the device still doesn't work. Siemens' Entro program connects fine but we don't have the source for that. They provided a C++ test program which unfortunately doesn't compile in VS 2010/2012 so I can't see what that does.
I feel that if I'm correctly using the right parameter formats I will at least be getting closer. There's no problem pinging the device so I know the network connection is working and Wireshark proves it's capable of doing something.
If there is one thing more dangerous than getting between a bear and her cubs it's getting between my wife and her chocolate.
|
|
|
|
|
PHS241 wrote: Elsewhere, they say it's been used in VBA, Excel, Delphi.
VBA isn't quite the same as VB6, but manipulating COM-objects would be done in a similar way.
PHS241 wrote: They even list some VB code
Cool; are they using normal strings in the examples?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
They show two small snippets which I've tried using the same types but still it won't really do anything. For example, I set their values to totally useless settings but the OCX reported the connection was successful but the connection status method said it wasn't connected. I believe the latter because asking the device for some information returns false. That's why I was wondering about the legality of the data types I've tried using. I'd like to think that because they show some sample code that it must have worked sometime when they were testing and documenting it. Then again, they might have dropped in something that looks like it might have worked but possibly never did. Yes, the data types do look like standard VB6 vanilla types.
My other approach is to go back to VS and write the protocol (try to) using pure protocol as it were in a TCP/IP socket. As I mentioned though, they don't tell you what to do with the encryption which is something I believe the OCX implements under-the-hood. I'm home now and I've managed to configure my Win7 on my iMac so I can at least ping the device. I don't know enough about Wireshark to see if it's possible to capture just the IP address I'm using instead of everything else under the sun!
I'm sure I'll get there eventually but without access to a Siemens contact or a support group specialising in this device it's going to be a long weekend!
If there is one thing more dangerous than getting between a bear and her cubs it's getting between my wife and her chocolate.
|
|
|
|
|
As Dave said, the Interop is easier from .NET; I'll agree on that with him.
Give http://www.pinvoker.com/[^] a test-run, together with VB.NET.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
LPCTSTR is only relevant in the source code of a C/C++ program. It equates to either LPCWSTR or LPCSTR depending on whether UNICODE is defined or not (set in the General tab of project properties). So you need to contact the originators of the code to find out whether they built it for Unicode or not.
Use the best guess
|
|
|
|
|
Richard, I spent a long time on the phone to Siemens in the UK. After many attempts I managed to home in on a building that knows what I want to do but not being involved in SDKs the best they could say is they'll pass my details to an SDK group in Germany. So, you can see the problem dealing with a huge company where people have heard but don't know who from or where to go. The SDK provides a DLL which they say can only be used in C++. The OCX is intended for everything else. Unfortunately, it's a poorly documented manual. I mean it's good that they describe the protocol but there are too many loose ends of which the method declarations is but one.
Another thing I don't know is do I need to append a \0 to the strings or does VB6 do that automatically? To make it even more frustrating, I've looked at just about every online reference to BAPSI (Siemens' protocol) and I can't find a single documented sample program which might help. So, I might be guilty of passing in parameters which are not compatible and which the device can only throw away as unusable/unrecognisable.
If there is one thing more dangerous than getting between a bear and her cubs it's getting between my wife and her chocolate.
|
|
|
|
|
That really is very poor from their side. The only other suggestions I can offer are to look at Dependency Walker[^], a tool for showing all the public elements of a DLL, and this MSDN page[^] on decorated names. These two together may be able to help you figure out what the actual SDK calls should be.
Use the best guess
|
|
|
|
|
Internally, VB6 uses BSTR to represent a string. This is a structure consisting of:
1) an integer denoting string length without the terminating character,
2) the Unicode string data (usually 2 bytes per character),
3) a termination code, which is 2 bytes of 00.
As far as what a LPCTSTR is, well, it depends on how the original C code was compiled. If the compile-time constant UNICODE was defined, LPCTSTR maps to the LPCWSTR type, otherwide, it maps to LPCSTR.
LPCTSTR means a Long Pointer to a Constant TCHAR String.
TCHAR is another stringe little bugger that maps to either wchar_t (UNICODE) or char (ANSI) depending on if UNICODE is defined or not.
Oh screw it. It's a huge pile of crap to understand. Just read this[^].
By the way, it's actually EASIER to do Interop from C#/VB.NET than it is from VB6 because you have FAR greater control over how things get marshaled back and forth.
|
|
|
|
|
Thanks Dave. I'll read the link you provided.
If there is one thing more dangerous than getting between a bear and her cubs it's getting between my wife and her chocolate.
|
|
|
|
|
I am trying to write into registry using the command
RegKey = Registry.CurrentUser.CreateSubKey("Software\\macson")
Now when I run the program only then it correctly writes into the HKEY_CURRENT_USER\\MICROSOFT\\SOFTWARE. But when I include this program as an assembly in the setup it writes into the HKEY_USERS with no entry in HKEY_CURRENT_USER. Now my problem is that the program which is supposed to access the registry data is programmed to read from HKEY_CURRENT_USER using the command
MyRegKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\macson", True)
Though I have idea that HKEY_CURRENT_USER is a limited copy of HKEY_USERS but since the data is not available in current user my program is failing.
Can anybody help me out on how to solve this issue?
|
|
|
|
|
SPSandy wrote: But when I include this program as an assembly in the setup it writes into the HKEY_USERS with no entry in HKEY_CURRENT_USER.
A regular executable, or a Windows Service? What's the name of the user that the code is running under?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
A regular Executable. The user is the same as is logged in to windows. To be honest could not understand the second part. So sorry if the answer is not to the mark.
|
|
|
|
|
SPSandy wrote: To be honest could not understand the second part.
My bad, I wanted to know whose credentials/useraccount the application was running under; there's a Username[^] in the environment-class that you can use to log it when the application starts.
Did the setup run as a user or as an administrator?
SPSandy wrote: But when I include this program as an assembly in the setup it writes
Are you executing it from the installer (during installation)? Or is the regkey written when the app launches the first time?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Thanks a lot for your response. I have got the reason. Thanks for the tips. It is because though the user has administrative Privileges but still I think the Setup needs to be run as Administrator. Once I did this, it has now written inot HKEY_Current_User.
Thanks for the hint.
|
|
|
|