Diskuze: změna hodnoty proměnné a vyvolání akce

C# .NET .NET (C# a Visual Basic) změna hodnoty proměnné a vyvolání akce American English version English version

Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

Ahoj,
potřeboval bych něco, co by provedlo danou akci při změně hodnoty proměnné. Mám asi 10 tlačítek, každé proměnné přidá nebo ubere určitý číslo a podle hodnoty proměnné se potom mění něco jiného. A psát pod každý z 10 tlačítek

if ( a == 10)
//něco
else if (a == 15)
//atd

mi 1. příde nepřehledné a navíc by 10x70 řádků ten kód asi trošku prodloužilo a za 2. s tim ms visual určitě něco umí.
Na zkoušku sem tam zkusil napsat

 private void a_ValueChanged(object sender, EventArgs e)  //a mam proměnnou
        {
            MessageBox.Show(Text = "");
        }
//tohle by mi teoreticky mělo při změně hodnoty ukázat msgbox

ale nic se nestalo, ale error mi to nedávalo. Tak jak na to?

Editováno 30.5.2013 16:31
Odpovědět 30.5.2013 16:29
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Adam Ježek
Kit:

Dej ten test i reakci přímo do setteru.

Nahoru Odpovědět 30.5.2013 16:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Kit
Adam Ježek:

mohl by jsi psát ohleduplně k mému skillu?

Nahoru Odpovědět 30.5.2013 16:36
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Odpovídá na Adam Ježek
Michal Žůrek (misaz):

skil víceméně nic neznamená

použij místo proměnné vlastnost
http://msdn.microsoft.com/…9fsa0sw.aspx

podmínku piš do set

Editováno 30.5.2013 16:43
Nahoru Odpovědět 30.5.2013 16:43
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Adam Ježek
Kit:

Proměnná "a" zcela jistě není samostatná proměnná, ale nějaká vlastnost nějakého objektu. Obvykle ji nastavuješ asi nějak takto:

int a { get; set; }

Ten test na hodnotu a reakci můžeš umístit přímo do sekce set, i když v tomto případě by asi bylo vhodnější napsat metodu setA(hodnota) nebo ještě lépe metodu addA(hodnota), která se postará o požadovanou reakci. V tlačítku pak jen zavoláš objekt.addA(2) pro přičtení "2" k vlastnosti A. Metoda se postará o zbytek.

Nahoru Odpovědět 30.5.2013 16:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Kit
Adam Ježek:

mam ji jen zadanou

float a

a potom u tlačítek sou věci typu

private void button1_Click(object sender, EventArgs e)
       {
           a = a + 0.15;
       }

a aby pod každym byly hromady podmínek, to bych byl radši, aby to bylo někde tělo pro tu podmínku, ale co sem pochopil, tak to asi nejde

Nahoru Odpovědět 30.5.2013 16:51
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Adam Ježek
David Čápka:

Použij sender, podívej se sem, kde se to řeší: http://www.itnetwork.cz/…rms-aplikace

Nahoru Odpovědět 30.5.2013 16:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Adam Ježek
Kit:

Ale v jakém objektu ji máš? Test i reakce se přidají do vlastností toho "a".

Nahoru Odpovědět 30.5.2013 16:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Kit
Adam Ježek:

tak nejdřív, co myslíš tim testem? jinak vlastnosti sou jenom typ proměnné, to float, ne? a jestli tim objektem myslíš tělo daného tlačítka nebo tak, tak mam ji založenou na začátku, eště před private void form1_load a pod ní mam pak ty tlačítka a pod ně sem zkusil napsat to
private void a_ValueChanged(ob­ject sender, EventArgs e)
{
//něco
}
jinak proměnnná funguje, když sem to zkusil přes if dát do kódu toho tlačítka, tak msgbox ukazovalo

Nahoru Odpovědět 30.5.2013 17:07
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Adam Ježek
Kit:
if ( a == 10) ...

je test hodnoty. Můžeš ho dát dovnitř proměnné (tedy vlastnosti) "a" nějakého objektu. Tím nemyslím tlačítko, protože tlačítko tomu objektu má za úkol poslat zprávu, aby se změnila hodnota "a". Objekt to provede, vyhodnotí "a" a udělá příslušnou reakci.

Určitě se nesnaž změnu "a" dělat uvnitř tlačítka.

Nahoru Odpovědět 30.5.2013 17:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Redaktor
Avatar
matesax:
private int a = 0xFF;

Action ValueChanged { get; set; }

public int Value
{
    get { return a; }

    set
    {
        a = value;
        ValueChanged();
    }
}

...

ddd.ValueChanged = () => MessageBox.Show("Hodnota nastavena na" + ddd.Value);

Téže by to šlo anonymní funkcí atd...

Editováno 30.5.2013 17:52
 
Nahoru Odpovědět 30.5.2013 17:49
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Adam Ježek
Petr Nymsa:

PJak už zaznělo -> používej vlastnosti. Pokud checeš zaregovat na změnu, zareaguj přímo ve vlastnosti. Jinak na to tvé reagování -> jemnuje se to Event (Událost) a zatím se tím nezatěžuj. Udělej to tedy jak to píšou ostatní

Nahoru Odpovědět 30.5.2013 18:01
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na matesax
Jan Vargovský:

Správně by mělo být:

set
    {
        a = value;
        if(ValueChanged != null)
            ValueChanged();
    }

ne?

 
Nahoru Odpovědět 31.5.2013 2:00
Avatar
matesax
Redaktor
Avatar
Odpovídá na Jan Vargovský
matesax:

No jo - detail... :) Místo toho jej můžeš initializovat v konstruktoru a nebudeš muset větvit - což mi přijde lepší...

private int a = 0xFF;

Action ValueChanged { get; set; }

public int Value
{
    get { return a; }

    set
    {
        a = value;
        ValueChanged();
    }
}

Konstruktor:

ValueChanged = new Action();

...

ddd.ValueChanged = () => MessageBox.Show("Hodnota nastavena na" + ddd.Value);
Editováno 31.5.2013 5:45
 
Nahoru Odpovědět 31.5.2013 5:43
Avatar
matesax
Redaktor
Avatar
Odpovídá na Jan Vargovský
matesax:

A když už - tohle je výjimka - takže try blok...

 
Nahoru Odpovědět 31.5.2013 5:56
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Proč vytvářet něco, co se nepoužívá ? Chápu, že ten optimalizer VS to asi vymaže z kódu, když to nebude nikde implementované, ale i tak ... :)

 
Nahoru Odpovědět 2.6.2013 22:25
Avatar
matesax
Redaktor
Avatar
Odpovídá na Jan Vargovský
matesax:

Co to tu zase máme za výlev? :) Ty tu vidíš rozhraní?

Editováno 3.6.2013 5:57
 
Nahoru Odpovědět 3.6.2013 5:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.