[C#] wykrywanie sender'a

0

Hej, mam pewna funkcje ktora wywoluje przy kliknieciu na button i przy ladowaniu programu. I zalezy mi na tym zeby funkcja zachowywala sie inaczej przy ladowaniu formy a inaczej przy wywolaniu jej przy kliknieciu buttona. Musze wykryc po prostu co wywolalo ta funkcje ale nie wiem jak ;/

 
private void jakas_funkcja(object sender, EventArgs e)
        {
            if(cos tam)
            {
            }
            else 
            {
                if(wywolanie nastapilo przy ladowaniu glownej formy)
                {
                }
                 else
                 {
                 }
            }
        }

0

Może tak...

Zadeklaruj zmienną globalną (boolean).
Podczas otwierania okna, najpierw ustaw ją na true, a potem wywołaj tę swoją funkcję.
Tymczasem, podczas naciskania przycisku, zmieniaj jej wartość na false.
A w procedurze, jeżeli zmienna (przypuścmy CL) będzie miała false, to wykonaj odpowiedni kod dla przycisku,
a jeżeli true, to odpowiedni kod dla okna.
KPW ?

Swoją drogą, nie lepiej byłoby stworzyć osobne procedury ?

Możesz jeszcze na senderach, ale nie wiem jak to jest w C# [wstyd]

0

podglądnij sender.GetType() i wrzuć odpowiedniego ifa...

0

model normalny, metody robia tylko to, co do nich nalezy, i tylko tyle, co do nich nalezy, sa tak male jak tylko mozliwe, a rozne rzeczy do zrobienia sa w roznych metodach.

class X : Forms
{
     public X() { InitializeComponent(); jakasFunkcjaA(); }
     private void button_Click(object sender, EventArgs e) { jakasFunkcjaB(); }
     private void jakasFunkcjaA()
     {
          zachowanieA;
     }
     private void jakasFunkcjaA()
     {
          zachowanieB;
     }
}

model "upakowany1", metody robia to, co do nich nalezy, i tylko tyle, co do nich nalezy, ale jedna metoda potrafi robic wiele podonych rzeczy. metody pobieraja wszystkie chwilowo uzywane wartosci przez argumenty, zachowanie jest ustalane przez wlasnie te argumenty. jezeli nie ma 'zachowaniawspolnego', jest to blad projektowy.
*takie cos dostajesz, w momencie kiedy starasz sie pisac normalnie, ale "zeby zaoszczedzic na ilosci metod" dopychasz nowa logike do starych metod, ktore juz sa gdziestam uzywane. czesty przypadek: to dodatkowe zachowanie rozni sie tylko troche od oryginalnego i nie chcesz kopiowac kodu

class X : Forms
{
     public X() { InitializeComponent(); jakasFunkcja(false); }
     private void button_Click(object sender, EventArgs e) { jakasFunkcja(true); }
     private void jakasFunkcja(bool closing)
     {
          zachowaniewspolne
          if(closing)
                   zachowanieA;
          else
                   zachowanieB;
          zachowaniewspolne
     }
}

model "upakowany2", metody robia to, co do nich nalezy, i tylko tyle, co do nich nalezy, ale jedna metoda potrafi robic wiele podonych rzeczy. niektore argumenty zostaly przeniesione do stanu obiektu, bo sa potrzebne jeszcze w wielu innych metodach - szkoda je ciagle przepuszczac przez argumenty, ostatecznie troche to kosztuje.
*typowy przyklad takiego zachowania, to obiekty o silnie konfigurowalnych zachowaniu, np. w stanie obiektu jest jakas flaga mowiaca czy ladowac dane z bazy, czy z plikow, itp

  • ponizszy przyklad jest pogladowy i pokazuje idee. taki konkretny uklad jest bledny, poniewaz fromButton jest uzywane chwilowo i ustalane kazdorazowo przed wywolaniem metody, wiec powinno byc jej argumentem
class X : Forms
{
     public X() { InitializeComponent(); fromButton = false; jakasFunkcja(); }
     private void button_Click(object sender, EventArgs e) { fromButton = true; jakasFunkcja(); }
     private bool fromButton;
     private void jakasFunkcja()
     {
          zachowaniewspolne
          if(fromButton)
                   zachowanieA;
          else
                   zachowanieB;
          zachowaniewspolne
     }
}

model nienormalny, "inteligentny", metody robia automagicznie to, co komus sie wydawalo ze do nich nalezy, i robia rozne rzeczy w malo jasnych warunkach.
*w ogolnosci, jezeli stosowane przez poczatkuajcych, zazwyczaj jest bledne -- wszystko zalezy od tego, co dokladnie sa to zachowania.. zwykle zachowania roznia sie bardzo i wowczas model ten powinien sie nazywac "debilny" poniewaz wprowadza innych ludzi czytajacych kod w blad/zdumienie.
*czasami natomiast jest wymuszony, mowi sie 'trudno' i zyje dalej, bo akurat jest to duzy punkt decyzyjny aplikacji i innego nie ma bo framework nie przewidzial, albo (..)
*czasami jest ok - jezeli metoda trzyma sie reszty zasad, a rozpoznawanie caller'a jest czescia intuicyjnego interfejsu obiektu

class X : Forms
{
     public X() { InitializeComponent(); jakasFunkcja(this, EventArgs.Empty); }
     private void button_Click(object sender, EventArgs e)
     {
          if(sender is Form)
                   zachowanieA; // np. pokoloruj pola na zielono
          else if(sender is Button)
                   zachowanieB; // np. przeladuj dane i wyslij maila
     }
}

i mozna jeszce pare wymyslic.. ale to Ci wystarczy

0

@quetzalcoatl

Moja funkcja o której mowa służy do sprawdzenia dostępności nowej wersji aplikacji. Kiedy wywołuje ja przez button_click i nie ma dostępnej nowej wersji wyświetlenie message_boxa o tej informacji jest normalne, ale kiedy mam ustawione sprawdzanie przy opalaniu programu wyświetlanie message_boxa o informacji ze nie ma nowej wersji jest trochę słabe, dlatego chciałem zęby przy starcie aplikacji wyświetlał informacje tylko gdy dostępna jest nowa wersja. Nie widzę potrzeby pisać dodatkowej metody która sprawdza aktualizacje przy starcie aplikacji i nie ma w tym nic debilnego.

0

czy nie lepiej miej jedna funkcje sprawdzajaca czy jest nowa wersja i zwracajaca bool true jesli jest, false jesli nie ma
i na podstawie informacji zwroconej z tej funkcji w kazdym z przypadkow podejmujesz inna akcje, na start formy pokazujesz komunikat tylko kiedy jest nowa, a na klik buttona, zawsze ale raz pozytywna innym razem negatywna

a uwagi quetzalcoatl'a sa sluszne

0
admin napisał(a)

@quetzalcoatl

Moja funkcja o której mowa służy do sprawdzenia dostępności nowej wersji aplikacji. Kiedy wywołuje ja przez button_click i nie ma dostępnej nowej wersji wyświetlenie message_boxa o tej informacji jest normalne, ale kiedy mam ustawione sprawdzanie przy opalaniu programu wyświetlanie message_boxa o informacji ze nie ma nowej wersji jest trochę słabe, dlatego chciałem zęby przy starcie aplikacji wyświetlał informacje tylko gdy dostępna jest nowa wersja. Nie widzę potrzeby pisać dodatkowej metody która sprawdza aktualizacje przy starcie aplikacji i nie ma w tym nic debilnego.

Przeczytaj do cholery jasnej jeszcze raz to co napisalem.

Ramowka Twojego kod ktory robi powyzsze, powinna wygladac tak: /edit: tak jak massther już zdążył napisac/

class Cokolewiek
{
    void mojaMetoda_wolanaKiedysNaStarcie()
    {
        blahblahblah();
        sprobujSieUpgradeowac();
        blahblahblah();
    }

    void mojegoButtona_Click(object s, eventargs e)
    {
        if( ! sprobujSieUpgradeowac() )
            MessageBox.Show("Nie ma, nie ma wody na pustyni, a upgrade'y nie chcialy dalej isc");
    }

    bool sprobujSieUpgradeowac()
    {
         int x = zabijKota();
         int y = zjedzŻabe();
         int z = ocenZloWszechswiata();
         bool upgradeZostalWykonany = x+y > z ;
         return upgradeZostalWykonany;
    }
}

Mam nadzieje, ze teraz jestes w stanie sensowniej powiazac to co napisalem wczesniej z pojeciami takimi jak "dekompozycja", "podzial odpowiedzialnosci" i "robienie tego i tylko tego co do mnie nalezy" w kontekscie metod.

Po tym co napisales przed chwila, wnioskuje ze jak na razie probujesz oszczedzac na ilosci metod i sam sie w ten sposob wkrecasz w robienie samemu sobie burdelu w swoim kodzie. Skoncz z tym, gdyz takie cos dalej prowadzone na szersza skale jest ZŁE:

class Cokolewiek
{
    void mojaMetoda_wolanaKiedysNaStarcie()
    {
        sprobujSieUpgradeowac(null);
    }

    void mojegoButtona_Click(object s, eventargs e)
    {
        sprobujSieUpgradeowac(s);
    }

    bool sprobujSieUpgradeowac(object wtf)   // po co tej metodzie parametr, z ktorym ona nic nie robi sensownego?
    {
         int x = zabijKota();
         int y = zjedzŻabe();
         int z = ocenZloWszechswiata();
         bool upgradeZostalWykonany = x+y > z ;

         // co to tu robi?  czy to ma zwiazek z upgrade'm? nie!
         // to jest kod ktory obsluguje logike przycisku, nie upgradeu.
         // powinien on byc "w przycisku"
         if(upgradeZostalWykonany && wtf != null)
              MessageBox.Show("Nie ma, nie ma wody na pustyni, a upgrade'y nie chcialy dalej isc"); 
    }
}

a jest takie, poniewaz piszac w ten sposob, obarczasz metode dodatkowymi obowiazkami ktore w ogole nie sa zwiazane z jej oryginalnym zamierzeniem. metoda robi za wiele. jezeli potem bedziesz jej uzywac w innych miejscach, dojda jej nowe dziwne parametry, w srodku rozwinie Ci sie drzewko if/sru/else i zacznie wydawac owoce: burdel, w ktorym nie bedzie widac o co chodzi, a ktory niestety bedzie konieczny zeby obsluzyc wszystkie przypadki wykorzystania tej metody..

0

Ok. Wiem, że na pewno macie racje, ale sam nie potrawie tego napisac tak jak Bog przykazal. Narasie moja metoda sprawdzania aktualizacji wyglada tak:

private void Check_update()
        {
            WebClient check_update_client = new WebClient();
            try
            {
                check_update_client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(check_update_client_DownloadStringCompleted);
                check_update_client.DownloadStringAsync(new Uri("strona www/version.txt"));
                check_update_client.Dispose();
            }
            catch (Exception)
            {             
            }
        }

        private void check_update_client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            string server_version = e.Result.ToString();
            if (current_version != server_version)
            {                
                if (MessageBox.Show("Posiadasz nieaktualna wersje programu!\r\nCzy chcesz odwiedzic strone WWW programu?", "Aktualizacja", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
                {
                    System.Diagnostics.Process.Start("strona www");
                }                             
            }
            else
            {               
                if (autoTemp == false) //zmienna ustawiana jest na true podczas odpalania programu wtedy ten messageBox sie nie wyswietli
                    MessageBox.Show("Posiadasz aktualna wersje programu!", "Aktualizacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else
                { }
            }
        }

Czy moglibyście pokazać jak to powinno wyglądać poprawnie?

0

o lol, to prawie jak z zardzewiala maczeta na komary sie rzucac :D
slowem - poszalales

masz nr najnowszej wersji w pliku txt, pytanie po co sciagac to asynchronicznie, czy to dlugo trwa?
sciagniecie kilku znakow?
pytanie czy wiesz jak dziala wywolanie asynchroniczne?

quetzalcoatl ci napisal jak powinno byc, wiec jeszcze raz:

bool CheckUpdate()
{
  string newestVersion = null;
    try
            {
                
                System.Net.WebClient w = new System.Net.WebClient();
                newestVersion = w.DownloadString(new Uri("http://localhost/version.txt"));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
string currentVersion = null;
try
{
  currentVersion = GetCurrentVersion();
}
catch{}

  if (!string.IsNullOrEmpty(newestVersion) && !string.IsNullOrEmpty(currentVersion))
  {
    return newestVersion > currentVersion; // oczywiscie tu musisz jakas logike porownania dodac
  }
  return false;
}

teraz na podstawie bool'a zwroconego przez ta funkcje podjemujesz odpowiednie dzialania, w on_load formy pokazujesz messagebox tylko jesli jest true, a na jawne klikniecie przycisku sprawdz aktualizacje zawsze wyswietlasz info czy jest nowa wersja czy nie

0

Ok, gotowe. Troche przymula program przy odpalaniu, ale przeżyje. Dzięki

public bool IsNewVersion(string current_version)
        {
            string server_version;
            try
            {
                WebClient wClient = new WebClient();

                server_version = wClient.DownloadString(new Uri("localhost/version.txt"));

                return current_version != server_version;
            }
            catch (Exception)
            {
                return false;
            }
        }
0

Jeżeli przymula, to się nie krępuj z tym async'em. massther Cie objechał, ale pewnie nie zwrócił uwagi na to, że pewnie ten kod jest odpalany z konstruktora formatki..
więc albo wróc do tamtego asynca, albo przenieś odpalanie testu z konsturktora do form_load - przestanie zamulac, albo przynajmniej bedzie dla uzytkownika przyjemniej wygladac

1 użytkowników online, w tym zalogowanych: 0, gości: 1