Een variabele waarde toekennen (beginners vraag?)

Status
Niet open voor verdere reacties.

yoghurt

Gebruiker
Lid geworden
17 jan 2007
Berichten
11
Ik heb een (volgens mij) heel simpel te realiseren idee. Het lukt mij alleen niet.
Je maakt in MS visual studio een standaard windows form. En zet daar een aantal buttons op. Een paar van deze buttons geef je een kleur. Zoiets als dit:
attachment.php


Hiermee wil ik het volgende maken. Als ik bijvoorbeeld op button D1 druk (Color.Gold), en daarna op bijv. C3. wil ik dat D1 grijs wordt, en C3 geel. Ik hoopte dit te bereiken door, als ik op een knop druk dat deze kleur dan in de variabele "Kleur" wordt gezet. (Kleur = color.LimeGreen). En dat vervolgens op een een andere kleur druk, dat de kleur van de knop dan de kleur van de variable “Kleur” wordt. (is het nog te volgen?)
Als ik echter de variable "string" gebruik krijg ik de melding: "Cannot implicitly convert type 'System.Drawing.Color' to 'string' ".

Waarschijnlijk is dit niet helemaal de goede aanpak maar als jullie suggestie hebben over hoe het beter kan, graag! C# valt me nog al lastig iig.:confused:

Bij voorbaat dank!
 

Bijlagen

  • Chekje.webp
    Chekje.webp
    5,7 KB · Weergaven: 382
Volgens mij gebruik je nu een variabele van het type string, terwijl je een variabele van het type Color wilt hebben. De foutmelding "Cannot implicitly convert type 'System.Drawing.Color' to 'string'" geeft dit ook aan: jij probeert een instantie van het type System.Drawing.Color toe te wijzen aan een variabele van het type string. Geef de variabele dus een ander type, dan moet het goed gaan. :thumb:
 
Ik heb het geprobeerd, maar volgens mij pak ik het ook helemaal verkeerd aan.
Ik probeer een schaakbord te maken, om wat meer van C# te leren. Maar omdat een meteen een schaakbord maken mij wat te moeilijk lijkt, wil ik graag beginnen met dit:
attachment.php

Als ik nu bijv. op A1 druk en daarna op een andere knop, dan is het de bedoeling dat ze van kleur wisselen. Klinkt redelijk simpel, maar het mij valt mij behoorlijk tegen. :(
Suggesties zijn welkom! :)
 
Volgens mij was je al op de goede weg. Bij een druk op een knop sla je de kleur van die knop op in een variabele. Druk je op een volgende knop, dan geef je die de kleur van de variabele. Je zult daarbij dan wel even moeten onthouden of de variabele 'gezet' is. Dit kan door een extra variabele, maar ook door een speciale waarde van de variabele die de kleur onthoudt. Als die bijvoorbeeld null is, dan weet je dat een druk op een knop het 'opslaan' van de kleur betekent.

Verder moet je wel onthouden op welke knop het eerst gedrukt is, want die moet uiteindelijk weer een andere kleur krijgen. Je kunt ook alleen opslaan op welke knop je oorspronkelijk gedrukt hebt, want daar kun je dan de kleur ook weer uit afleiden.

Wat heb je tot zover al?
 
Volgens mij was je al op de goede weg. Bij een druk op een knop sla je de kleur van die knop op in een variabele. Druk je op een volgende knop, dan geef je die de kleur van de variabele.
Dat was in de eerste instantie ook de bedoeling. Echter lukte het mij niet om de de kleur van de button in een variabele te laden.

Dit probeerde ik als volgt:

Code:
private void A1_Click(object sender, EventArgs e)
        {
            string kleur = A1.BackColor;
            //Color.RoyalBlue
        }
Maar hier ging het meteen al mis. Het plaatsen van de kleur wou ik als volgt aanpakken:

Code:
private void A2_Click(object sender, EventArgs e)
        {
            A2.BackColor = String kleur;
        }
Maar dat werkte ook niet.

Ik ben ook niet echt bekend met variabelen in C#, dus ik weet niet echt hoe ik dit moet aanpakken. Daarnaast denk ik dat het überhaupt geen goed idee is om de code allemaal onder de button_click te zetten. Maar ik weet ook niet hoe het anders moet...

In ieder geval had ik het wel ongeveer zo als jou uitgedacht, maar het daadwerkelijk realiseren valt nog al tegen. :confused:
 
Je slaat hier de kleur op in een variabele 'string kleur'. Je maakt hem dus van het type 'string'. De kleur die je erin probeert op te slaan is echter van het type 'Color'. Maak er dus eens van: 'Color kleur =A1.BackColor;'
 
Ik heb het zo geprobeerd:

