|
How can i eject my CDROM ? (Using VB.NET)
|
|
|
|
|
i think this sample code can be useful :
<br />
<br />
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Int32) As Int32<br />
<br />
Private Sub Btb_open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_open.Click<br />
Dim lRet As Int32<br />
Dim returnstring As String<br />
lRet = mciSendString("set CDAudio door open", returnstring, 127, 0)<br />
End Sub<br />
<br />
Private Sub Btn_close_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_close.Click<br />
Dim lRet As Long<br />
Dim returnstring As String<br />
lRet = mciSendString("set CDAudio door closed", returnstring, 127, 0)<br />
End Sub<br />
|
|
|
|
|
Hi,
I had checked this method before, but it opens just the first CD/DVD Drive.
I am interested to know if any code exists to open other drives too?!
(To do this, I used to send a click on Eject verb in drive's context menu! which is quite absurd! but life-saving)
|
|
|
|
|
Hi all,
i have been thinking on this problem for a while now - How do i process data from a serial device?
i have a serial connetion to a fire alarm system that sends ascii characters to the computer, i have esablished comms to the device, and have a method that is fired on every byte of data received.
Problem is the device sends the data in three byte wide blocks, so for example status,channel and then the checksum which is (status+channel). i have tried various method of circular buffers and pop-queues to try and process this but with no success!
for example the device would send ....14 then 1 then 15.
14 01 15 - this would represent fire on sensor 1
i am trying to write a method that every time a byte is received it stores it to a buffer and then processes it to try and put them in seperate variables.
example...
abnormality = buffer(x)
channel= buffer(x+1)
checksum = buffer(x+2)
Here is some rough example code but its not working correctly, does anyone have any ideas?
Thanks
<br />
<br />
Dim queue(6) As Integer<br />
Dim startPos As Integer = 2<br />
<br />
<br />
Private Sub ProcessData(ByVal data As Integer)<br />
Dim test As Boolean = False<br />
Dim checksum As Integer, channel As Integer, abnormality As Integer<br />
Dim alphaBuffer As Integer, betaBuffer As Integer, gammaBuffer As Integer<br />
Dim mytxt As String<br />
<br />
'step1 fill queue at index 2 - starting point<br />
<br />
queue(startPos + index) = data<br />
<br />
index = index + 1<br />
<br />
If index = 3 Then<br />
<br />
'step2 test bytes <br />
alphaBuffer = queue(2)<br />
betaBuffer = queue(3)<br />
gammaBuffer = queue(4)<br />
<br />
If gammaBuffer = CalculateChecksum(alphaBuffer + betaBuffer) Then<br />
<br />
abnormality = alphaBuffer<br />
channel = betaBuffer<br />
checksum = gammaBuffer<br />
<br />
<br />
Me.Label2.Text = abnormality & " " & channel & " " & checksum<br />
mytxt = Me.Label2.Text & " " & Me.ListBox1.Items.Count<br />
Me.ListBox1.Items.Add(mytxt)<br />
'LeftShift(queue)<br />
<br />
<br />
Else<br />
<br />
LeftShift(queue)<br />
startPos = 1<br />
<br />
End If<br />
<br />
<br />
End If<br />
<br />
If index = 4 Then<br />
<br />
'step2 test bytes <br />
alphaBuffer = queue(2)<br />
betaBuffer = queue(3)<br />
gammaBuffer = queue(4)<br />
<br />
If gammaBuffer = CalculateChecksum(alphaBuffer + betaBuffer) Then<br />
<br />
abnormality = alphaBuffer<br />
channel = betaBuffer<br />
checksum = gammaBuffer<br />
<br />
<br />
Me.Label2.Text = abnormality & " " & channel & " " & checksum<br />
mytxt = Me.Label2.Text & " " & Me.ListBox1.Items.Count<br />
Me.ListBox1.Items.Add(mytxt)<br />
'LeftShift(queue)<br />
<br />
<br />
Else<br />
<br />
LeftShift(queue)<br />
startPos = 0<br />
<br />
End If<br />
<br />
End If<br />
<br />
If index = 5 Then<br />
<br />
'step2 test bytes <br />
alphaBuffer = queue(2)<br />
betaBuffer = queue(3)<br />
gammaBuffer = queue(4)<br />
<br />
If gammaBuffer = CalculateChecksum(alphaBuffer + betaBuffer) Then<br />
<br />
abnormality = alphaBuffer<br />
channel = betaBuffer<br />
checksum = gammaBuffer<br />
<br />
Me.Label2.Text = abnormality & " " & channel & " " & checksum<br />
mytxt = Me.Label2.Text & " " & Me.ListBox1.Items.Count<br />
Me.ListBox1.Items.Add(mytxt)<br />
'LeftShift(queue)<br />
<br />
Else<br />
<br />
LeftShift(queue)<br />
startPos = 0<br />
index = index - 1<br />
<br />
End If<br />
<br />
<br />
End If<br />
<br />
<br />
If index = 6 Then<br />
<br />
'step2 test bytes <br />
alphaBuffer = queue(2)<br />
betaBuffer = queue(3)<br />
gammaBuffer = queue(4)<br />
<br />
If gammaBuffer = CalculateChecksum(alphaBuffer + betaBuffer) Then<br />
<br />
abnormality = alphaBuffer<br />
channel = betaBuffer<br />
checksum = gammaBuffer<br />
<br />
<br />
Me.Label2.Text = abnormality & " " & channel & " " & checksum<br />
mytxt = (Me.Label2.Text & " " & Me.ListBox1.Items.Count)<br />
Me.ListBox1.Items.Add(mytxt)<br />
LeftShift(queue)<br />
<br />
Else<br />
<br />
LeftShift(queue)<br />
startPos = 0<br />
index = index - 1<br />
<br />
End If<br />
<br />
<br />
End If<br />
<br />
<br />
<br />
If index = 7 Then<br />
<br />
index = 0<br />
<br />
End If<br />
<br />
<br />
<br />
<br />
End Sub
|
|
|
|
|
Hi,
I need some more info before I can propose an alternative approach. Hence:
1. Is there a minimal time gap between consecutive messages ?
2. How many bytes do you expect per second ?
3. What is the baud rate ?
4. "but its not working correctly" please explain ?
|
|
|
|
|
thanks for your reply
1. Is there a minimal time gap between consecutive messages ?
2. How many bytes do you expect per second ?
The device responds to ENQ (ascii char 5), when its first switched on it sends the same three bytes three times and then shutdown again or around 6 seconds if no ACK signal is sent, if the device is sent ACK (ascii char 6) then it starts to sent data.
so it sends status byte - send ACK back it then sends channel byte and so on.
3. What is the baud rate ? maximum 4800, 2 stop bits and odd parity
4. "but its not working correctly" please explain ? I meant my code, when i have received the data...status,channel,checksum - how do ensure the data is processed correctly in the correct order and not out of sync.
for example sometimes when comms is etablished, if the device is already sending data, the first character at this point may be the channel rather than the status the processing method has to weed this out and sync to the correct byte.
Thanks
|
|
|
|
|
Hi,
thanks for the info. This seems to be a very nice device, it allows for very safe
data transmission. These are my ideas now, they relate to the SerialPort class, not
to your current code; I prefer the synchronous read mode, that is: some thread
does all the communication, both sending and receiving, in lock step, there is no
need to have asynchronous reads since you can be in charge of everything.
SYNCHRONOUS COMM MODE
1. clear the serial input buffer (with DiscardInBuffer)
2. send command to start the communication
3. wait some time (say 1 sec)
4. read available bytes, no more than 9 are required; if they are not present, reject all
(there is a Read that fills a byte buffer, I'll call it b)
5. send command to stop the communication
DATA PROCESSING
1. check that 9 bytes obey xycabCABz pattern; i.e. make sure bytes 5to7 are same as 2to4;
if not reject everything
we will use xyc or yca or cab (normally x=a, y=b, z=c but we dont need that)
2. begin loop three times, with i=0/1/2
3. check b(i+2)=b(i)+b(i+1), if so goto step 6
4. next loop iteration (this means if for some reason a strange byte got in, ignore it)
5. we failed to find a valid checksum, reject everything
6. we got valid data in bytes i,i+1,i+2
IMPLEMENTATION IDEAS
I would have:
- a byte array b holding 9 bytes (it can be reused over and over)
- a method doing the comm part, i.e. filling b
- a method doing postprocessing, returning the index i of the first useful byte,
or -1 to indicate rejection
Hope I explained it well.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/AllLanguages/General
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Thanks for your advice,
i will try and look into implementing your method.
thanks again
|
|
|
|
|
Hi! I need Help once Again.
I used this command to show the orders a particular customer made.
DataGridView1.Rows.Add(str0,str1, str2, str3, str4, str5)
Now, How can I send all the entry From DataGridView1 to a common DataBase where all the orders of all the customers are stored.
(Only differentiated by the Customer ID ,str0 = CustomerID)
(In the DataBase You can get orders made by a particular customer by the CustomerID)
So, can anyone tell me How to Send all the Orders made a Customer to the Common Database.(I heard about the Update method and all)
But any Help is Appreciated.
(as the orders are made it Will be shown in the DataGridView(only for the current customer))
-Thanx-
|
|
|
|
|
Hi Nanco,
From the way you describe the process, I understand that you have made a form with (probably) textboxes. The user enters order information into these boxes which you then gather into the DataGridView1. Assuming that this is correct, and that you are using vb.net (please say you are)...
The best way to proceed is to start using a DataAdapter and DataSet, linked to the database table that you want to store the orders in. Next you use this dataset as the datasource for the datagrid, and last but not least, you register the user input (textbox values) to the dataset and not to the datagrid. This way it is infinitely more easy to retrieve existing orders (DataAdapter.Fill(DataSet) ), and more importantly, the datagridview can be used to allow the user to add and/or edit his order (DataAdapter.Update(DataSet) ) The DataAdapter will take care of retrieving and saving data to and from the database.
Hope this helps you on your way,
Johan
My advice is free, and you may get what you paid for.
|
|
|
|
|
Hello Johan,
I was looking out for Updating data from Datagrid to Database and came through this reply. In my code in VB 2005, records based on SEarch are displayed in the datagrid. Dataset is bounded the way you mentioned datagrid1.datasource = dataset. Now, when I make changes in the datagrid and click Update button, it gets saved in the dataset, but nor in the database. My code is :
' POPULATE DATA GRID
Private Sub PopulateDataGrid(ByVal index As Integer)
Try
' Retreive data by passing Category Id and save in Data set
Dim i As Integer = Me.TblEmpTableAdapter.FillByCatId(Me.AlbumsDataSet.Tables("tblEmployee"), index)
().ToString())
Me.EmpDataGrid.SelectionMode = DataGridViewSelectionMode.FullRowSelect
' Set the DataSet as Datasource for the Data grid
Me.EmpDataGrid.DataSource = Me.EmpDataSet.Tables("tblEmployee")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub UpdateDetails()
If (MsgBox("Are you sure to Update the Changes made? ", MsgBoxStyle.YesNo, "Update Details") = MsgBoxResult.Yes) Then
' Me.EmpDataSet.Tables("tblEmployee").AcceptChanges()
Dim i As Integer = Me.TblEmpTableAdapter.Update(Me.EmpDataSet.tblEmployee)
Me.EmpDataSet.AcceptChanges()
MsgBox("Updated Status = " + i.ToString())
End If
End Sub
Private Sub EmpDataGrid_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles EmpDataGrid.UserDeletingRow
If (MsgBox("Are you sure, you want to Delete the record ", MsgBoxStyle.YesNo, "Delete Record?") = MsgBoxResult.Yes) Then
MsgBox("Record Deleted")
Else
End If
End Sub
Their is no BindingSource used in this for Datagrid. I tried a lot in several ways. Surfed the net alot for some solution, but could find any. Can you please help me out. I also want to add and delete records from the Datagrid. For deleting I just caught the event and was wondering what to do if user says No. Couldn't find any solution forr that also.
I would appreciate, if you can help me out.
Thanks
Terry
|
|
|
|
|
Hi Terry,
Trupti Mehta wrote: Private Sub UpdateDetails()
If (MsgBox("Are you sure to Update the Changes made? ", MsgBoxStyle.YesNo, "Update Details") = MsgBoxResult.Yes) Then
' Me.EmpDataSet.Tables("tblEmployee").AcceptChanges()
Dim i As Integer = Me.TblEmpTableAdapter.Update(Me.EmpDataSet.tblEmployee)
Me.EmpDataSet.AcceptChanges()
MsgBox("Updated Status = " + i.ToString())
End If
End Sub
The first thing that I notice in your code, is that you called .AcceptChanges and then .Update and then once again .AcceptChanges . This is not necessary and in this case would have even caused the problem.
Here is why: when a user makes changes in the datagrid, the rowstate of the rows in the linked DataSet will change accordingly. Change a value and the rowstate becomes something like "changed", delete a row and its rowstate becomes "deleted" (or that is the general idea anyway). When you call .Update the dataset will compare the rows with an altered rowstate, with the corresponding rows in the database, implement the changes where necessary, and finally reset the rowstates and refresh the dataset.
Now when you first call .AcceptChanges all these rowstates are reset. When you now call .Update there are no altered rowstates, and therefore the dataset has nothing to compare, nor implement.
Apparently you commented the first .AcceptChanges away, so as far as I can tell it should work. You may however want to also remove the second .AcceptChanges , as .Update already does that. One thing you could check is that there isn't some other function or sub that calls .AcceptChanges before the user tries to update his order (this is a mistake I made once, and it took me weeks to finally figure out that I called .AcceptChanges somewhere else entirely).
The .Update method will actually implement all changes for you, also deleting rows, etc. If you want to give a user the chance to change his mind about deleting a row, you can just call .AcceptChanges , .Clear and then DataAdapter.fill(YourDataSet) if he chooses 'No' or .Update if he chooses 'Yes'.
Hope this helps,
Johan
My advice is free, and you may get what you paid for.
|
|
|
|
|
Thanks Johan,
But nothing worked. AcceptChanges was before also as I was just trying to figure out working here & there. Otherwise the code is :
Dim i As Integer = Me.TblAlbumsTableAdapter.Update(Me.AlbumsDataSet.Tables("tblAlbums"))
MsgBox("Updated Status = " + i.ToString())
Dataset has 2 table in it. I tried the above way & also by passing Dataset. That goes to ListSelectionEvent Changed (1 table is connected to the list) and then to second where I want to make changes. It just gors to ReadOnly Property .. Me.TableBase . Nothing else. Do I need to manually set the values of current changed row to DS or some other way.
For Delete also :
If (MsgBox("Are you sure, you want to Delete the record ", MsgBoxStyle.YesNo, "Delete Record?") = MsgBoxResult.Yes) Then
Me.TblAlbumsTableAdapter.Update(Me.AlbumsDataSet)
MsgBox("Record Deleted")
Else
Me.AlbumsDataSet.RejectChanges() ' .AcceptChanges()
Me.AlbumsDataSet.Tables("tblAlbums").Clear()
Me.PopulateDataGrid(Me.categoryList.SelectedIndex + 1)
Me.AlbumsDataGrid.Refresh()
End If
If No is selected, the row gets deleted, on selecting other list item & returning to the same, it shows the record back. If Yes is selected, it happens the same way. But, it is NOT deleted from DB.
I hope you can help me out more with the problem.
Thanks
Terry
|
|
|
|
|
Hi Terry,
From what I can tell, the problem with the db not being updated, happens because somehow the connections between your database, DataAdapter, DataSet and DataGrid are not configured correctly.
Perhaps you could try to add a new test form to your app, put a datagrid on it, then create a DataAdapter that gets data from a single (test) table only, create a DataSet from it, and then select the dataset as the datasource in the datagrid properties. Load the data into the datagrid during the load event () and update the table in the database with a button and the .Update method. See if it works, and if it does, you can check how this test differs from your case. If the test doesn't work, you may have to do some additional googling about why not.
As for your delete code, it is actually working the way it should according to your code. .RejectChanges only resets the rowstates in the dataset. I am not sure what this PopulateDataGrid does, but if it doesn't include a .Fill somewhere, then it is correct that your datagrid does not actually update its content. .Refresh will actually only repaint the control, and is best avoided, because it can screw up the scrollbars.
Good luck,
Johan
My advice is free, and you may get what you paid for.
|
|
|
|
|
Thanks Johan,
.Accept or Reject nothing was working. Finally someone like you suggested me to use e of Eventargs
e.Cancel
That worked out. With that the event procedure is cancelled and you are back to normal. Nothing else is required.
Reg. Update, now finally things have come to track. Actually the code was proper & well. But, I didn't select Copy if newer of CoptToOutpurDir property of Database. That was Copy Always which was creating all the problem. That point someow clicked in my mind last night & things got working.
Thanks a lot for all the effort and interest.
I really appreciate your help and guidance.
Thanks
Terry
|
|
|
|
|
<br />
s = "drop view q1"<br />
cmd.CommandText = s<br />
dr = cmd.ExecuteReader()<br />
dr.Close()<br />
<br />
<br />
<br />
<br />
<br />
s = "create view q1 as select sum(fatrq1)reglz from reglz where fatrdate between '" + str + "'and'" + str2 + "'"<br />
cmd.CommandText = s<br />
dr = cmd.ExecuteReader<br />
dr.Close()<br />
<br />
Form7.Show()<br />
in form 7 i put this code
CrystalReportViewer1.ReportSource = ("CrystalReport1.rpt")
and i saved my report in debug
and when i when i click the bottom to show the report
he tell me error loading the report
is there any one to help me
|
|
|
|
|
hi,
specify the error in detail.
anyway use this procedure (in place of Form7.show) to show report
call crystalForm.showReport()
where crystalForm contains crystalReportviewer and showReport procedure.
Private sub ShowReport()<br />
Try<br />
Dim obj As CrystalReport1 = New CrystalReport1<br />
Dim ds As New DataSet<br />
Dim da As OleDbDataAdapter<br />
Dim str As String<br />
str = "select * from TableName" 'Query<br />
<br />
da = New OleDbDataAdapter(str, conn) ' where conn is connection object<br />
da.Fill(ds)<br />
<br />
obj.SetDataSource(ds.Tables(0))<br />
me.CrystalReportViewer1.ReportSource = obj<br />
Me.Show()<br />
Catch ex As Exception<br />
MsgBox(ex.Message, MsgBoxStyle.Information, "Report")<br />
End Try<br />
End sub
one more thing ,CrystalReport1.rpt must be include in your project (not in debug folder)
hope this helps
Rupesh Kumar Swami
Software Engineer,
Integrated Solution,
Bikaner (India)
|
|
|
|
|
Hi there,
The user input a decimal number 123.456, how do i work on the number behind the decimal point.
|
|
|
|
|
Hi,
integer numbers can't handle the fractional part.
Floating-point numbers can; that is their purpsoe.
Look for the Single and Double data types, and the corresponding classes.
Double.TryParse() may suit your needs.
If this is new to you, I strongly recommend you buy an introductory book on
VB.NET and work your way through it.
|
|
|
|
|
Luc Pattyn wrote: ForumVisual Basic / VB.NET
Subject:Re: Decimal Point
Sender:Luc Pattyn
Date:6:13 5 Aug '07
Hi,
integer numbers can't handle the fractional part.
Floating-point numbers can; that is their purpsoe.
Look for the Single and Double data types, and the corresponding classes.
Double.TryParse() may suit your needs.
If this is new to you, I strongly recommend you buy an introductory book on
VB.NET and work your way through it.
Luc Pattyn
Integer numbers can't handle fractions, WELL DUH....Anyone knows that
Everyone needs a little help, now and then, even people like you.........
|
|
|
|
|
Yeah, I need help in guessing which elementary things you know and don't know.
The integer part of a floating-point number is available by ... to ...,
or by using the ... method, and the fractional part is what is left when you
subtract the integer part from it. But of course you knew all that.
Now what is the question ?
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/AllLanguages/General
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
I'm creating a datagridview in VS2005, and two of the columns is comboboxes. I don't know how to change to populate the datasource to 2nd combox from the selection on the 1st combox. The point is I don't know how to return the value from the 1st combox selection on a row. Could someone here tell me how, please
Your Helps are Very Appreciated. Ryan
|
|
|
|
|
Hello, i am 16, at the moment i am learing VB 6 however was recently told this isnt the best language to use. I am familier with the bascis of C++, should i contiue to learn C++?
Which language would you say would help me get started into the world of proggraming?
I know the basics of VB 6, HTML and C++, so i have some knoledge haha
Benjamin Dodd
|
|
|
|
|
It really depends on what you want to do. For web programming, PHP, ruby, or asp.net would probably be good choices.
For desktop programming, C++ would definitely be the way to go, although java might also work well for you.
Also, at some point I'd really recommend spending some time with C and assembly. They aren't necessarily the best introductory languages (although the first programming class I ever took started from assembly and then went to C), but a good grasp of the low level workings of the computer will help you out.
|
|
|
|
|
ooo thanks i have experince with C++, i will use C# i think as i have had it reconmended to me.
Rareed wrote: For desktop programming
this i what i want to do desktop programming, i will use C# i think
Thanks
Benjamin Dodd
|
|
|
|
|