hjælp til at skrive til textbox

Tags:    c#

<< < 12 > >>
Hej.
Jeg er ved at lære c#, og har lavet et lille program der udregner ph værdien i vand blandet op med syre.
Udgangspunktet er at vandet har PH 7 og syren PH 1

I min windows form, kan man indsætte antal deciliter vand og syre, og trykke beregn.

Mit regnestykke for udregningen er:

double ph = ((vand*7)+syre)/(vand+syre);
strPh = Convert.ToString(ph);

jeg har fundet ud af, at få resultatet lavet om til en String værdi, men problemet er, at jeg ikke kan finde ud af, at indsætte resultatet strPh i min textbox txtPh, når jeg trykker på knappen btnUdregn.. :-/

Jeg har vist heller ikke helt styr på konstruktionen af classes, methods m.v. endnu... Her er hvad jeg har indtil videre:

Fold kodeboks ind/udCSharp kode 






Indlæg senest redigeret d. 07.11.2012 19:18 af Bruger #17436
13 svar postet i denne tråd vises herunder
7 indlæg har modtaget i alt 11 karma
Sorter efter stemmer Sorter efter dato
Det begynder så småt at give mening :-) 1000 tak.

Jeg har normalt let ved det boglige og tekniske, men jeg kan mærke, at man ved programmering i c# nok lige skal nå et "aha" punkt :-)
Har sgu lidt svært ved at se helhedsbilledet indtil nu...

ved "private double calcPh(double vand, double syre):

- er calcPh vel bare navnet på metoden? Eller skal jeg forstå det på den måde, at jeg laver en "private double" ved navn "calcPh", og i den nedenstående metode udregner værdien? Og i så fald, hvorfor returnerer jeg så "ph", og ikke "calcPh"?

- jeg går ud fra, at (double vand, double syre) betyder, at jeg laver de 2 doubler dér, så jeg kan bruge dem i metoden? Eller har jeg allerede oprettet dem et andet sted?

Mvh

dum til c#
Hejsa Jan

Vi kan ikke alle være eksperter og er ingen skam at spørge når man ikke forstår noget. Nok nærmere det modsatte for det viser du gerne vil lære (uanset hvor dumt du kan føle det er).

Jeg tog udgangspunkt i dit eksempel hvor du havde lavet dine variable ph og strPh så dem brugte jeg.
Desuden så hvis du ikke definerer om de skal være private eller public så bliver de protected som er at de er synlige indenfor din application scope, men er generelt altid god praksis at definere dette eksplicit.
Så hvis du ønsker de skal være protected så skriv det, ellers fortæl hvis de skal være private eller public.

Opbygningen er som følger:
"private double calcPh(double vand, double syre)"
private : Dette definerer hvem der har adgang til denne metode. Altså om de kun kan ses her eller hvis du havde lavet den public så ville andre objekter også kunne se dem. I denne context kan det være svært at forstå, men lad mig give dig et eksempel.

Du laver en klasse der hedder menneske.
Den har variablen alder, og en public metode der hedder Voks() som får dit menneske til at blive et år ældre.
Når man bliver et år ældre så sker der en masse forskelligt igennem livet, fx når man bliver teenager får man bumser.
Derfor ville du fx lave en private metode TidTilBumser(int alder) som returnerer bool. Hvis man er over 13 så får man bumser i denne klasse.
Denne metode kalder man fra Voks() og kan reagere hvis man får true tilbage og sætte en anden variabel der siger antalBumser og tælle dem op med et tilfældigt tal.
Forskellen i dine to metoder er at Voks() er public, og din TidTilBumser(int alder) er private.
Det vil sige din TidTilBumser-metode kan kaldes fra din klasse af, men hvis andre udefra kalder dit menneske så kan de ikke se den.
Så hvis du har en anden klasse der laver dit menneske så kan de kun kalde dine public metoder på dit menneske, og indeni dit menneske kan de så selv kalde dine private metoder.
Gav det mening?

double : Dette er din returtype. Her fortæller du at du vil returnere en værdi af typen double (kommatal) - som kunne være en int (heltal) eller en metode der udfører noget uden absolut at returnere noget har void som returtype (ingen returtype).
Dette kan du også se ved fx din button_click fordi den skal udføre noget men ikke returnere noget tilbage til nogen.

calcPh : Dette er dit metodenavn. Den kunne hedde hvad som helst så længe du ikke har mellemrum i det. Praksis for navngivningen kan vi komme ind på en hel religionskrig herinde nok omkring hvornår begynder den med Stort begyndelsesbogstav, hvornår begynder den med småt begyndelsesbogstav, skal der indgå noget type i det også, og så videre.

(double vand, double syre) : Dette er dit input til din metode.
Det samme kan du se er i din button_click, men som frameworket hjælper dig med så du ikke skal lave så meget.
Du kan sætte typer og dine egne objekter eller ingenting som her "()".

Grunden til du returnerer "ph" og ikke "calcPh" er at du havde lavet en variabel kaldet ph (din double) for din metode skal ikke returnere sig selv men en værdi du har sat.
Du kunne sagtens bare returnere det rene regnestykke, men nu du havde en variabel du kunne sætte det i brugte jeg den bare.

Dine (double vand, double syre) er jo værdierne fra dine tekstbokse. Her skal du bare tage convert.ToDouble(txtSyre.text) og convert.ToDouble(txtVand.text) og få værdierne her og indsætte som parametre i din metode.
Hvis du ser efter så hver gang du ændrer teksten i dine tekstbokse så indsætter du en double-værdi i dine variable vand og syre, så dem kunne du bruge som input til din metode.



Indlæg senest redigeret d. 07.11.2012 20:26 af Bruger #17215
Du misforstår pointen i hvordan du skal opbygge dit skærmbillede.

Du skal lave en metode der kan tage noget input, beregne og levere et resultat tilbage.

fx:
private double calcPh(double vand, double syre)
{
ph = ((vand * 7) + syre) / (vand + syre);
strPh = ph.ToString();
return ph;
}

I din btnUdregn_Click kalder du så calcPh med input og sætter din txtPh til værdien.

Fejlen i dit forsøg er at du laver kun selve beregningen i main, som ikke startes noget sted fra og dermed vil din strPh altid forblive sin startværdi (altså "").
Brug metoder du laver til at udføre dit arbejde i stedet for at lave dem kun i dem der udfører din state (click, text_changed etc) for så kan du bruge den flere steder uden at lave dobbelt kode.

Håber det gav lidt hjælp :)



Den bedste måde plejer altid at være at forsøge og fejle, forsøge og fejle, forsøge og fejle, spørge og komme lidt mere på rette vej og forsøge igen.
Hvis du prøver at komme videre så er det nemmere vi kan hjælpe dig videre når du har problemer.

Først lav metoden, og så prøv at se om du ikke kan få din form til at bruge den når du trykker på knappen.



Jeg kan ikke se du kalder dine to metoder der er meget vigtige:
- stringReturner
- calcph1 (2,3,4)

Det vil sige du laver aldrig selve beregningen, og du kalder aldrig din stringReturner som sætter din ph-variabel.

Desuden har hvert objekt (alle typer som int, string, double etc) en ToString()-metode som du kan kalde på dem hvis du skal afbillede deres øjeblikbillede værdi i en string, så det er nemmere end at kalde convert.ToString().
Så du kan skrive ph = facit4.ToString() i stedet.

Prøv at sætte nogle breakpoints i din kode i dine metoder og se så hvilke der bliver udført hvornår og hvad de gør så du kan se om de gør det forventede. Så kan du nemt se hvis en metode kaldes for tidligt, for sent eller slet ikke kaldes eller returnerer forkert resultat og dermed få dig selv videre :)



Det er meget simpelt Jan
Fold kodeboks ind/udCSharp kode 


Derudover så tænk på om du ikke kan lave dine calcMetoder smartere?
Jeg kan ikke se den yderste del af din kode, men mit gæt er at der er meget der er ens og en lille smule der er forskelligt.
Hvis du så ser nærmere på det så lav en metode, som tager den forskellige del som input så du har en metode der løser det hele i stedet for du altid skal lave en ny metode til hver case du ønsker at løse.
Ved en metode skal du rette et sted (fx hvis du har lavet en fejl) og ikke 4-5 med samme kode, er mere effektivt og meget nemmere læseligt og vedligeholdelsesmæssigt.



Hvad er det du ikke kan få til at virke?
Skriver den ikke noget? Beregner den forkert? Får du fejl eller mangler?
Har du prøvet at debugge dine metoder så du kan se at når du indskriver noget i textboxene at det fungerer og dine variable sættes rigtigt?

Når jeg ser på følgende kode:
Fold kodeboks ind/udCSharp kode 

Så tænker jeg det må kunne blive gjort smartere.
Nu er det der ikke lige mit stærkeste område, men er det korrekt forstået at hver gang du skal beregne det, så hvis du skal beregne det som fortyndet så skal du lave samme beregning igen?
I så fald ville jeg mene dette kunne gøre det:
Fold kodeboks ind/udCSharp kode 

Din gangeFortyndet er så det tal som din radiobutton har som du så sender med ned i metoden.

En lille note er også at du skal huske fejlhåndtering.
Hvad hvis en bruger indskriver "ti" i en tekstboks hvad sker der så?
Hertil laver man try-catch blokke (prøv simpel google C# try catch) hvor du prøver noget af (try) og hvis det fejler fanger du fejlen (catch).
Så kan du hvis det fejler når du forsøger at konvertere inputtet i tekstboksen kan du give en fejlmeddelelse med MessageBox.Show("Input i Ph Syre var i forkert format. Prøv venligst igen."); og så sætte fokus på den tekstbox som der var fejl i ved at sige textbox.focus()



Jan det er dejligt du fandt din fejl, og netop sådanne oplevelser der gør du husker det til næste gang. Derfor jeg gerne ville have dig til selv at prøve noget mere, for det man lærer bedst af.
En anden god ting er at lave breakpoints i dine metoder der udregner, starter din form, når du klikker på knappen etc. og så ser hvad der laves, hvad dine værdier er, og om det rigtige udføres.
Det burde kunne have fanget din fejl ved at se at din metode ikke blev udført :)
Du laver breakpoints ved at trykke ude i venstre side af skærmen i det grå og så stopper din kode når den når hertil så du kan se værdier, og så trykker du F5 for at fortsætte i din kode indtil det er færdigt eksekveret eller møder et nyt breakpoint. F10 der stepper du en linie frem (kaldet step over) (eller metode over hvis du har sådan en ved dit breakpoint), F11 betyder step into og hvis du har en metode som der bliver kaldt så vil du gå ind i denne metode og se den blive udført step by step med F10 og F11.




Det begynder så småt at give mening :-) 1000 tak.

Jeg har normalt let ved det boglige og tekniske, men jeg kan mærke, at man ved programmering i c# nok lige skal nå et "aha" punkt :-)
Har sgu lidt svært ved at se helhedsbilledet indtil nu...

ved "private double calcPh(double vand, double syre):

- er calcPh vel bare navnet på metoden? Eller skal jeg forstå det på den måde, at jeg laver en "private double" ved navn "calcPh", og i den nedenstående metode udregner værdien? Og i så fald, hvorfor returnerer jeg så "ph", og ikke "calcPh"?

- jeg går ud fra, at (double vand, double syre) betyder, at jeg laver de 2 doubler dér, så jeg kan bruge dem i metoden? Eller har jeg allerede oprettet dem et andet sted?

Mvh

dum til c#




Mange tak igen, det giver rigtig god mening :-)
Det skulle vel ikke være for meget at bede om, hvis du kunne skrive programmet for mig herinde, så jeg kunne se hvordan det skal se ud? Det virker til at jeg er lidt for meget på bar bund. Forstår godt byggestenene, int double loop if else array osv, men har meget svært ved at finde sammenhængen i det hele, og hvordan man opbygger programmerne.



Nu har jeg prøvet en anden fremgangsmåde, kan ikke rigtigt få det til at virke. Programmet melder ingen fejl, men der sker ikke noget med tekstboksen txtPh...

Jeg har lavet lidt om på Formen, så den ser sådan ud:

Ph værdi syre: ___ (textbox)
Antal dl. __ (textbox)

Ph værdi vand:__ (textbox)
Antal dl. __ (textbox)

antal gange fortyndet:
() 1 (radioknapper)
() 2
() 3
() 4

_________
udregn (knap)

ph værdi __ (textbox)

Med følgende kode:

Fold kodeboks ind/udCSharp kode 




Indlæg senest redigeret d. 08.11.2012 12:49 af Bruger #17436
<< < 12 > >>
t