|
Apologies for the shouting but this is important.
When answering a question please:
- Read the question carefully
- Understand that English isn't everyone's first language so be lenient of bad spelling and grammar
- If a question is poorly phrased then either ask for clarification, ignore it, or mark it down. Insults are not welcome
- If the question is inappropriate then click the 'vote to remove message' button
Insults, slap-downs and sarcasm aren't welcome. Let's work to help developers, not make them feel stupid.
cheers,
Chris Maunder
The Code Project Co-founder
Microsoft C++ MVP
|
|
|
|
|
For those new to message boards please try to follow a few simple rules when posting your question.- Choose the correct forum for your message. Posting a VB.NET question in the C++ forum will end in tears.
- Be specific! Don't ask "can someone send me the code to create an application that does 'X'. Pinpoint exactly what it is you need help with.
- Keep the subject line brief, but descriptive. eg "File Serialization problem"
- Keep the question as brief as possible. If you have to include code, include the smallest snippet of code you can.
- Be careful when including code that you haven't made a typo. Typing mistakes can become the focal point instead of the actual question you asked.
- Do not remove or empty a message if others have replied. Keep the thread intact and available for others to search and read. If your problem was answered then edit your message and add "[Solved]" to the subject line of the original post, and cast an approval vote to the one or several answers that really helped you.
- If you are posting source code with your question, place it inside <pre></pre> tags. We advise you also check the "Encode "<" (and other HTML) characters when pasting" checkbox before pasting anything inside the PRE block, and make sure "Use HTML in this post" check box is checked.
- Be courteous and DON'T SHOUT. Everyone here helps because they enjoy helping others, not because it's their job.
- Please do not post links to your question into an unrelated forum such as the lounge. It will be deleted. Likewise, do not post the same question in more than one forum.
- Do not be abusive, offensive, inappropriate or harass anyone on the boards. Doing so will get you kicked off and banned. Play nice.
- If you have a school or university assignment, assume that your teacher or lecturer is also reading these forums.
- No advertising or soliciting.
- We reserve the right to move your posts to a more appropriate forum or to delete anything deemed inappropriate or illegal.
cheers,
Chris Maunder
The Code Project Co-founder
Microsoft C++ MVP
|
|
|
|
|
Hi sir,
i'm already try to pool data into listview and it worked. But i need to pool the data using timer can anyone guide me ?
<pre> Try
Dim cmd As New FbCommand("SELECT A.EVENTDATE AS EVENTDATE ,A.PRIORITY AS PRIORITY ,B.CARDHOLDERID AS CARDHOLDERID," & _
"B.EMAIL AS EMAIL,B.NAME AS NAME,C.WINSOCKIPADDRESS AS WINSOCKIPADDRESS,A.DEVICEID AS DEVICEID, " & _
"D.DESCRIPTION AS DESCRIPTION " & _
" FROM EVENT A , CARDHOLDER B , COMMCHANNEL C, DEVICE D " & _
"WHERE (A.CARDHOLDERID = B.CARDHOLDERID)" & _
" AND (A.COMMCHANNELID = C.COMMCHANNELID) " & _
" AND (A.DEVICEID = D.DEVICEID) " & _
"AND A.CARDHOLDERID IS NOT NULL " & _
"AND B.USERDEFINED9 = 'STAFF' AND B.STATUS='Normal'" & _
" AND A.PRIORITY IS NULL " & _
"AND A.EVENTDATE >= CAST('TODAY' AS DATE) AND A.EVENTMSG = 'Access Granted' " & _
"ORDER BY A.EVENTDATE ASC", IBSSCN)
IBSSDR = cmd.ExecuteReader()
ListView1.Items.Clear()
Dim bFlag As Boolean = True
Do Until Not bFlag
While IBSSDR.Read
Dim touch As DateTime = Convert.ToDateTime(IBSSDR.Item("EVENTDATE"))
Dim date1 As String = touch.Date.ToString("dd/MM/yyyy")
Dim time1 As String = Format(touch, ("hh:mm:ss tt"))
Dim str(5) As String
Dim itm As ListViewItem
str(0) = IBSSDR.Item("CARDHOLDERID")
str(1) = IBSSDR.Item("NAME")
str(2) = date1
str(3) = time1
If IBSSDR.Item("EMAIL") Is DBNull.Value Then
str(4) = ""
Else
str(4) = IBSSDR.Item("EMAIL")
End If
itm = New ListViewItem(str)
ListView1.Items.Add(itm)
End While
bFlag = IBSSDR.NextResult
Loop
IBSSCN.ClearAllPools()
Catch ex As Exception
MsgBox(ex.Message)
End Try
I already add the timer :
<pre lang="VB">
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Timer1.Enabled = True
Timer1.Interval = 6000
ListView1.Update()
ListView1.Refresh()
end sub
Can anybody help me, plz , tq
|
|
|
|
|
You have to call your code that retrieves the data from the database from your timer Tick handler.
Separate your code so you're putting the database retrieval code into it's own function that returns the data set. DO NOT put the code that handles putting that data into the ListView in that same code! Break that out into its own method. Methods should only do one thing, like retrieving a specific dataset from the database, or updating the data in a control. They should NOT do multiple things.
|
|
|
|
|
Ok thanks you for support and guide, i will try to separate task by method,
One more thing sir, how to make last item in listview always highligthed or fullselectedrow?...Hope can guide me, thank a lots.
|
|
|
|
|
|
Since some weeks i'm working on a german cards game "Schafkopf" [private] demo.
The demo is not bad but somehow my coding drifted away and appears like "Spaghetti code".
The game has 32 cards and 4 players.
For a "SOLO" or "WENZ" the declarer plays against the 3 other players.
A standard game is that the declarer plays with one "Ace" (owned by another player) => 2 play against the other 2.
The computer controls 3 players, one player is the user who can click on one of his cards (which are presented on a dgv).
The problem is that there are many, many loops when checking a players cards and endless "rules" which now are done with
"If, Then, ElseIf ..." statements.
So one of the related functions is > 500 code lines ...
I think I need a better concept, because the existing one is hard to handle, problems are not easy to fix.
Any ideas?
Example for those loops:
Try
If MyForm.GameOver = True Then Exit Function
If GameStatus.ToString = "SpielAus" Then MyForm.GameOver = True
If GameStatus.ToString = "SpielAus" Then Exit Function
If sHandCards Is Nothing Then
' => LeadSuit n.a.
Debug.Print("ACP 516 sHandCards: Is Nothing")
Debug.Print("ACP 517 LeadSuitID: '" & LeadSuitID & "'; TrumpCardID: '" & TrumpCardID & "'")
sHandCards = sTrumpList
Else
'sHandCards <> Nothing
'MessageBox.Show("ACP 525 sHandCards: " & sHandCards.ToString)
If ContainsHandCardsStandardTrumps(sHandCards) = False Then
'MessageBox.Show("ACP 528 sHandCards: " & sHandCards.ToString)
If TrumpCardID <> 4 Then sHandCards = sTrumpList
If TrumpCardID = 4 Then
If sHandCards.ToString.Contains("O") Then
Else
sHandCards = sTrumpList
End If
End If
End If
If dgv.CurrentCell.Value.ToString.Contains("♠") Or dgv.CurrentCell.Value.ToString.Contains("♥") Or
dgv.CurrentCell.Value.ToString.Contains("Ⴖ") Or dgv.CurrentCell.Value.ToString.Contains("Ꚛ") Or
dgv.CurrentCell.Value.ToString = "" Or dgv.CurrentCell.Value Is Nothing Or
dgv.CurrentCell.Value.ToString = String.Empty Then
For Each row As DataGridViewRow In dgv.Rows
For n As Integer = 1 To dgv.Columns.Count - 1
If row.Cells(n).Value.ToString.Contains(GetLowOfHandCards(row.Cells(n), PlayerID,
DeclarerID, GameStatus, sHandCards, TrumpCardID, dgv, MyForm, LeadSuitID)) Then
If dgv.CurrentCell.Value.ToString.Contains("♠") Or
dgv.CurrentCell.Value.ToString.Contains("♥") Or
dgv.CurrentCell.Value.ToString.Contains("Ⴖ") Or
dgv.CurrentCell.Value.ToString.Contains("Ꚛ") Or
dgv.CurrentCell.Value.ToString = "" Or
dgv.CurrentCell.Value Is Nothing Or
dgv.CurrentCell.Value.ToString = String.Empty Then
If row.Cells(n).RowIndex = LeadSuitID AndAlso row.Cells(n).RowIndex <>
MyForm.RufAs.CardColor Then
If row.Cells(n).Value.ToString.Contains("O") = False AndAlso
row.Cells(n).Value.ToString.Contains("U") = False Then
SetCurrentCell(dgvCell, dgv, row.Cells(n), row.Cells(0), " ~ " &
(String.Format("Line # {0}", (New StackTrace(New
StackFrame(True))).GetFrame(0).GetFileLineNumber())) & " ~ ")
End If
End If
End If
End If
Next
Next
End If
|
|
|
|
|
Simple thing like:
string s = dgv.CurrentCell.Value.ToString
then
If s.Conttains("x") or s.Contains...etc
makes the thing more palatable.
Then you look at it again; repeat.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
|
|
|
|
|
Thank you.
Will use string s = dgv.CurrentCell.Value.ToString
and remove redundant code lines.
But the main question is if it makes sense using If - Then statements for game rules or if there is a better way to do this.
modified 19-May-22 3:45am.
|
|
|
|
|
Rules come in a form best suited for a given situation; be it "if's", tables or whatever.
Your "if's" depend on the length of your "cell value".
If it's only 1 (char) long, instead of multiple if's, you can code:
string s = "x"
if "xwz".Contains(s) etc.
if the cell value's length is greater than one, then iterate each character:
For Each ch As Char in s
if "xyx".Contains(ch) etc.
Next
}
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
|
|
|
|
|
Well this leads me to another improvement.
Instead of many times using If statements like that
If PlayerID <> DeclarerID And PlayerID <> MyForm.iCoSpieler Then ...
or
If PlayerID = DeclarerID Or PlayerID = MyForm.iCoSpieler Then ...
I will use variables like
Dim bTeamDeclarer As Boolean
Dim bTeamOpponent As Boolean
If PlayerID <> DeclarerID And PlayerID <> MyForm.iCoSpieler Then bTeamOpponent = True
If PlayerID = DeclarerID Or PlayerID = MyForm.iCoSpieler Then bTeamDeclarer = True
Then i can combine 2 or 3 lines of my rules in the loops like
If n > 0 AndAlso bTeamDeclarer= True AndAlso row.Index = TrumpCardID Then
...
This should make code easier to read AND shorter.
|
|
|
|
|
In c# I'd code:
bool bTeamComponent => PlayerID != DeclarerID && PlayerID != MyForm.iCoSpieler;
...
if ( bTeamComponent ) ...
Note how bTeamComponent is "dynamic" for every access.
It obviously has to be scoped properly.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
|
|
|
|
|
Instead of hard coding the rules, can you think of a way to load some rules from a list and check those?
Bastard Programmer from Hell
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
I had some ideas during the last days.
It is not easy to find and fix issues with my Spaghetti Code - but the computer is already playing better than a human with beginner level.
If I only could fix 4 or 5 important remaining issues the pc would reach medium playing level.
One idea is to replace each loop with a Sub or Function (what is possible but I'm not sure it this makes sense).
A list or a xml file came also to my mind - I searched for CP articles about rules engine or business rules.
But from my findings there was nothing really easy - something that you can use easily and when you look at it some weeks later it should still look easy and allow changes without any problems.
The last thing would be to have classes for card, hand cards, cards deck, current trick and so on.
But I do not know how to bring together the properties of the classes and my existing rules.
Any link to an article which may help me would be great.
Note: My Schafkopf demo is based on A Bridge Card Game and Display Card Presentation[^]
|
|
|
|
|
|
Are we a programming forum, or a Google service?
Bastard Programmer from Hell
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
I could have just said "There are better examples". If someone said that to me, I would have responded: "And...?"
So, I saw no point in responding as you might suggest.
There, I wasted a message after all.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
|
|
|
|
|
|
Jo_vb.net wrote: but the computer is already playing better than a human with beginner level.
If I only could fix 4 or 5 important remaining issues the pc would reach medium playing level. You programmed it like that! Look into the "Random" object and force it to play a dumb card now and then (once out of five?).
Jo_vb.net wrote: A list or a xml file came also to my mind - I searched for CP articles about rules engine or business rules. Hehe, good idea; those tend to generalize to fit a lot of rules though. You want to keep it simpler; understand the concept enough to build a simpler version of your own.
Remember that "xyz".Contains("c")? Imagine xyz and c coming from a file? It wouldn't be rules based, but halfway. If you can do that, we'll go from there to make actual rules
Jo_vb.net wrote: The last thing would be to have classes for card, hand cards, cards deck, current trick and so on.
But I do not know how to bring together the properties of the classes and my existing rules. You could write multiple classes for a "card"; I'd talk about interfaces at this point if we'd be in class
Jo_vb.net wrote: Any link to an article which may help me would be great. I did not help in any way, and any suggestion may have sounded like homework for school. There's never a library that does exactly what you need. I can only point to CodeProject; they'd help.
Conquer the rules; if you can do that, I'll write an article about depending on classes and having variants
Bastard Programmer from Hell
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Thanks a lot for this detailed answer.
But I'm only on a better beginner level in coding...
I use already subs in my loops and I really don't understand how
Quote: Remember that "xyz".Contains("c")? Imagine xyz and c coming from a file? It wouldn't be rules based, but halfway. If you can do that, we'll go from there to make actual rules
could be used for a loop like the following:
If MyForm.RufAs.MeAlreadyPlayed = True Or MyForm.iCoSpieler = -1 Then
For Each row As DataGridViewRow In dgv.Rows
For n As Integer = 1 To dgv.Columns.Count - 1
If MyForm.RufAs.MeAlreadyPlayed = True Or MyForm.iCoSpieler = -1 Then
If MyForm.Trick_Content.CurrentTrickWinner <> MyForm.iCoSpieler AndAlso MyForm.Trick_Content.CurrentTrickWinner <> DeclarerID Then
If n > 0 AndAlso PlayerID <> DeclarerID AndAlso PlayerID <> MyForm.iCoSpieler Then
If TrumpCardID <> 4 Then
If PlayTogether_WenzUsage(dgvCell, PlayerID, DeclarerID, GameStatus, sTrumpList, TrumpCardID, "RufAs", MyForm, LeadSuitID) = True Then
If row.Cells(n).Value.ToString.Contains("U") Then
If ContainsHandCardsStandardTrumps(CStr(sHandCards)) = False Then ' Or sHandCards Is Nothing Then ' Or MyForm.cardLessThan(MyForm.Trick_Content.PossibleWinnerCardString, row.Cells(n).Value.ToString & row.Cells(0).Value.ToString) Then
If LeadSuitID = TrumpCardID AndAlso row.Cells(n).Value.ToString <> String.Empty Then
SetCurrentCell(dgvCell, dgv, row.Cells(n), row.Cells(0), " ~ " & (String.Format("Line # {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())) & " ~ ")
End If
End If
End If
End If
End If
End If
End If
End If
Next
Next
End If
|
|
|
|
|
Jo_vb.net wrote: But I'm only on a better beginner level in coding... Lots of beginners here; most looking for templates to do their work.
Jo_vb.net wrote: could be used for a loop like the following: Don't worry about the big picture; understand the concept first, then you integrate it into your 'engine'.
Someone hit me if I wrong, but string s = File.ReadAllText(path, appendText, Encoding.UTF8); would load the data of that file into the string called s?
"xyz".Contains("c")
becomes
s.Contains("c")
Where s is then loaded from a file (specified in "path"). This way, the "xyz" isn't hardcoded, but just data in a file. Requires you to read a string from a file. Could you achieve that?
Bastard Programmer from Hell
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
I'm in doubt about this approach [the .Contains(s) method is only used in < 10% of the "if - then" statements/rules], but reading a text file line after line is possible.
|
|
|
|
|
The idea is not limited to that method
Bastard Programmer from Hell
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Hi! Can somebody help me. I am beginner. I have a project and need to update datagridview with image column, using Access databse. I have code for insert new row with image and as I understand it can be modified for updating row. I try to modify, but problem is not working. Now no any alarms or errors occurs, database not changed.
Many thanks un advance.
<pre> Private Sub Btn_Save_Click(sender As Object, e As EventArgs) Handles Btn_Update.Click
Try
If PhotoPictureBox.Image Is Nothing Then
If MsgBox("Are you sure you don't want to upload any pictures?", MsgBoxStyle.Information + MsgBoxStyle.YesNo, "Missing picture") Then
Dim CN As New OleDbConnection(connection)
CN.Open()
Dim Int As String
Int = "UPDATE Germany set [Year_of_release]=@year_of_release, [Denomination]=@denomination, [Governing_body]=@governing_body, [Acquired]=@acquired, [Date_of_purchase]=@date_of_purchase, [Course]=@course, [Material]=@material WHERE [ID]=@ID"
Dim cmd As New OleDbCommand(Int, CN)
'cmd.Parameters.Add("@ID", OleDbType.VarChar).Value = IDTextBox.Text
cmd.Parameters.Add("@year_of_release", OleDbType.VarChar).Value = Year_of_releaseDateTimePicker.Value
cmd.Parameters.Add("@denomination", OleDbType.VarChar).Value = DenominationTextBox.Text
cmd.Parameters.Add("@governing_body", OleDbType.VarChar).Value = Governing_bodyTextBox.Text
cmd.Parameters.Add("@acquired", OleDbType.VarChar).Value = AcquiredTextBox.Text
cmd.Parameters.Add("@date_of_purchase", OleDbType.VarChar).Value = Date_of_purchaseDateTimePicker.Value
cmd.Parameters.Add("@course", OleDbType.VarChar).Value = CourseTextBox.Text
cmd.Parameters.Add("@material", OleDbType.VarChar).Value = MaterialTextBox.Text
cmd.ExecuteNonQuery()
cmd.Dispose()
CN.Close()
CN.Dispose()
End If
Else
If imgName <> "" Then
Dim fs As FileStream
fs = New FileStream(imgName, FileMode.Open, FileAccess.Read)
Dim picturebytes As Byte() = New Byte(fs.Length - 1) {}
fs.Read(picturebytes, 0, System.Convert.ToInt32(fs.Length))
fs.Close()
Dim CN As New OleDbConnection(connection)
CN.Open()
Dim Int As String
Int = "UPDATE Germany set [Year_of_release]=@year_of_release, [Denomination]=@denomination, [Governing_body]=@governing_body, [Acquired]=@acquired, [Date_of_purchase]=@date_of_purchase, [Course]=@course, [Material]=@material, [Photo]=@photo WHERE [ID]=@ID"
Dim imgparam As New OleDbParameter()
imgparam.OleDbType = OleDbType.Binary
imgparam.ParameterName = "@photo"
imgparam.Value = picturebytes
Dim cmd As New OleDbCommand(Int, CN)
cmd.Parameters.Clear()
cmd.Parameters.Add("@ID", OleDbType.VarChar).Value = IDTextBox.Text
cmd.Parameters.Add("@year_of_release", OleDbType.VarChar).Value = Year_of_releaseDateTimePicker.Value
cmd.Parameters.Add("@denomination", OleDbType.VarChar).Value = DenominationTextBox.Text
cmd.Parameters.Add("@governing_body", OleDbType.VarChar).Value = Governing_bodyTextBox.Text
cmd.Parameters.Add("@acquired", OleDbType.VarChar).Value = AcquiredTextBox.Text
cmd.Parameters.Add("@date_of_purchase", OleDbType.VarChar).Value = Date_of_purchaseDateTimePicker.Value
cmd.Parameters.Add("@course", OleDbType.VarChar).Value = CourseTextBox.Text
cmd.Parameters.Add("@material", OleDbType.VarChar).Value = MaterialTextBox.Text
cmd.Parameters.Add(imgparam)
cmd.ExecuteNonQuery()
cmd.Dispose()
CN.Close()
CN.Dispose()
End If
End If
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub
|
|
|
|
|
Please do not repost the same question.
|
|
|
|
|