Avatar billede Slettet bruger
28. oktober 2009 - 01:12 Der er 9 kommentarer og
1 løsning

Linie cursor position

Hej

Et formegentlig nemt spørgsmål. Tror bare jeg er for træt, men:

Hvis du forestiller dig at jeg har et array med strings der ser således ud:

[0]Hej med dig
[1]hvorfor kan jeg ikke
[2]finde ud af dette?

Jeg skal splitte dette op i to dele ud fra en samlet position. dvs jeg vil gerne spille det hele ved position 19, altså lige efter Hvorfor på index 1, så jeg får:

[0]Hej med dig
[1]hvorfor
[2]kan jeg ikke finde ud af dette?

Mit problem er, hvordan kan jeg regne mig frem til, hvilken position i forhold til index 1, slutningen på "hvorfor" har? altså i forhold til index 1 vil det være 8. Men hvordan finder jeg ud af det?

Håber det giver mening!
Avatar billede Slettet bruger
28. oktober 2009 - 01:15 #1
For at sætte det i perspektiv, så står disse tre linier i én tekst boks hvor jeg vil splitte det til to hvor cursoren er. Cursor vil være i position 19

Så:

Textbox 1:
Hej med dig
Hvorfor

Tetxbox 2:
kan jeg ikke finde ud af dette?
Avatar billede arne_v Ekspert
28. oktober 2009 - 01:30 #2
Grundliggende starter du vel i position 20 og søger indtil et space og splitter der ?
Avatar billede arne_v Ekspert
28. oktober 2009 - 01:50 #3
Næh.

Efter at have læst spørgsmålet igen forstår jeg ikke hvad du vil.
Avatar billede Spotgun Seniormester
28. oktober 2009 - 08:30 #4
Er det nemmeste ikke bare at samle de tre elementer fra arrayet i én streng, finde din position og splitte der? Eller har jeg helt misforstået spørgsmålet?
Avatar billede Slettet bruger
28. oktober 2009 - 08:45 #5
Altså.. jeg har disse tre strings i en List<string>. Jeg skal splitte disse linier på et bestemt, dynamisk sted.

Hvis tekstboksen fra start indeholder:

Hej med dig
hvorfor kan jeg ikke
finde ud af dette?

Jeg jeg gerne vil splitte lige her:

Hej med dig
hvorfor| kan jeg ikke
finde ud af dette?

Så skal jeg beholde de oprindelige linier fra den første del, men merge alle linier sammen til tekstboks to.

Hej med dig
hvorfor

kan jeg ikke finde ud af dette?

Så jeg kan desværre ikke bare samle det hele og splitte dér, det ville være nemt nok :)

Men eftersom jeg kun har den samlede position, er jeg nød til at vide, i index 1, præcis HVOR jeg skal splitte.
Avatar billede bitmatic Nybegynder
28. oktober 2009 - 09:05 #6
Jeg har lavet en kodestump der måske kan hjælpe dig lidt videre. Jeg forstår ikke helt hvor du får din List<string> fra... Den kode jeg har lavet arbejder bare direkte med textboksenes Text property.

1. Lav en form med 2 textboxe (textBox1 og textBox2).
2. Tilføj en KeyDown eventhandler til textBox1.
3. Smid følgende kode i eventhandleren:

if (e.KeyCode == Keys.F1)
{
    textBox2.Text = textBox1.Text.Substring(textBox1.SelectionStart);
    textBox1.Text = textBox1.Text.Substring(0, textBox1.SelectionStart);
    e.Handled = true;
}

Når du så trykker på F1 i textbox1 vil texten fra cursoren og fremad blive poppet over i textbox2.
Avatar billede Slettet bruger
28. oktober 2009 - 09:16 #7
Jeg får mit string array fra richtextbox property'en Lines. Jeg kan i dette tilfælde kun benytte string arrayet og ikke funktionaliteter der ligger på kontrollen.

Mit eneste input er altså et array med strings og cursorPosition i kontrollen.

Problemet i det her er altså at jeg SKAL beholde index strukturen for den første del og den anden del (den der skal over i den nye boks) skal jeg bare bruge den samlede tekst.

Så jeg skal helt basalt blot bruge et regnestykke der fortæller mig cursor position i index 1 i forhold til index 1 og ikke hele teksten. I hele teksten ligger enden på hvorfor ved index 19, men i forhold til index 1 ligger det på cursorPosition 8 og det er dér jeg så skal splitte.
Avatar billede Spotgun Seniormester
28. oktober 2009 - 14:56 #8
Skal der tages højde for at cursor positionen kan ligge i andre indexes end 1? F.eks. 2, 7 eller højere (eller 0 for den sags skyld)?
Avatar billede Spotgun Seniormester
28. oktober 2009 - 15:05 #9
Her er en hurtig løsning:

        private void button1_Click(object sender, EventArgs e)
        {
            CursorPosition pos = GetRelativeCursorPosition();
            Console.WriteLine("Relative cursor position: " + pos.RelativeCursorPosition);
            Console.WriteLine("Relative to index number: " + pos.Index);
        }

        private struct CursorPosition
        {
            public int RelativeCursorPosition;
            public int Index;
        }

        private CursorPosition GetRelativeCursorPosition()
        {
            int cursorPosition = richTextBox1.SelectionStart;
            int positionCounter = 0;
            for (int i = 0; i < richTextBox1.Lines.Length; i++)
            {
                if (cursorPosition <= (positionCounter + richTextBox1.Lines[i].Length))
                {
                    CursorPosition cp = new CursorPosition();
                    cp.RelativeCursorPosition = cursorPosition - positionCounter;
                    cp.Index = i;
                    return cp;
                }
                positionCounter += richTextBox1.Lines[i].Length;
            }
            return new CursorPosition();
        }
Avatar billede Slettet bruger
29. oktober 2009 - 01:09 #10
Tak for det, det hjalp :)
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