|
Hello,
Well it still shows two of a kinds after the shuffle. I've tried various things with While and Do nested loops and same with If Then EndIf, but nothing seems to work...I'm trying though. Any ideas?
|
|
|
|
|
I'm not sure what the program is supposed to do so not sure why it's not working.
Can you tell me what the form looks like (e.g. how many image controls it displays)?
What should happen when the Start button is clicked (I assume Start is a button)?
Should it display one card or more than one?
Regards
David R
|
|
|
|
|
Well, it is displaying all the cards 4 across and 13 down in full suits w/out jokers, of course. Then when the cards are random and shuffled, they should display the same amount of cards in same positions, but random ones. What happens when I compile and run the program, is that more of one of the same cards are displayed, thus showing not totally random cards. Somehow, I'm thinking Card1 should not equal Card2 from the random procedure, then the cards are shuffled, and then distributed out....but there is no code that shows Card1 should not equal to Card2 at all, for to be randomly displayed. Any ideas? Thank you.
|
|
|
|
|
So you have 52 Image1() controls and want to display the deck in them?. Do the indexes for the controls go from 1 to 52 or from 0 to 51? You should be able to find that from the properties in the designer. Depending on whether it's 0-51 or 1-52 there could be a simple solution.
How do the Image1() controls get filled with pictures when the program starts up? Is there any code that fills them (probably in Form_Load event if there is)? Or did you set them in the designer?
I managed to dig out an old machine that still had VB6 on and had a little play - frightening how much I'd forgotten about Image controls!
Regards
David R
|
|
|
|
|
Firstly, I would like to thank you for being so cool for helping me on this project. I truly appreciate it.
As far as the image1() controls, they were created in the design page all lined up with different bitmaps representing them. Then the first image card would be image1(0) to image1(52) for the final card. Wait a second....just came back to reading this and realized in the designer the first card of the array is 0, then the final card is labeled 52. Isn't it supposed to be 51? Why is it doing that....it looks like I set up the suits perfectly in order.....
No specific code that fills the array of images, just designed in designer form and added that way. Thought that would be easier, but perhaps there is a disadvantage of doing it that way?
|
|
|
|
|
It looks like you have missed an index somewhere. The only way to find out is to go through them one by one.
The reason I asked was that I thought if the indexes go from 1 to 52 you could have an Image1(0) that can be made invisible (you could do this in the Form_Load event, and it wouldn't matter where it is on the screen). You could then use this in the shuffle instead of tmpCard when doing the swap. That way you know it is the correct type.
So you could have something like this for swapping:
If (card1 <> card2) Then
Image1(0).Picture = Image1(card1).Picture
Image1(card1).Picture = Image1(card2).Picture
Image1(card2).Picture = Image1(0).Picture
End If
In your loop I'd avoid using the goto, you need something like:
For counter = 1 to 100 'Do 100 swaps to shuffle deck
'do the shuffling here
Next counter
A disadvantage of setting the bitmaps in the designer is that it would be tedious to set the images to use a different set of cards (but that probably isn't a worry). Another one is you have to make sure you don't have gaps in the indexes and it looks like you have a gap (else the indexes would be 0 to 51).
Because of the way card1 and card2 are calculated they will be between 1 and 52 so your indexes for Image1() need to be in the same range. This avoids having to do -1 somewhere to get the correct range (in fact you could just drop the +1 when calculating card1 and card2 instead of using -1).
Regards
David R
|
|
|
|
|
Very astute. Thank you for the explanations. Have a wonderful holiday!
|
|
|
|
|
Ok, I still had a little trouble with getting double cards, so I tried this and it seems to work as I test it; must do some more testing, but I think I'm ready to move on to the next task. Thanks so much. Here's the code I have:
Option Explicit
Public Sub Main()
Start_Game.Show
End Sub
Private Sub Exit_Click()
MsgBox ("Thank you for playing! Good bye")
End
End Sub
Private Sub Start_Click()
Dim arrDeck(52)
Randomize
Dim Cardcount As Integer
Dim Counter As Integer
Dim Card1 As Integer
Dim Card2 As Integer
' Fill deck with cards in order 1 to 52
Cardcount = 0
Do While Cardcount <= 51
arrDeck(Cardcount) = Cardcount
Cardcount = Cardcount + 1
Loop
' Shuffle the deck - end value (100)
Counter = 0
For Counter = 0 To 100
Card1 = Int(52 * Rnd)
Card2 = Int(52 * Rnd)
If (Card1 <> Card2) Then
Image1(0).Picture = Image1(Card1).Picture
Image1(Card1).Picture = Image1(Card2).Picture
Image1(Card2).Picture = Image1(0).Picture
End If
Next Counter
' Re-shuffle the deck
Counter = 0
For Counter = 0 To 100
Card1 = Int(52 * Rnd)
Card2 = Int(52 * Rnd)
If (Card1 <> Card2) Then
Image1(0).Picture = Image1(Card1).Picture
Image1(Card1).Picture = Image1(Card2).Picture
Image1(Card2).Picture = Image1(0).Picture
End If
Next Counter
' Now output images in order
Counter = 0
For Counter = 0 To 51
Image1(Counter).Visible = True
Next Counter
End Sub
|
|
|
|
|
Glad to hear you're making progress.
Here's a version I knocked up that populates the Image1() array from files on disk.
It also does the shuffle and (I think!) it works - just done some quick checking and can't see duplicates. It's got some constants in that I used to get spacing for the images. It also has hard coded file path to where I put the bitmap files.
It's been a bit of fun going back to VB6 - I've been using C# for the last few years (with a little bit of VB.NET).
If you decide to try VB.NET be warned it's only superficially the same as VB6 - it's really a very different language.
Option Explicit
Private Const OFFSET_X As Integer = 600
Private Const OFFSET_Y As Integer = 600
Private Const CARD_WIDTH As Integer = 1305
Private Const CARD_HEIGHT As Integer = 1425
Private Const COL_SPACE As Integer = 150
Private Const ROW_SPACE As Integer = 150
'---------------------------------------------------------------------------------------
' Initialise the Image1() control array when the Form is loaded.
' Has to be done somewhere and this seems sensible place.
'---------------------------------------------------------------------------------------
Private Sub Form_Load()
' Need to fill the Image() control array with bitmap pictures of cards
' Assume that we have 52 bitmaps - Card_1.bmp to Card_52.bmp.
' This makes it possible to fill the control array in a loop
Dim left As Long
Dim top As Long
Dim fileroot As String
Dim i As Integer
Dim j As Integer
Dim index As Integer
fileroot = "C:\VB6_Progs\Cards\Card_" 'This is where I store the bitmaps
SetImageZero (fileroot) 'Sets Image1(0) with dummy picture and makes it invisible
For i = 0 To 12 'NOTE: Using 0-12 and 0-3 makes calculation of index simpler
top = i * (CARD_HEIGHT + COL_SPACE) + OFFSET_Y
For j = 0 To 3
left = j * (CARD_WIDTH + ROW_SPACE) + OFFSET_X
index = 4 * i + j + 1
Load Image1(index) 'Create the image control for the card
Image1(index).left = left
Image1(index).top = top
Image1(index).Picture = LoadPicture(fileroot & index & ".bmp") 'Set picture for Image1(i)
Image1(index).Visible = True
Next j
Next i
End Sub
'--------------------------------------------------
' When the button is clicked, shuffle the cards
'--------------------------------------------------
Private Sub Start_Click()
ShuffleCardNumbers
End Sub
'--------------------------------------------------------------
' Helper subroutines that can be called from anywhere as needed
'--------------------------------------------------------------
Private Sub ShuffleCardNumbers()
' This shuffles the card image pictures
Dim swap As Integer
Dim posn1 As Integer
Dim posn2 As Integer
Randomize
For swap = 0 To 100
' Get two random positions
posn1 = Int((52 * Rnd) + 1)
posn2 = Int((52 * Rnd) + 1)
' Swap pictures at these positions
If (posn1 <> posn2) Then
Image1(0).Picture = Image1(posn1).Picture
Image1(posn1).Picture = Image1(posn2).Picture
Image1(posn2).Picture = Image1(0).Picture
End If
Next swap
Form1.Refresh
End Sub
Private Sub SetImageZero(ByVal fileroot As String)
Image1(0).Picture = LoadPicture(fileroot + "0.bmp")
Image1(0).Width = CARD_WIDTH
Image1(0).Height = CARD_HEIGHT
Image1(0).left = 0
Image1(0).top = 0
Image1(0).Visible = False
End Sub
Regards
David R
|
|
|
|
|
Thank you very much! I appreciate it!
Yvonne
|
|
|
|
|
Should there be a -1 somewhere in the code, making the array of images to go back one integer?
|
|
|
|
|
This doesn't work, but this is what I'm trying to say:
' Shuffle the deck - end value (100)
Card1 = 0
Card2 = 1
Counter = 0
If Card1 <> Card2 And Counter <= 100 Then
' Get two random image positions
3 Card1 = Int((52 * Rnd) + 1)
Card2 = Int((52 * Rnd) + 1)
' Swap images at these positions
Set tmpImage = Image1(Card1)
Set Image1(Card1) = Image1(Card2)
Set Image1(Card2) = tmpImage
Counter = Counter + 1
ElseIf Card1 = Card2 Then GoTo 3
End If
|
|
|
|
|
I clicked 'Post Message' when I meant to click 'Preview'
I was going to add that you should look at how Dave K gets random number sequence.
It's really how you should do it as well.
Regards
David R
|
|
|
|
|
Thanks for your comments and explanation of your code. It was so easy to understand and made much more sense than what I had. I was trying to do it much more difficult by saying "if one value does not equal the other value, than go ahead and display the images...."
I appreciate it. Thanks.
Yvonne
|
|
|
|
|
Attempting to read Progress 9.1E database from VB.Net. Connection is working and I am able to choose any table within the database. Canned Gridview, Dataset etc. will read the entire query result. The following code will only read the first record of the query ...
Public Class Requisition_Main
Private Sub BTNRefresh1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNRefresh1.Click
Dim DataRead As String = "DSN=[myodbc];Uid=[myusername];Pwd=[mypassword];server=[mydataserver]"
Dim con As New Odbc.OdbcConnection(DataRead)
Dim RecordNum As Odbc.OdbcDataReader
Dim AcctName As Odbc.OdbcDataReader
Dim GLAccount As String = Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + "gl-acc1" + Chr(34) + _
", " + Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + "gl-acc2" + Chr(34) + _
", " + Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + "gl-acc3" + Chr(34) + _
", " + Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + "gl-acc4" + Chr(34)
con.Open()
Dim recordcount As New Odbc.OdbcCommand("Select count(" + Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + "gl-acc1" + Chr(34) + _
") AS RecNum FROM PUB." + Chr(34) + "gl-mstr" + Chr(34) + " " + Chr(34) + "gl-mstr_0" + Chr(34) + _
" WHERE (" + Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + "fisc-yr" + Chr(34) + "=" & InputBox1.Text.ToString() & ")", con)
'
'recordcount = "Select count("gl-mstr_0"."gl-acc1") AS RecNum FROM PUB."gl-mstr" "gl-mstr_0" WHERE ("gl-mstr_0"."fisc-yr"=2004)"
'
RecordNum = recordcount.ExecuteReader()
RecordNum.Read()
CountTextBox.Text = RecordNum(0)
'
'CountTextBox.Text now equals "3918"
'
Dim cmd1 As New Odbc.OdbcCommand("Select " + GLAccount + " FROM PUB." + Chr(34) + "gl-mstr" + Chr(34) + _
" " + Chr(34) + "gl-mstr_0" + Chr(34) + " WHERE (" + Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + _
"fisc-yr" + Chr(34) + "=" & InputBox1.Text.ToString() & " and " + Chr(34) + "gl-mstr_0" + Chr(34) + "." + Chr(34) + _
"gl-acc1" + Chr(34) + "=" & InputBox2.Text.ToString() & ") ORDER BY " + GLAccount + "", con)
'
'cmd1 = "Select "gl-mstr_0"."gl-acc1", "gl-mstr_0"."gl-acc2", "gl-mstr_0"."gl-acc3", "gl-mstr_0"."gl-acc4" FROM PUB."gl-mstr" "gl-mstr_0" WHERE -
' ("gl-mstr_0"."fisc-yr"=2004 and "gl-mstr_0"."gl-acc1"=101) ORDER BY "gl-mstr_0"."gl-acc1", "gl-mstr_0"."gl-acc2", "gl-mstr_0"."gl-acc3", "gl-mstr_0"."gl-acc4""
'
AcctName = cmd1.ExecuteReader()
If AcctName.HasRows Then
AcctName.Read()
TxtGLmstrGLacc1.Text = AcctName.Item("gl-acc1").ToString
TxtGLmstrGLacc2.Text = AcctName.Item("gl-acc2").ToString
TxtGLmstrGLacc3.Text = AcctName.Item("gl-acc3").ToString
TxtGLmstrGLacc4.Text = AcctName.Item("gl-acc4").ToString
End If
AcctName.Close()
cmd1.Dispose()
End Sub
End Class
Any insight would be greatly appreciated.
|
|
|
|
|
Hi,
You made a simple mistake:
If AcctName.HasRows Then
AcctName.Read() <-- this will only read one row
End If
You have to loop the read method:
If AcctName.HasRows Then
While AcctName.Read() <-- this way it keeps reading (one row at a time) until it finds no more rows.
TxtGLmstrGLacc1.Text = AcctName.Item("gl-acc1").ToString 'however this (as you wrote it) will simply replace the result with each read, so it would look like you're only getting the last row
TxtGLmstrGLacc2.Text &= AcctName.Item("gl-acc2").ToString 'try something like this instead; it will add the result of each consecutive read.
TxtGLmstrGLacc3.Text &= AcctName.Item("gl-acc3").ToString
TxtGLmstrGLacc4.Text &= AcctName.Item("gl-acc4").ToString
End While
End If
My advice is free, and you may get what you paid for.
|
|
|
|
|
Great help ... I missed that one
|
|
|
|
|
I have a formula that returns a value as single. In the case that it returns something like 9.3416666666666666666666666666667, I need to use 9.34166 (5 places of precision without rounding). When using Math.Round or Format("#.#####"), the last digit is being rounded to 7 (9.34167).
Is there an easy way to accomplish this?
Any suggestions, ideas, or 'constructive criticism' are always welcome.
"There's no such thing as a stupid question, only stupid people." - Mr. Garrison
|
|
|
|
|
I have a corny method of making the result a string, doing string comp. of where the decimal place to return the correct thing and recasting backing into a single.
Seems like a cheesy way to do it though
Any suggestions, ideas, or 'constructive criticism' are always welcome.
"There's no such thing as a stupid question, only stupid people." - Mr. Garrison
|
|
|
|
|
You'd have to write your own little function to do that. You'd raise 10 to the number of decimal places you need, call it multiplier, then multiply the value in question by this multiplier, truncate the value to an integer, then divide the result by the multiplier.
Private Function RoundOff(ByVal num As Double, ByVal decimalPlaces As Integer) As Double
Dim multiplier As Double = Math.Pow(10, decimalPlaces)
Dim result As Double = Math.Truncate(num * multiplier) / multiplier
Return result
End Function
|
|
|
|
|
Brilliant!
Any suggestions, ideas, or 'constructive criticism' are always welcome.
"There's no such thing as a stupid question, only stupid people." - Mr. Garrison
|
|
|
|
|
Dave, I beleive that credit should be given where it is due.
You have helped me yesterday, and I see you do give of yourself a lot on here, so may I just say thanks.
------------------------------------
"I am always serious about what I do, not necessarily about how I do it."
Tom Baker
|
|
|
|
|
Can I do it with the SQLdataadapter?
I've tried this code -
Dim adapterGIS As SqlDataAdapter = New SqlDataAdapter( _
queryString, connectionGIS)
Dim tblCRW_GIS_Data As DataTable
tblCRW_GIS_Data = dsCRW.Tables("CRW_GIS_Data")
adapterGIS.UpdateCommand = New SqlCommand("ALTER TABLE CRW_GIS_Data ADD (reception1 string(7)", connectionGIS)
adapterGIS.Update(tblCRW_GIS_Data)
without success. No errors, but no new column either.
Thanks
|
|
|
|
|
You can do something like this:
Using SqlConn As New SqlConnection(ConnectString), cmd As New SqlCommand("ALTER TABLE [dbo].[Setup] ADD [TestCol] [nchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL", SqlConn)
SqlConn.Open()
cmd.ExecuteNonQuery()
'populate your datatable after the column change
SqlConn.Close()
End Using
Take your raw sql statement (meaning: "ALTER TABLE CRW_GIS_Data ADD (reception1 string(7)") and run in it SQL first and fix the errors. String (use CHAR, VARCHAR, etc) is not supported in SQL.
Cheers!
Any suggestions, ideas, or 'constructive criticism' are always welcome.
"There's no such thing as a stupid question, only stupid people." - Mr. Garrison
|
|
|
|
|
Thanks that looks like it.
Something odd though.... The query checks out in management studio 08 (SQL).
I let it run for 20 minutes and it was still executing. I killed it. Seems an awful long time to add one column. The table only has 30,000 records in it
|
|
|
|