Delegát – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Delegát – .NET – Fórum – Programujte.comDelegát – .NET – Fórum – Programujte.com

 

Tayson0
Stálý člen
15. 8. 2013   #1
-
0
-

Zdravim.

Mam vo forme event na stlacenie tlacidla. Mam tam aj pomocnu premennu button ktora ak je true tak je tlacidlo zelenej farby a ak je false tak je tlacidlo cervenej farby. Problem je ale v tom ze mam triedu a v tej triede mam spravenu vynimku cez try a catch. Ak nastane ale vynimka potrebujem nastavit tlacidlo cize premennu vo forme a neviem ci to mam robit cez delegata. Dakujem za vsetky rady.

Nahlásit jako SPAM
IP: 158.193.105.–
Evzen+2
Návštěvník
16. 8. 2013   #2
-
0
-

Ahoj,

jestli jsem to pochopil, tak máš minimálně dvě třídy, jedna pro Form a druhá MyClass, kde máš metodu s try-catch blokem.

Zkrátka potřebuješ mít k dispozici referenci na Form ve třídě MyClass. Tak si prostě rozšiř kontruktor u MyClass o položku Form a ulož si referenci třeba do property. Pak v block catch zavoláš MyClass a specifickou metodu, která přenastaví barvu.

Pokud to chceš mít čistější, tak si udělej interface IForm, kde budeš mít nadefinovaný předpis metody, která mění barvičky na tlačítku a do konstruktoru MyClass nebudeš vkládat Form, ale IForm.

public interface IForm
{
  void ChangeButtonColor(Color color);
}

public class Form : IForm
{
  public void ChangeButtonColor(Color color)
  {
    // implementace
  }
}

public class MyClass
{
  public IForm Form { get; set; }

  public MyClass(IForm form)
  {
    Form = form;
  }

  public void DoWork()
  {
    try
    {
      // do something
    }
    catch (Exception)
    {
       Form.ChangeButtonColor(Colors.Red);
    }
  }
}

Pojmenování samozřejmě přiohni pro svoje potřeby, stejně tak předpis funkce pro změnu barvy.

Samozřejmě nezapomeň při inicializaci třídy MyClass předat referenci formu. Nevím, kde to inicializuješ, ale jestli přímo ve Formu, tak stačí něco takového:

MyClass class = new MyClass(this);

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
Tayson0
Stálý člen
20. 8. 2013   #3
-
0
-

#2 Evzen
No konretne mam form1 a jednu triedu. No vo forme mam nastavene:

if(button==false)

{

//tu si nastavujem aby farba potom tlacidla ak je vypnute bola zelena a aby boli vsetky textboxy zakazane

}

if(button==true)

{

//tu si nastavujem aby farba tlacidla bola ak je zapnute cervena a aby boli vsetky textboxy povolene

}

tak ako zapinam a vypinam tlacidlo tak sa menia farby povoluju alebo zakazuju textboxy.

Problem je ale v tom ze mam v triede blok try a catch kde ak spustim tlacidlo a nastane vynimka chcem aby automaticky vyplo tlacidlo cize dalo do povodneho vypnuteho stavu. Len neviem ako v triede konretne v bloku catch zmenit tie hodnoty textboxov a buttonu.

Nahlásit jako SPAM
IP: 213.81.131.–
Petr Kubík
~ Anonymní uživatel
2 příspěvky
20. 8. 2013   #4
-
0
-

Ahoj, Evžen ti nvarhnul strategii s návrhovým vzorem Servant (jestli se nepletu). Stejně tak máš možnost použít událost ve tvé třídě, nebo předání delegáta (jak sám navrhuješ). Cest je mnoho, stačí si vybrat. Protože neznáme přesně tvůj kód - jen částečný popis - těžko ti radit víc.

Nahlásit jako SPAM
IP: 194.50.240.–
Evzen+2
Návštěvník
20. 8. 2013   #5
-
0
-

#4 Petr Kubík
Hezky řečeno :)

Zkrátka, sto lidí, sto chutí.

Evžen

Nahlásit jako SPAM
IP: 88.101.117.–
Tayson0
Stálý člen
20. 8. 2013   #6
-
0
-

#5 Evzen
Dá sa to spraviť aj tak, že si zmenim modifikatory private na internal vsetkych buttonov aj textboxov a potom si v triede urobim :

Form1 f1 = Application.OpenForms["Form1"] as Form1;

 f1.textRp.Enabled = false; //takto pristupujem a menim

Nahlásit jako SPAM
IP: 158.193.105.–
Evzen+2
Návštěvník
21. 8. 2013   #7
-
0
-

#6 Tayson
Ahoj,

samozřejmě taky možnost. Ale hezčí bude, když tu logiku zapouzdříš do metody a tou budeš obsluhovat tlačítka, textBoxy a jiné. 

Vyprdni se nanávrhové vzory a ber to z ryze praktického hlediska. Pokud vystavíš takto ty kontrolky a modifikátory, tak je budeš moct měnit z X míst v assembly. Teď třeba přemýšlíš jen o jednom místě, ale nikdy nevíš kde všude se to zvrhne. 

Nakonec budeš toto potřebovat upravit, např. budeš chtít přidat ještě jednu kontrolku, která bude reagovat na změnu toho modifikátoru a budeš to muset dělat na 10ti místech a testovat, jestli se to vždy chová tak, jak má.

Takhle to prostě můžeš zapouzdřit do jedné metody, tu vystavíš a upravuješ jen na jednom místě. 

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
Tayson0
Stálý člen
21. 8. 2013   #8
-
0
-

#7 Evzen
To co som pisal hore to ine riesenie ako mas ty tak nefunguje moc. Chybu sice nehlasi ale nezmeni premenne vobec ako potrebujem. Skusam to tvoje riesenie a mam stym trosku problem.

Neviem ci som to mal dopisat ale na koniec do formu som dopisal

public interface IForm
{
        void initial_value();
}

a pod to som dopisal

public class Form : IForm
        {
            public void initial_value()
            {
                listen.Text = "Listen";
                listen.BackColor = Color.Lime;
                textLp.Enabled = true;
                textRp.Enabled = true;
                textIp.Enabled = true;
                textSend.Enabled = false;
                
            }
        }

Ako vravim neviem ci som to mal dopisat pretoze vyssie mam napisane public class Form1:Form .

A pri tychto premennych mi vypisuje ze su non static.

Do triedy mam zapisat:


public IForm Form { get; set; }
upravit konstruktor a zapisat do neho toto :


public MyClass(IForm form) { Form = form; }


public void DoWork()

{ try { // do something }

catch (Exception)

{ Form.initial_value(); } }
 

Nahlásit jako SPAM
IP: 85.237.239.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 59 hostů

Podobná vlákna

Premenna a delegat — založil Tayson

Delegat textBox — založil Tayson

Delegát - návratová hodnota — založil Kubas129

Void * alebo delegate z c# — založil Miro1701

Delegáti & události — založil Petrroll

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý