Gå til innhold

Anbefalte innlegg

Hei

 

Jeg har aldri programmert noe særlig før (om man ser bort fra mIRC-script på 90-tallet og hobby-PHP), men i dag fikk jeg det for meg at jeg trenger et lite program som kan kjøre noen kommandolinje-koder for meg.

 

Rent spesifikt så setter jeg ofte opp rutetabeller ved hjelp av kommandolinjen i windows i forbindelse med jobb, men nå tenkte jeg å lage et enkelt lite GUI hvor jeg kan sette inn adressene og metrix'ene etc og lagre de forskjellige oppsettene for hvert prosjekt jeg er på, samt en knapp for å slette rutetabellen når jeg forlater hvert enkelt prosjekt.

 

Denne tråden er ment å bli en slags logg- og spørsmålstråd hvor jeg maser hvis jeg ikke får til og skryter hvis jeg får til :)

 

Tar gjerne imot både tips og kritikk hvis dere har noe av det.

 

Nå har jeg nettopp lastet ned Visual C# 2010 Express, so here we do!

Lenke til kommentar
Videoannonse
Annonse

Første mash up:

post-49706-0-15245300-1337725988_thumb.png

 

OK, funksjonsbeskrivelse blir som følger:

  • Valg av antall switchboard-busser (A,B,C,D osv) skal avgjøre hvor mange IP-adresser som blir synlige i groupboxen til høyre. Altså, hvis man velger A+B, så skal ikke C og D vises. Velger man A+B+C så skal ikke D vises.
  • Skriver man f.eks 10.199.112.xxx i tekstboksen Project IP-address så kan alt innholdet i alle boksene for IP-adresser bestemmes automatisk ettersom alle prosjekter følger samme standard. De tre første segmentene i subnet-adressene blir identisk med de tre første segmentene fra prosjekt-ipadressen (10.119.112). Det siste segmentet er alltid 3,4,5 og 6 for A, B, C og D.
  • Det samme gjelder for Router til A, B, C og D, men her skal segment nr 3 ha én verdi høyere (altså 113 i vårt eksempel)
  • Det sorte feltet nederst skal rett og slett bare sette inn IP-addressene som allerede er bestemt i de to foregående punktene.
  • Hvis man velger override, så skal checkboksen rett under blir synlig. Når begge er valgt så kan alle tekstbokser for IP-adresser redigeres.
  • Når man trykker på den grønne knappen så skal kommandoene i det sorte feltet kjøres. Hvis man har valgt A+B så er det kun to kommandoer, har man valgt A+B+C så er det tre kommandoer osv.
  • Senere ønsker jeg muligheten for å lagre en setup. Det kan f.eks være i en INI-fil eller liknende (?)
  • Da ser jeg for meg en tabell over lagrede setups og en grønn knapp bak hver og en av de som kjører kommandoene nevnt over.

Hvis noen klarer å gi meg noen tips til punkt 1 og 2 så blir jeg veldig happy. Foreløpig har jeg som nevnt ikke programmert noe som helst, og jeg aner ikke hvordan jeg forteller en tekstboks at den kun skal være synlig/aktiv hvis den og den radioknappen er valgt osv.

 

Tar selvsagt imot kritikk på designet også :)

Lenke til kommentar

Ok, prøvde meg på noe enkelt angående punktet om å gjøre "i know what i am doing"(checkBox2) synlig når "override" (checkBox1) er checked:

 

 

    private void checkBox2_VisibleChanged(object sender, EventArgs e)
    {
	    if (checkBox1.Checked == true)
	    {
		    checkBox2.Visible = true;
	    }
	    else
	    {
		    checkBox2.Visible = false;
	    }
    }

 

Dette fungerte ikke, og checkBox2 er nå usynlig uansett hvor mye jeg krysser i checkBox1 :/

Lenke til kommentar

Oppdatering:

  • Skriver man f.eks 10.199.112.xxx i tekstboksen Project IP-address så kan alt innholdet i alle boksene for IP-adresser bestemmes automatisk ettersom alle prosjekter følger samme standard. De tre første segmentene i subnet-adressene blir identisk med de tre første segmentene fra prosjekt-ipadressen (10.119.112). Det siste segmentet er alltid 3,4,5 og 6 for A, B, C og D.
    CHECK :)
  • Det samme gjelder for Router til A, B, C og D, men her skal segment nr 3 ha én verdi høyere (altså 113 i vårt eksempel)
    CHECK :)
  • Hvis man velger override, så skal checkboksen rett under blir synlig. Når begge er valgt så kan alle tekstbokser for IP-adresser redigeres.
    CHECK :)

C# er ganske gøy

Endret av Twinflower
Lenke til kommentar

OK, nå er det meste av interfacet ferdig og jeg har lært meg hvordan jeg kjører kommandolinje-kommandoer og viser frem resultatet uten å vise den sorte kommandolinjen.

 

Får fikse selve route-kommandoene i morgen før jeg begir meg på saving/loading av innstillinger.

Lenke til kommentar

Ok, prøvde meg på noe enkelt angående punktet om å gjøre "i know what i am doing"(checkBox2) synlig når "override" (checkBox1) er checked:

 

 

    private void checkBox2_VisibleChanged(object sender, EventArgs e)
    {
	    if (checkBox1.Checked == true)
	    {
		    checkBox2.Visible = true;
	    }
	    else
	    {
		    checkBox2.Visible = false;
	    }
    }

 

Dette fungerte ikke, og checkBox2 er nå usynlig uansett hvor mye jeg krysser i checkBox1 :/

 

Du må hooke deg opp til riktig event, i dette tilfellet CheckedChanged. Kan i alle fall se ut som du bruker feil event.

Lenke til kommentar

Ok, prøvde meg på noe enkelt angående punktet om å gjøre "i know what i am doing"(checkBox2) synlig når "override" (checkBox1) er checked:

 

 

    private void checkBox2_VisibleChanged(object sender, EventArgs e)
    {
	    if (checkBox1.Checked == true)
	    {
		    checkBox2.Visible = true;
	    }
	    else
	    {
		    checkBox2.Visible = false;
	    }
    }

 

Dette fungerte ikke, og checkBox2 er nå usynlig uansett hvor mye jeg krysser i checkBox1 :/

 

Du må hooke deg opp til riktig event, i dette tilfellet CheckedChanged. Kan i alle fall se ut som du bruker feil event.

Lenke til kommentar

The Jackal:

Ja, jeg fant ut etterhvert :)

Går det å lage en slags "fellesevent"? Slik at når en av alle tekstboksene endrer seg så skal noe skje?

 

Affe90:

Skal legge ut når jeg er ferdig ja, ingen problem.

Men blir litt pause fremover pga eksamenslesing

Lenke til kommentar

OK, høres ut som det jeg er ute etter.

 

Hvordan lager jeg en metode? Og er en metode en slags samling av kommandoer man gir et navn?

 

f.eks "nyMetode = minMetode {do this; do that; ferdig}"

 

(Jeg er som sagt helt fersk på dette, og har kun jobbet med php-scripting fra før - noe som er en helt annen verden)

Lenke til kommentar

[tilgangsbeskrivelse] [returdatatype] NavnPåMetode([argument] [, (...)])

{

KodeLinjer :D

}

 

Tilgangsbeskrivelse er ikke obligatorisk, og kan være en av følgende:

- private (standard)

- internal

- protected internal

- protected

- public

 

Returtype er obligatorisk, men kan være void dersom ingenting skal returneres fra funksjonen

 

Argument er i formen:

[datatype] NavnPåArgument

 

Datatype er enten en av de innebyggede typene, eller en brukerdefinert type.

 

NavnPåArgument må være en gydlig identifier, altså første tegn må være en bokstav (internasjonale tegn er også gyldig) eller en understrek. Påfølgende kan være alfanumeriske og understrek.

 

Skal du returnere en verdi benytter du return [verdi]

Dersom funksjonen returnerer void, er det ikke lov å gi en verdi i return (men return er fortsatt lov)

Lenke til kommentar

Du har jo et fint eksempel på en methode (som forøvrig ser ut slik som en event methode skal se ut) litt lengre oppe:

 

private void checkBox2_VisibleChanged(object sender, EventArgs e)
	    {
			    if (checkBox1.Checked == true)
			    {
					    checkBox2.Visible = true;
			    }
			    else
			    {
					    checkBox2.Visible = false;
			    }
	    }

Det du burde gjøre er å lage en event metode til textchanged på en av tekstfeltene dine (gjerne via gui) og så setter du bare den til alle andre tekstbokser.

Lenke til kommentar

OK, høres ut som det jeg er ute etter.

 

Hvordan lager jeg en metode? Og er en metode en slags samling av kommandoer man gir et navn?

 

f.eks "nyMetode = minMetode {do this; do that; ferdig}"

 

(Jeg er som sagt helt fersk på dette, og har kun jobbet med php-scripting fra før - noe som er en helt annen verden)

 

Du har jo allerede laget en metode og postet den :D

 

private void checkBox2_VisibleChanged(object sender, EventArgs e)
{
				if (checkBox1.Checked == true)
				{
						checkBox2.Visible = true;
				}
				else
				{
						checkBox2.Visible = false;
				}
}

 

Dette er en metode :) Jeg tipper du kanskje bare har brukt det visuelle grensesnittet i Visual Studio slik at metodene som har blitt generert for deg? Du kan fint gjøre dette i konstruktøren til formen din selv. Noe ala dette:

 

public class MyForm : Form
{
public MyForm()
{
	Initialize();
	textBox1.TextChanged += OnTextBoxChanged;
	textBox2.TextChanged += OnTextBoxChanged;
	textBox3.TextChanged += OnTextBoxChanged;
}
protected void OnTextBoxChanged(object sender, EventArgs args)
{
//Do some stuff
}
}

 

NB! Pseudocode...tastet den bare rett inn her, så ikke sikkert den funker heeeelt. Prinsippet er korrekt i alle fall.

Endret av The Jackal
Lenke til kommentar

Hvordan lager jeg en metode? Og er en metode en slags samling av kommandoer man gir et navn?

 

f.eks "nyMetode = minMetode {do this; do that; ferdig}"

 

GeirGrusom gav en god teknisk beskrivelse, prøver her å gi et litt mer "big picture" :)

 

En funksjon er en samling av (ofte brukt) kode, ja :)

 

Du definerer navnet på funksjonen, hvilke verdier den skal ha inn / tilgjengelig, og hva den skal returnere.

 

Noen tommelfinger-regler for funksjoner:

  • Hvis du bruker samme logikk flere plasser, eller tror du vil komme til å trenge samme logikk... Da bør det være i en funksjon.
  • En funksjon bør helst bare gjøre en (logisk) ting. Hvis du ofte gjør flere steg etter hverandre, kan det være lurt å lage en ekstra funksjon som kaller de eksisterende i rekkefølge, og/eller eller legge de inn i en egen klasse (som er en samling av funksjoner og variabler).
  • Prøv å generaliser det du gjør i funksjonene slik at de er lett å bruke til andre ting.

F.eks den som devzero quoter der..

 

Den heter checkBox2_VisibleChanged, og får inn verdiene "sender" (av type Object) og "e" (av type EventArgs). Den returnerer ingenting (void), og er bare tilgjengelig for bruk i lokal kode (private). Nå er jeg ikke vant med C# gui koding, men en av de inkommende der inneholder sannsynligvis en referanse til checkBox1 - hvis det er den som trigger den.

 

Nå, hvis du brukte den referansen istedet for å skrive "checkBox1" direkte, og trengte å ha flere checkboxes som skifter visible status til checkBox2, så kunne du knyttet de direkte til samme funksjon (et eksempel på å gjøre funksjonen mer generell).

  • Liker 1
Lenke til kommentar

Kanskje kjekt å vite hva events er også.

 

Du har funksjonen checkBox2_VisibleChanged definert i koden din. Du er utifra navnet hva den er til, og hva som kaller den, men hvordan kan C# vite det? Når du bruker Visual Studio designeren blir dette gjemt i en kodefil som har samme navn som formen din, med .design.cs.

 

Dette er basert på noe i C# som kalles delegering. Dette er at programmet er istand til å fortelle annen kode at "når du kommer hit, gjør dette". Ved å lenke en eller flere metoder til en såkalt event, så kan koden din i forbifarten fortelle annen kode som senere kjører hva som skal skje ved det eventet. Dette er typisk for knapper eksempelvis som har et click event. Da genereres det kode som forteller Button koden hva som skal skje når noen trykker på den.

 

Et event deklareres overraskende nok med event nøkkelordet. Det er sjeldent du kommer til å danne events og skrive kode som er konsument av events, men du kommer til å binde events ganske ofte.

 

public event EventHandler DoSomething;

 

Dette er den enkleste formen av event deklarering. Det går også an å legge inn kode som forteller hva som skal skje når events blir bundet og frigjort, men det er mer eller mindre aldri noe en bruker, så jeg lar det ligge ved at det er nevnt.

 

I denne ser du tilgangsnivået er public - dvs. all kode som har tilgang til eier-objektet (en Form for eksempel) kan redigere eventet. Etter nøkkelordet event så ser du noe som er ganske sentralt: Typen til eventet. Dette er ikke alltid veldig selvforklarende, og mer omfattende enn jeg skal ha det til, men dette er signaturen til eventet, som alle funksjoner som skal binde til den må ha.

checkBox2_VisibleChanged benytter akkurat denne typen (altså EventHandler) og det er derfor det står akkurat (sender object, EventArgs e) og ikke noe annet.

 

Etterfulgt av typen er navnet på eventet. Så slik deklarerer du en event. Deretter kan denne i koden din nesten kalles som om det var en helt vanlig funksjon.

 

Deretter skal man se hvordan man binder events. Dette gjøres i sin enkleste form med operatøren +=

MyButton.Click += MyButton_Click;

Det går an å unbinde events også, men dette trengs svært sjeldent, og krever en litt annen fremgang, så det får være med den enkleste forklaringen foreløpig.

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...