Code:
private void A1_Click(object sender, EventArgs e)
        {
            Color kleur = A1.BackColor;
            //Color.RoyalBlue;
        }

private void A2_Click(object sender, EventArgs e)
        {
            A2.BackColor = Color [COLOR="Red"]kleur[/COLOR];
        }

Alleen hij geeft een ; expected bij de rode "Kleur". Enig idee waarom?
 
Als je een variable wil gebruiken moet je deze eerst aanmaken, dit gebeurt door eerst het type te vermelden en dan de naam, gevolgd door een puntkomma.
Wanneer je die variabele dan wil gebruiken volstaat het om enkel de naam te vermelden.

vb: de achtergrondkleur van A1 in A2 steken, nedat A1 een andere kleur kreeg
Code:
Color kleur;
kleur = A1.BackColor;
A1.BackColor = Color.Grey;
A2.BackColor = kleur;

--Johan
 
Bovenstaande werkt inderdaad wel, maar nu is de hele dynamiek eruit.
Ik wil iets dergelijks als dit maken (deze code onder elke button, en dan de button naam aanpassen):

Code:
private void A2_Click(object sender, EventArgs e)
        {
        if (Color Kleur = null);
            {
            Color kleur = A2.BackColor;
            Color kleur = null;
            }
       else
            {
            A2.BackColor = Color kleur;
            }
        }
Echter dit werkt niet omdat hij weigert de waarde van "Color Kleur" te onthouden buiten zijn eigen Private void.
Ik word hier wanhopig van! :(
 
Laatst bewerkt:
Je kunt een statische variabele voor de hele klasse gebruiken die de knop onthoudt waarop het laatst geklikt is. Daar kun je dan de kleur uit halen en van die betreffende knop kun je ook de kleur weer veranderen. Je moet inderdaad een variabele bijhouden die voor alle instanties van knop zichtbaar is.
 
Oke ik heb het nu gedeeltelijk voorelkaar.
Je kunt de Variabele buiten een Click gebeurtenis bekend maken door deze in de form te zetten:

Code:
public partial class Form1 : Form    
    {
        private Color kleur;
        private int waarde;

        public Form1()

        private void A1_Click(object sender, EventArgs e)
        {
            //kleur = A1.BackColor;
           if (waarde == 0) 
                {
                kleur = A1.BackColor;
                waarde = 1;
                }
           else
                {
                A1.BackColor = kleur;
                waarde = 0;
                }
           
            //Color.RoyalBlue;
        }

:D
 
Ik herriner me nog vagelings de structuur die VB gebruikt, en ik weet hoe klasses in C++ werken. Als ik correct ben staat die private void... in een Form-klasse ofzo. Dan kan je een variabele daarin proberen maken.

Werkt dit ?
Code:
private Color kleur;
private void A2_Click(object sender, EventArgs e)
{
        //als er geen kleur is opgeslagen, de kleur van de button opvragen
        if (this.kleur == null) {
                this.kleur = A2.BackColor;
        } else {
                //er is al een kleur bewaard, deze aan A2 toekennen, en de bewaarde kleur wissen
                A2.BackColor = this.kleur;
                this.kleur = null;
        }
}

--Johan


[edit]
je was me voor, goed dat je dat zelf gevonden hebt :thumb:
zoals je ziet kan je zonder die waarde werken als je op de inhoud van kleur test.
[/edit]
 
Laatst bewerkt:
Beste,

Hier een voorbeeldje met 3 knoppen,
Een andere oplossing ( Ik zie het dan ook in jou schaak termen ) is om na te gaan de hoeveelste klik het al is.

Gebruikte variablen

Code:
		private System.Windows.Forms.Button button1;
		private System.Windows.Forms.Button button2;
		private System.Windows.Forms.Button button3;
		private System.Windows.Forms.Button Laatste; // DIT IS GEEN KNOP OP HET SCHERM !!!!!
		private System.Drawing.Color Kleur;
		private int Teller = 0 ;

Geef twee knoppen een kleur bij het laden van de form

Code:
		private void Form1_Load(object sender, System.EventArgs e)
		{
			this.button1.BackColor = System.Drawing.Color.Red;
			this.button2.BackColor = System.Drawing.Color.Green;
		}

Dit voeg je toe aan de klock event van elke knop,
Zorg er wel voor dat je de juiste benaming van je knop gebruikt.
In dit voorbeeld button1,button2 en button3

Code:
		private void button1_Click(object sender, System.EventArgs e)
		{

			// Afvangen of het de eerste, de tweede klik is
			// Switch kiest de juiste case functie, naargelang de waarde van Teller
	        switch (Teller)
		    {
			    case 0:
					//Eerste Klik
					// Geef Laatste (Button) Als waarde de geklikte knop.
					Laatste = (Button)sender;
					//Geef Kleur de kleur waarde van de ingedrukte knop
					Kleur = button1.BackColor ;
					//Verhoog de Teller
					Teller ++;
					//Verlaat de switch functie
					break;

				case 1:
					//Er werd reeds een knop gedrukt, dus hebben we al waardes in de variablen.
					//maak een tussentijdse variable (Niet Global) voor de nieuwe kleur
					System.Drawing.Color Nieuwe_Kleur = new System.Drawing.Color();
					//Vul de variable met de kleur van de knop die gedrukt werd
					Nieuwe_Kleur = button1.BackColor;
					//Nu de gegevens van d laatste knop hebben, kunnen we deze gaan toekennen
					//aan de vorige knop (Laatste), en andersom.
					//Eerste Knop nieuwe kleur geven
					Laatste.BackColor = Nieuwe_Kleur;
					//Laatste knop nieuwe kleur geven
					button1.BackColor = Kleur;
					//Zet de teller weer op 0
					Teller = 0;
					//Verlaat de switch functie
					break;
			}

		}

Veel plezier.:)
 
Beste,

Hier een voorbeeldje met 3 knoppen,
Een andere oplossing ( Ik zie het dan ook in jou schaak termen ) is om na te gaan de hoeveelste klik het al is.

[...]

Veel plezier.:)

Werkt perfect, harstikke bedankt! :thumb:
Nu nog kijken hoe ik van die kleuren schaakstukken kan maken! :D
 
Oke, nu wil ik die zelfde code gebruiken alleen deze in plaats van kleuren gebruik laten maken van plaatjes:

Code:
    public partial class Form1 : Form
    {
        private Button Laatste;
        private int Teller = 0;
        private Image Plaatje;
Code:
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.BackgroundImage = Schaken2.Properties.Resources.pion;
        }

Code:
private void button1_Click(object sender, EventArgs e)
        {
            switch (Teller)
            {
                case 0:
                    Laatste = (Button)sender;
                    Plaatje = button1.BackgroundImage;
                    Teller++;
                    break;

                case 1:
                    Image Nieuw_plaatje = new Image();
                    Nieuw_plaatje = button1.BackgroundImage;
                    Laatste.BackgroundImage = Nieuw_plaatje;
                    button1.BackgroundImage = Plaatje;
                    Teller = 0;
                    break;
            }
        }

Alleen hier krijg ik de foutmelding: "Cannot create an instance of the abstract class or interface 'System.Drawing.Image' ".
Nu heb ik het vermoeden dat Image gewoon niet de goede variabele is om een Backgroundimage in te zetten. Maar ik kan er ook niet achter komen welke ik dan wel moet hebben.
Weet iemand hier de juiste variabele? :)
 
Schaakbord

Beste,

Voeg een ImageList toe aan je Form.
Aan deze Image list kan je je verschillende prentjes koppelen, en deze krijgen allen naargelang de volgorde een index toegewezen.

In plaats van een kleur op te slaan zoals voorheen, ga je nu de index uit de imagelist opslaan.

Code:
        //private System.Drawing.Color Kleur;
        int ImageIndexNo = 0;

Let er wel op dat je bij de propertys van je button, de desbetreffende imagelist selecteerd voor de property ImageList. Deze wordt zichtbaar van het moment je een imagelist hebt toegevoegd aan je Form.

De verder logica blijft hetzelfde.
In de form load, ken je de juiste image index toe

Code:
        private void Form1_Load(object sender, EventArgs e)
        {
            //this.button1.BackColor = System.Drawing.Color.Green;
            //this.button2.BackColor = System.Drawing.Color.Red;
            this.button1.ImageIndex = 0;
            this.button3.ImageIndex = 1;
        }

De ButtonKlick event ziet er nu als volgt uit.

Code:
        private void button1_Click(object sender, EventArgs e)
        {

            // Afvangen of het de eerste, de tweede klik is
            // Switch kiest de juiste case functie, naargelang de waarde van Teller
            switch (Teller)
            {
                case 0:
                    Laatste = (Button)sender;
                    ImageIndexNo = (int)button1.ImageIndex;
                    Teller++;
                    break;

                case 1:
                    int Nieuwe_Imgh = button1.ImageIndex;
                    button1.ImageIndex = ImageIndexNo;
                    Laatste.ImageIndex = Nieuwe_Imgh;
                    Teller = 0;
                    break;
            }

        }

Opmerking : Een button zonder image çTekening) krijgt de index -1

Veel plezier. Laat even weten of het is gelukt he.
Groeten Harry
 
Oke, het begint nu al aardig op een schaakspel te lijken. :D Ik heb een if else statement toegevoegd die er voor zorgt dat je nu ook stukken kan slaan. En ik ben nu bezig met een label welke aangeeft dat ik of "een stuk moet selecteren" of "een locatie voor het stuk moet kiezen".

Code klikgebeurtenis:
Code:
        private void A7_Click(object sender, EventArgs e)
         {
            switch (Teller)
            {
                case 0:
                    Laatste = (Button)sender;
                    ImageIndex = (int)A7.ImageIndex;
                    Teller++;
                    Labeltext++;
                    break;

                case 1:
                    if (ImageIndex == -1)
                    {
                        int Nieuwe_Imgh = A7.ImageIndex;
                        A7.ImageIndex = ImageIndex;
                        Laatste.ImageIndex = Nieuwe_Imgh;
                        Teller = 0;
                        Labeltext = 0;
                    }
                    else
                    {
                        int Nieuwe_Imgh = -1;
                        A7.ImageIndex = ImageIndex;
                        Laatste.ImageIndex = Nieuwe_Imgh;
                        Teller = 0;
                        Labeltext = 0;
                    }
                    break;
            }
        }
Code label:
Code:
            switch (Labeltext)
            {
                case 0:
                    Label10.Text = "Kies een schaakstuk om de verplaatsen";
                    break;

                case 1:
                    Label10.Text = "Kies de locatie voor het schaakstuk";
                    break;
            }
Ik weet alleen niet waar ik die label code moet neerzetten. De plekken die ik tot nu toe heb geprobeerd werken niet.
Iemand enig idee?
 
Zet de code in een aparte methode en roep die elke keer aan als de tekst moet veranderen. Bijvoorbeeld elke keer als je de waarde van Labeltext aanpast (zoals na Labeltext++).
 
Gebruik van een label

Beste,

Je hebt dus 2situaties

1. Je moet een stuk selecteren
2. Je moet een nieuwe positie kiezen

Dezelfde opties heb je in de Button Click events

Code:
private void A7_Click(object sender, EventArgs e)
         {
            switch (Teller)
            {

               // Optie 2
                case 0:
                    Laatste = (Button)sender;
                    ImageIndex = (int)A7.ImageIndex;
                    Teller++;
                    Labeltext++;
                    break;

                case 1:
                    if (ImageIndex == -1)
                    {
 
               // Optie 1

                       int Nieuwe_Imgh = A7.ImageIndex;
                        A7.ImageIndex = ImageIndex;
                        Laatste.ImageIndex = Nieuwe_Imgh;
                        Teller = 0;
                        Labeltext = 0;
                    }
                    else
                    {

               // Optie 1

                        int Nieuwe_Imgh = -1;
                        A7.ImageIndex = ImageIndex;
                        Laatste.ImageIndex = Nieuwe_Imgh;
                        Teller = 0;
                        Labeltext = 0;
                    }
                    break;
            }
        }

Je hoeft dus geen extra teller te maken voor je label.
Je kan gewoon direct in de drie opties je text toekennen.

Code:
private void A7_Click(object sender, EventArgs e)
         {
            switch (Teller)
            {
                case 0:
                    Laatste = (Button)sender;
                    ImageIndex = (int)A7.ImageIndex;
                    Teller++;
                    // Optie 2 , Het eerste stuk is geselecteerd.
                    Label1.Text = "Selecteer positie";

                    break;

                case 1:
                    if (ImageIndex == -1)
                    {
                        int Nieuwe_Imgh = A7.ImageIndex;
                        A7.ImageIndex = ImageIndex;
                        Laatste.ImageIndex = Nieuwe_Imgh;
                        Teller = 0;
                     // Optie 1 , Het eerste stuk is gesplaatst
                    Label1.Text = "Selecteer een stuk";
                    }
                    else
                    {
                        int Nieuwe_Imgh = -1;
                        A7.ImageIndex = ImageIndex;
                        Laatste.ImageIndex = Nieuwe_Imgh;
                        Teller = 0;
                     // Optie 1 , Het stuk is gesplaatst
                    Label1.Text = "Selecteer een stuk";
                    }
                    break;
            }
        }

Bij het opstarten moet je de text van je label op "Selectee text zetten"

Hoop dat dit is wat je zocht.
MLaat even weten of dit helpt :-)

Groeten Harry
 
Bedankt!, maar ik was er zelf ook al achter gekomen dat het zo kon. :o Ik had het hier even moeten zeggen, maar het was mij even ontschoten.
In ieder geval super dat het het toch even voor mij hebt neergezet. Het begint nu al aardig op een schaakspelletje te lijken. Zodra het 'af' is zal ik hier even een linkje neerzetten. ;)

greets,
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan