Twinflower Skrevet 22. mai 2012 Del Skrevet 22. mai 2012 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
Twinflower Skrevet 22. mai 2012 Forfatter Del Skrevet 22. mai 2012 Første mash up: 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
Twinflower Skrevet 22. mai 2012 Forfatter Del Skrevet 22. mai 2012 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
Twinflower Skrevet 22. mai 2012 Forfatter Del Skrevet 22. mai 2012 (endret) 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 22. mai 2012 av Twinflower Lenke til kommentar
Twinflower Skrevet 23. mai 2012 Forfatter Del Skrevet 23. mai 2012 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
The Jackal Skrevet 23. mai 2012 Del Skrevet 23. mai 2012 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 Skrevet 23. mai 2012 Del Skrevet 23. mai 2012 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
affe90 Skrevet 23. mai 2012 Del Skrevet 23. mai 2012 Synes dette virket som et interessant prosjekt. Hadde du hatt mulighet til å publisert kildekode eller en ferdig kompilert prototype? Lenke til kommentar
Twinflower Skrevet 24. mai 2012 Forfatter Del Skrevet 24. mai 2012 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
The Jackal Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 Du kan bruke TextChanged eventen på alle textboxene dine og hooke de opp til samme metode. Du må ikke ha en metode for hver eneste textbox. Lenke til kommentar
Twinflower Skrevet 24. mai 2012 Forfatter Del Skrevet 24. mai 2012 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
GeirGrusom Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 [tilgangsbeskrivelse] [returdatatype] NavnPåMetode([argument] [, (...)]) { KodeLinjer } 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
devzero Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 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
The Jackal Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 (endret) 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 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 24. mai 2012 av The Jackal Lenke til kommentar
Terrasque Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 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). 1 Lenke til kommentar
Twinflower Skrevet 24. mai 2012 Forfatter Del Skrevet 24. mai 2012 Dere er fucking amazing, gutter Skal streamline koden min litt bedre senere i kveld hvis jeg får anledning Lenke til kommentar
The Jackal Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 Dere er fucking amazing, gutter It's what we do 1 Lenke til kommentar
GeirGrusom Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 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. 1 Lenke til kommentar
Twinflower Skrevet 24. mai 2012 Forfatter Del Skrevet 24. mai 2012 Geir: Tusen takk for at du tar deg tid til de forklaringene. De hjelper veldig for noen som jobber med å danne seg et overblikk over hva som egentlig skjer og hvorfor etc. 1 Lenke til kommentar
Twinflower Skrevet 25. mai 2012 Forfatter Del Skrevet 25. mai 2012 Hvordan viser jeg AboutBox1? Jeg har designet den som en egen form eller noe (AboutBox1.cs). Jeg har prøvd både AboutBox1.Activebox.Show(); og ShowDialog(); Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå