CheatEnabled Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 Jeg lager et lite program for å teste en del funksjoner, der jeg har to forms. Den ene er en form der du skriver inn HTML-kode, den andre er en form som bare inneholder en webbrowser og en oppdateringsknapp. Programmet mitt lagrer en HTML-fil, som webbrowseren skal laste. Dette fungerte fint når jeg hadde bare en form, men nå, når jeg har 2, oppstår det et problem. Jeg har en public string navigate; Gjennom en del koder blir skal navigate bli satt til locationen på fila: OFD.Filter = "HTML File|*.HTML"; if (SFD.ShowDialog() == DialogResult.OK) { String lagre; lagre = SFD.FileName; FileStream Save = new FileStream(lagre, FileMode.Create, FileAccess.Write); StreamWriter skriv = new StreamWriter(Save); skriv.Write(txtHTML.Text); navigate = SFD.FileName; skriv.Close(); Save.Close(); } Jeg har også prøvd å bruke navigate = lagre; Men dette fungerer heller ikke. Har sett med en tekstboks om det skjer noe med stringen, og det gjør det ikke, den er tom, selvom den burde ha skiftet til filnavnet på HTML-fila. Noen som vet hvorfor? Et annet lite problem jeg har, er hvordan man kan bruke gåsetegn ("") inni en string. Lenke til kommentar
Arne Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 Viss eg ikkje hugser feil, så må du ha ein \ forran " for at det skal virke med "" inni stringar. Lenke til kommentar
Manfred Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 (endret) For å bruke en " inni en string må du bruke \ som det sies: string s = "Dette er en sting med \" inni seg"; Endret 12. mars 2008 av Manfred Lenke til kommentar
Manfred Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 (endret) Jeg lager et lite program for å teste en del funksjoner, der jeg har to forms. Den ene er en form der du skriver inn HTML-kode, den andre er en form som bare inneholder en webbrowser og en oppdateringsknapp. Programmet mitt lagrer en HTML-fil, som webbrowseren skal laste. Dette fungerte fint når jeg hadde bare en form, men nå, når jeg har 2, oppstår det et problem. Jeg har en public string navigate; Gjennom en del koder blir skal navigate bli satt til locationen på fila: OFD.Filter = "HTML File|*.HTML"; if (SFD.ShowDialog() == DialogResult.OK) { String lagre; lagre = SFD.FileName; FileStream Save = new FileStream(lagre, FileMode.Create, FileAccess.Write); StreamWriter skriv = new StreamWriter(Save); skriv.Write(txtHTML.Text); navigate = SFD.FileName; skriv.Close(); Save.Close(); } Jeg har også prøvd å bruke navigate = lagre; Men dette fungerer heller ikke. Har sett med en tekstboks om det skjer noe med stringen, og det gjør det ikke, den er tom, selvom den burde ha skiftet til filnavnet på HTML-fila. Noen som vet hvorfor? Et annet lite problem jeg har, er hvordan man kan bruke gåsetegn ("") inni en string. Hvorfor åpner du en filestream? StreamWriter sw = new StreamWriter(string path); Du trenger ikke å ha en stream der. Men tilbake til "navigate". Er denne definer i samme form som denne koden? Endret 12. mars 2008 av Manfred Lenke til kommentar
CheatEnabled Skrevet 12. mars 2008 Forfatter Del Skrevet 12. mars 2008 Alt dette foregår i Form1 ja. Lenke til kommentar
GeirGrusom Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 i VB må man vel skrive """ og ikke "\""? Har du prøvd å debugge programmet? Å sette ut kontroller og slikt for å sjekke innholdet er håpløst. Velg linjen der det står "navigate = SDF.Filename" og trykk F9 Start programmet, og når Visual Studio da bremser på den linje, trykker du F10 én gang. Da vil du set at den har endret verdien i variabler. Da blir jobben din å finne ut når verdien blir resatt ved å trykke F10 (step over) og F11(step into) gjennom koden til du ser at verdien i den blir endret. Eventuelt kan du sette en watcher på variablen, men jeg tror det er bedre å ta én ting av gangen. Lenke til kommentar
CheatEnabled Skrevet 12. mars 2008 Forfatter Del Skrevet 12. mars 2008 Når jeg prøvde det du sa, GeirGrusom, så hang alt seg opp etter den linjen med kode der jeg satt debugging-punktet. Vshost.exe sluttet å svare. Lenke til kommentar
GeirGrusom Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 (endret) trykk F10 eller F11, Visual Studio stopper programmet helt til du trykker enten F5, F6, F10 eller F11. Det er litt av poenget at programmet skal slutte å svare da Du kan få se verdiene av variablene ved å holde over teksten i Visual Studio. Endret 12. mars 2008 av GeirGrusom Lenke til kommentar
CheatEnabled Skrevet 12. mars 2008 Forfatter Del Skrevet 12. mars 2008 Feilen var når variablen skulle gå fra form1 til form2. Den blir da til Null. Vet ikke hvordan jeg skal laste variablen på riktig måte, nå er det sånn: private void button1_Click(object sender, EventArgs e) { Form1 form1 = new Form1(); wb.Navigate(form1.navigate); } Prøvde å lage en ny instance av Form1 i global-variabel-seksjonen, men da fikk jeg et error. Lenke til kommentar
Manfred Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 Det er uansett ganske grisete å bruke public stringer som det der. Lenke til kommentar
CheatEnabled Skrevet 12. mars 2008 Forfatter Del Skrevet 12. mars 2008 Jeg kan godt forandre det, men hvordan? Jeg er ikke spesielt god i C#, startet mitt første ordentlige prosjekt i så sent som i går. Har prøvd å google masse, men jeg klarer ikke finne noen enkel og grei måte å gjøre det på. Lenke til kommentar
GeirGrusom Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 Husk at public variabler ikke følger med fra en instans til en annen. Istedet for public variabler, bruker man properties. Dette fordi at programmet skal kontrollere innholdet, og ikke bare brukeren /andre programmerere. Det er rett og slett god programmeringsskikk. en property ser slik ut: public [data typen til propertien] [navn] { get { // Dette er en funksjon som skal returnere en verdi // f.eks. return navigate } set { // Denne funksjonen setter verdien // den nye verdien ligger i nøkkelordet value // f.eks. navigate = value; } } Det er ikke nødvendig med både get og set, hvis du vil ha en read only variabel, skriver du ingen set funksjon, write only, ingen get etc. Lenke til kommentar
CheatEnabled Skrevet 12. mars 2008 Forfatter Del Skrevet 12. mars 2008 Det der skjønte jeg ikke helt. Hvor i koden min skal jeg sette dette? Form1 eller form2? For meg virker det som det må splittes, at set skal ligge i form1 og get skal ligge i form2. Lenke til kommentar
GeirGrusom Skrevet 12. mars 2008 Del Skrevet 12. mars 2008 (endret) Vel, Form1 og Form2 er kun datatyper. Disse datatypene kan ha felt, egenskaper eller funksjoner. Når du instansierer et objekt av typen 'Form1' så vil ikke den automatisk dele alle feltene sine med alle andre 'Form1' instanser (med mindre feltene eller funksjonene er definert static) Man definerer ofte felt som private, protectede eller internal for at f.eks. for at en instans av Form2 ikke skal gå direkte inn og endre verdien i en instans av Form1. Da bruker man properties for at Form1 instansen skal ha kontroll på verdien i feltet. eksempel: public static class Program { // deklarer statiske variabler protected static Form1 m_form1; protected static Form2 m_form2; public static Form1 Form1 { get { return m_form1; } } public static Form2 Form2 { get { return m_form2; } } public static int Main() { m_form1 = new Form1(); m_form2 = new Form2(); Application.Run(m_form1); } } public class Form1 : System.Windows.Forms.Form { // Deklarer feltet m_navigate og propertien til dette feltet under protected string m_navigate; public string Navigate { get { return m_navigate; } set { m_navigate = value; } } } public class Form2 : System.Windows.Forms.Form { private System.Windows.Forms.WebBrowser m_browser; public Form2() { m_browser = new System.Windows.Forms.WebBrowser(); Controls.Add(m_browser); } public OnPerformNavigate() { m_browser.Navigate(Program.Form1.Navigate); } } edit: Legger til at jeg ikke synes så mye om statiske variabler heller, men syntes det var den enkleste måten å forklare dette på Endret 12. mars 2008 av GeirGrusom Lenke til kommentar
CheatEnabled Skrevet 12. mars 2008 Forfatter Del Skrevet 12. mars 2008 Ok, takk for informasjonen. Merkelig å gjøre det så avansert å bruke en variabel i flere forskjellige forms. Lenke til kommentar
GeirGrusom Skrevet 13. mars 2008 Del Skrevet 13. mars 2008 Det kan virke rart med en gang, men det er en veldig god grunn til at vi gjør det slik. Å bruke public variabler er utrolig dårlig skikk. 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å