Avatar billede km2 Nybegynder
11. maj 2009 - 13:09 Der er 21 kommentarer og
1 løsning

Hjælp til at indlæse en gemt Forecolor fra en tekstfil.txt.

Jeg har et C# program som kan gemme programmets indstillinger fra brugeren ved at trykke på en knap(save layout). Det bliver gemt i en tekstfil. Der bliver blandt andet gemt en forgrundsfarve på den tekst man skriver i sine tekstbokse. Hvordan indlæses sådan en forgrundsfarve igen, sådan at teksten i tekstboksene f.eks bliver grøn hvis det var grøn forgrundsfarve som der var blevet gemt i filen?Compileren siger at inputstrengen ikke er i det rigtige format. se også tekstfil nedenfor.

Her er programstumpen:

private void cmdLoad_Click(object sender, EventArgs e)
        {
           
            int position  = 0;

            cmOpen.Filter = "*.txt|*.txt";
            cmSave.Filter = "*.txt|*.txt";
            cmOpen.InitialDirectory = savepath;
            cmSave.InitialDirectory = savepath;
            cmOpen.ShowDialog();
            cmSave.FileName = cmOpen.FileName;

            FileStream file = new FileStream(cmOpen.FileName, FileMode.Open, FileAccess.Read);
            StreamReader sr = new StreamReader(cmOpen.FileName);
            int i = 0;
            if (cmOpen.FileName != "")
            {
                string st;
                //while ((st = sr.ReadLine()) != null)
                for (i = 0; i < textbox.Length;i++)
                {
                    st = sr.ReadLine();
                    position = st.IndexOf('=');
                    if (position > 0)
                    {
                        st = st.Substring(position + 1);
                    }
                    textbox[i].Text = st;
                    textbox[i].ForeColor =              System.Drawing.ColorTranslator.FromOle((Int32.Parse(st)));       
                } 
            }
            sr.Close();
            file.Close();
        }

Sådan bliver det lagt ind i filen:

0 = kim
Microsoft Sans Serif
8,25
False
False
4227327

Den nederste linie er en farvekode på en forgrundsfarve.
Avatar billede magic-mouse Novice
11. maj 2009 - 13:21 #1
Hvorfor gemmer du farven i farvekoder når der er klasser til at tage sig af den slags så du ikke skal bekymre dig om det.

C# er fantastisk hvis man lader programmerings sproget arbejde for dig. Gem tekst farven i en string istedet.

textbox[i].ForeColor = Color."color";

Ellers kigger lidt nærmere på det når jeg kommer hjem fra arbejde.
Avatar billede km2 Nybegynder
11. maj 2009 - 13:37 #2
Jeg har 64 tekstbokse som genereres i et panel ved runtime. Ved at indtaste tekst i hver af tekstboksene som man nu synes og man kan vælge forskellige fonte og forecolor på indtastet tekst i tekstboksene. Når man er færdig gemmer man det i en tekstfil. Den gemmer teksten, fonten, forecolor og size in points for hver af tekstboksene. Når jeg så en anden dag vil hente disse indstillinger frem igen har jeg en anden knap som hedder load layout. Den indlæser min tekstfil. Der kunne jeg godt tænke mig at den kunne læse den gemte forgrundsfarve ind i programmet igen og at teksten i tekstboksen f.eks bliver grøn når tekstfilen indlæses. Kan jeg få hjælp til det?
Avatar billede tjacob Juniormester
11. maj 2009 - 14:56 #3
Du kunne prøve at bruge Color-klassen i stedet for ColorTranslator-klassen:

Ved udlæsning:    st = textbox[i].ForeColor.ToArgb.ToString

Ved Indlæsning:  textbox[i].ForeColor = Color.FromArgb(Int32.Parse(st))
Avatar billede km2 Nybegynder
11. maj 2009 - 17:07 #4
tak for svaret det vil jeg prøve. men hvordan får jeg programmet til at indlæse fontnavne og font sizeinpoints og font.Bold og font.Italic fra den samme tekstfil udfra det kode jeg har postet?
Problemet er at alt data læses fra min string st.
Så når jeg ønsker at indlæse den font jeg havde valgt så får jeg et problem med typerne.

textbox[i].Font = st;
og
textbox[i].Font.Sizeinpoints = st;
Avatar billede tjacob Juniormester
11. maj 2009 - 17:52 #5
Ja, du er naturligvis nødt til konvertere de forskellige typer til/fra Strings:

Font navn gemmes som String:
  UD:    st = textbox[i].Font.FontFamily.Name
  IND:  textbox[i].Font = New Font(st, 10, FontStyle.Regular, GraphicsUnit.Point)

Efterfølgende sættes SizeInPoints og Bold og Italic.

Italic/Bold kan jo gemmes som True/False:
  UD:    st = textbox[i].Font.Bold.ToString
  IND:    textbox[i].Font.Bold = Boolean.Parse(st)

SizeInPoints gemmes som integer:
  UD:    st = textbox[i].Font.Sizeinpoints.ToString
  IND:  textbox[i].Font.Sizeinpoints = Int32.Parse(st)
Avatar billede km2 Nybegynder
11. maj 2009 - 18:56 #6
Det med fonten virker men resten det med bold og italic og sizeinpoints virker ikke da det er readonly. Det vil sige at man ikke kan sige boolean.Parse(st); man kan ikke assigne noget da det er readonly. Hvad er det jeg gør forkert?

  textbox[i].Font.Bold = Boolean.Parse(st);
  st = sr.ReadLine();
  textbox[i].Font.Italic = Boolean.Parse(st);
  st = sr.ReadLine();
  textbox[i].Font.SizeInPoints = Int32.Parse(st);
Avatar billede tjacob Juniormester
11. maj 2009 - 19:02 #7
Så må du sammenstykke værdierne fra Bold/Italic og SizeInPoints, så de kan indsættes direkte i:

textbox[i].Font = New Font(st, 10, FontStyle.Regular, GraphicsUnit.Point)

SizeInPoints i stedet for 10, og så erklære en Fontstyle-variabel der sættes med den relevante værdi, og indsættes i stedet for FontStyle.Regular.
Avatar billede km2 Nybegynder
11. maj 2009 - 19:34 #8
Det er garanteret meget simpelt men den FontStyle variabel når man har erklæret sådan en hvordan kan den variabel så skifte om hvis jeg nu har valgt Bold, Italic eller Normal.
Avatar billede tjacob Juniormester
11. maj 2009 - 19:40 #9
Det er ikke helt simpelt, da det jo også kan være en kombination:

Hvis Fontstyle-var hedder FS, og Bold-var hedder BO, og Italic-var hedder IT:

If BO = True And IT = False Then FS = FontStyle.Bold
If BO = True And IT = True Then FS = FontStyle.Bold Or FontStyle.Italic
If BO = False And IT = True Then FS = FontStyle.Italic
If BO = False And IT = False Then FS = FontStyle.Regular
Avatar billede km2 Nybegynder
11. maj 2009 - 20:14 #10
Jeg er ikke helt sikker på at jeg forstår hvad du vil og jeg arbejder i C# men der er stadig nogle irriterende fejl som jeg ikke kan komme videre med. prøv at se her: compileren mener at if-sætninger er forkerte. kan ikke se hvad der er galt.

FontStyle FS = new FontStyle();
                    FontStyle BO = new FontStyle();
                    FontStyle IT = new FontStyle();

                    BO = FontStyle.Bold;
                    IT = FontStyle.Italic;
                   
                   
                    textbox[i].Text = st;
                    st = sr.ReadLine();
                    if (BO == true && IT == false)
                    {
                        FS = FontStyle.Bold;
                        textbox[i].Font = new Font(st, Font.SizeInPoints,FS, GraphicsUnit.Point);
                    }
                    st = sr.ReadLine();
                    if (BO == true && IT == true)
                    {
                        FS = FontStyle.Bold;
                        textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point);
                        FS = FontStyle.Italic;
                        textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point);
                    }

                    if (BO == false && IT == true)
                    {
                        FS = FontStyle.Italic;
                        textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point);
                   
                    }

                    if (BO == false && IT == false)
                    {
                        FS = FontStyle.Regular;
                        textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point);
                    }
Avatar billede km2 Nybegynder
11. maj 2009 - 20:37 #11
skal bold og italic variablerne også være af typen FontStyle?
Avatar billede tjacob Juniormester
12. maj 2009 - 10:31 #12
Ja, jeg beklager med sproget, men jeg er VB NET mand, og kender ikke den korrekte C# syntaks.

Mht Bold og Italic variablerne: Det er for såvidt ligegyldig, hvilket format de er i (du kunne faktisk bruge strengene direkte fra textfilen). De skal jo blot bruges til at sætte FontStyle-variablen.
Men når du bruger dem i If-sætningerne med False og True, så skal de jo være Boolean.
Når compileren brokker sig over dine If-sætninger, er det jo fordi du prøver at teste om en FontStyle er True (eller False). Den går ikke.
Avatar billede km2 Nybegynder
12. maj 2009 - 11:24 #13
Hej, det du kom på igår med de if - sætninger virker til at være den rigtige måde at gøre det på. Jeg kan godt læse og forstå VB.NET når det kun drejer sig om det her med mit C# problem. Så jeg ville spørge dig hvordan skulle man lave det med at læse strengen hvor der står "False" eller "True" fra filen for det lyder som en smart ide? I min fil kommer først

0=Text
Microsoft Sans Serif
True
False
65280

Hvordan får Fontstylevariablen til at reagere på strengen True?
og i if - sætningerne skal man da sige noget i retning af
if (Font.Bold == True && Font.Italic == False)
osv.
Fordi Fontstyle kan ikke være en streng så jeg er nysgerrig efter at vide hvordan du ville gøre det.
Avatar billede km2 Nybegynder
12. maj 2009 - 15:33 #14
Jeg har gjort som du sagde med Fontstyle og if-sætningerne og nu virker det pludselig. nu kan den skifte til bold og italic og regular. Så jeg siger mange tak for svaret. Nu mangler den bare også kunne ændre fonten og det burde den gøre men det gør den ikke. Koden ser sådan ud:

FontStyle FS = new FontStyle();
                    textbox[i].Text = st;
                    st = sr.ReadLine();
                    textbox[i].Font = new Font(st, 8, FontStyle.Regular, GraphicsUnit.Point);
                    st = sr.ReadLine();
                    bool BO = Boolean.Parse(st);
                    st = sr.ReadLine();
                    bool IT = Boolean.Parse(st);
                    if ((BO == true && IT == false))
                    {
                        FS = FontStyle.Bold;
                        textbox[i].Font = new Font(st, Font.SizeInPoints,FS, GraphicsUnit.Point);
                     
                    }
                    if (BO == true && IT == true)
                    {
                        FS = FontStyle.Bold | FontStyle.Italic;
                        textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point); 
                    }
                    if (BO == false && IT == true)
                    {
                        FS = FontStyle.Italic;
                        textbox[i].Font = new Font(st, Font.SizeInPoints,FS, GraphicsUnit.Point); 
                    }
                    if (BO == false && IT == false)
                    {
                        FS = FontStyle.Regular;
                        textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point); 
                    }
Avatar billede tjacob Juniormester
12. maj 2009 - 18:23 #15
Fejlen opstår når du prøver at lave en ny Font med st, men st indeholder ikke Font-navnet længere, men derimod True eller False.

Lav en ekstra variabel specielt til Fontnavnet, og sæt den når du læser første linie ind.

Du behøver heller ikke sætte fonten efter hver test på FontStyle.
Slet alle textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point); -linierne undtagen den sidste, og erstat st med fontnavn-variablen i den.
Avatar billede tjacob Juniormester
12. maj 2009 - 18:26 #16
FS har først den korrekte værdi når alle 4 If-sætninger er kørt, derfor er der ingen grund til at bruge den før.
Avatar billede tjacob Juniormester
12. maj 2009 - 18:31 #17
Den sidste textbox[i].Font = new Font(st, Font.SizeInPoints, FS, GraphicsUnit.Point); -linie skal så flyttes udenfor If-sætningen.
Avatar billede km2 Nybegynder
12. maj 2009 - 19:17 #18
ok jeg har lavet det om som du siger. Men hvordan laver du font navn variablen. den eneste måde jeg kender er font f = new font(st, font.Sizeinpoints,FontStyle.Regular,GraphicsUnit.Point)
men det er vel ikke sådan du mener man laver en fontnavnvariabel?
Avatar billede tjacob Juniormester
12. maj 2009 - 19:33 #19
Fontnavnet er i dette tilfælde st, altså den første parameter i New Font()
Jeg skal til møde i aften, men vender tilbage i morgen......
Avatar billede km2 Nybegynder
12. maj 2009 - 19:38 #20
Jeg har fået det til at virke nu og du havde ret i at man skulle lave en font navn variabel og så sætte den og så fjerne alle de linier på nær den sidste. nu kan jeg skifte font, og kursiv og fed og kursiv og fed.  nu kan du se i min kode at jeg hver gang tildeler de forskellige data fra filen til mit tekstboksarray. Jeg oplever at programmet flakser(blinker) meget hurtigt i noget tid før ændringen er sket. Det ser ikke pænt ud. Skal der noget refresh til eller noget andet til så ændringen sker med det samme?
Avatar billede km2 Nybegynder
12. maj 2009 - 20:07 #21
Men ihvertfald vil jeg gerne sige tak for alt hjælp og hvis du også har lyst til at hjælpe mig med at fjerne det der blinkeri eller at programmet blinker lige før data hentes ind i programmet. Så vil jeg vente til i morgen.
Avatar billede tjacob Juniormester
13. maj 2009 - 10:46 #22
Når man opdaterer store grupper af kontroller (og 40 textboxe er mange!) kan man opleve denne blinken. Det er en "bug" i .NET.

Såvidt jeg ved er der ikke meget at gøre ved det, men der er to ting der måske kan reducere det:

1. Sæt din forms DoubleBuffering property til True.

2. Indsæt this.SuspendLayout(); før du opdaterer formen, og this.ResumeLayout(false); efter du har opdateret.

Ellers skal du ind og sætte doublebuffering på alle kontroller.
se evt. her:  http://stackoverflow.com/questions/181374/visual-c-form-update-results-in-flickering

-Godt du fik det andet til at virke. Tillader mig at lave dette indlæg som et svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester