views:

512

answers:

4

I am trying to place a value (from an object) in a variable and place it in a textbox in a form.

Here is the form code:

public Form1(Deck mainDeck)
    {
        InitializeComponent();
        int Val = mainDeck.ReturnCard(10);
        textBox1.Text = Val.ToString();
    }

mainDeck is an object in my Program.cs file

The problem line is this one: int Val = mainDeck.ReturnCard(10);

Oops, wrong error. This is the real one:

Error 1 The name 'mainDeck' does not exist in the current context C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.cs 17 23 Pcard

Here is my Program.cs file:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace Pcard
{
    class Deck
    {
        public Deck()
        {
            // Assign standard deck to new deck object
            //   int j;
            for (int i = 0; i != currentDeck.Length; i++)
            {
                currentDeck[i] = originalCards[i];
            }
            // Fisher-Yates Shuffling Algorithim    ---   Do initial shuffle
            Random rnd = new Random();

            for (int k = currentDeck.Length - 1; k >= 0; k--)
            {
                int r = rnd.Next(0, k + 1);

                int tmp = currentDeck[k];
                currentDeck[k] = currentDeck[r];
                currentDeck[r] = tmp;
            }
        }
        public void Shuffle()
        {
            Random rnd = new Random();

            for (int k = currentDeck.Length - 1; k >= 0; k--)
            {
                int r = rnd.Next(0, k + 1);

                int tmp = currentDeck[k];
                currentDeck[k] = currentDeck[r];
                currentDeck[r] = tmp;
            }
        }
        public int[] ReturnDeck()
        {
            return currentDeck;
        }
        public int ReturnCard(int num)
        {
            return currentDeck[num];
        }

        public int[] originalCards = new int[54]
        {
            0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
            0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,
            0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
            0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D,
            0x50, 0x51
        };
        private int[] currentDeck = new int[54];

    }
   public class Program
    {
        static void Main(string[] args)
        {
            // Create a Deck object
            Deck mainDeck = new Deck();
            Console.WriteLine("Here is the card array:");
            for (int index = 0; index != 54; index++)
            {
                string card = mainDeck.ReturnCard(index).ToString("x");
                Console.WriteLine("0x" + card);
            }
            //Return 10th Card
            int PickCard = mainDeck.ReturnCard(10);
            Console.WriteLine("Here is the 10th Card");
            Console.WriteLine("0x" + PickCard);
            //Shuffle
            mainDeck.Shuffle();
            Console.WriteLine("Shuffling..");
            PickCard = mainDeck.ReturnCard(10);
            Console.WriteLine("Here is the 10th card now: 0x" + PickCard);
            Application.Run(new Form1(maindeck));
        }
    }
}

Edit: Okay, I am passing mainDeck to the Form, but I am now getting a different error: Error 1 Inconsistent accessibility: parameter type 'Pcard.Deck' is less accessible than method 'Pcard.Form1.Form1(Pcard.Deck)' C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.cs 14 16 Pcard

Edit: Edit: Alright, I now have this working, but I ran into a related problem, so I would rather put it here than in a new question.

Passing mainDeck to the Form1 works fine, but what about if I want to have a button click call a method in this object. I tried passing mainDeck like this:

 private void button1_Click(object sender, Deck mainDeck, EventArgs e)
        {
            mainDeck.Shuffle();
        }

I get this error:
Error 1 No overload for 'button1_Click' matches delegate 'System.EventHandler' C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.Designer.cs 51 35 Pcard

GRR!

+1  A: 

Assuming mainDeck is static, and is either public or internal, you can access it via

int val = Program.mainDeck.ReturnCard(10);
Judah Himango
It is not static. Does it have to be? I would like to keep the values in different object instances separate.
Biosci3c
Yes, because you don't create an instance of the `Program` class - the `Main` method that runs is a static method. Alternatively (and correctly), as Pandincus suggests, you should just pass `maindeck` as a reference to `Form1` (through constructor or property).
Nader Shirazie
+6  A: 

The easiest way would be to change the form's constructor to pass in mainDeck.

public Form1(Deck mainDeck)
{
    InitializeComponent();
    int Val = mainDeck.ReturnCard(10);
    textBox1.Text = Val.ToString();
}

If you needed to refer to it in other parts of your forms code, you could keep a private member variable lying around ...

private Deck _mainDeck;

public Form1(Deck mainDeck)
{
    InitializeComponent();
    _mainDeck = mainDeck;
    int Val = _mainDeck.ReturnCard(10);
    textBox1.Text = Val.ToString();
    }
}

private void SomeOtherMethod()
{
    int blah = _mainDeck.Blah();
}

And then in your Program.cs file ...

Application.Run(new Form1(mainDeck));

Edit: In response to your new error involving the accessibility of the Deck class, it is because your Deck class is not public. Add the public keyword to the class declaration, so:

namespace Pcard
{
    public class Deck
    {
        // and so on ... 

Note that it might be cleaner to keep your Deck class in a separate .cs file, such as Deck.cs.

Pandincus
+1  A: 

The problem is that you trying to refer to mainDeck as a global variable, which isn't allowed in C#.

The error you are getting is because the compiler assumes that mainDeck is a type that your are trying to reference and doesn't have a definition for mainDeck.

Obviously this is not what you want. To solve the problem you will have to make the reference available to mainDeck with a static variable from your mainDeck's class or perhaps use a Singleton pattern to resolve the problem.

Edit: After you added your code, it might be the simplest to pass the mainDeck reference to 'Form1`. Either as part Form1's constructor or a property that can be set.

Philip Fourie
+1  A: 

The line Deck mainDeck = new Deck(); just creates a local variable with name mainDeck... Which is accessible only in the Main() Method...

Place the Declaration above the Main method in the class... Make the program class public and the maindeck as public static... like this

public class Program 
{ 
       // Create a Deck object 
   public static Deck mainDeck = new Deck(); 
    static void Main(string[] args) 
   { 
     .....

   }

Then you can access from your Form as

 int Val = Program.mainDeck.ReturnCard(10);

Hope this helps.

The King
I thought about that, but I would like to have objects that exist even when the form is closed (but the form is still running).
Biosci3c
I dont get you... Here the MainDeck is not dependent on the Form... It is static and dependant on the Program Class... So even when your form is closed, you can still access the MainDeck from the Program Class
The King
I finally get it. I was misunderstanding what you meant by static. I thought you meant defining a static class, but you mean a static object. Whew, works great now.
Biosci3c