Gå til innhold

Anbefalte innlegg

Hallo,

jeg lager et progg hvor man skriver inn tekst,

så bruker jeg Replace("", "") som fks en komando her

 

If RichTextBox1.Text.Contains("k") Then

RichTextBox1.Text = RichTextBox1.Text.Replace("k", "ør")

End If

 

og

 

If RichTextBox1.Text.Contains("a") Then

RichTextBox1.Text = RichTextBox1.Text.Replace("a", "kü")

End If

 

Men hvist jeg skriver "a", så skriver han "ørü"!!

Finnes det en kode som gjør at RichTextBox1.Text kan bare forandre 1 gang

etter at den har blitt forandret?

Eller hvis du har noen andre forslag så do tell!

Endret av Shmotes
Lenke til kommentar
Videoannonse
Annonse

Dersom du ikke forventer å utføre erstatningsreglene om igjen, kan du forhindre at resultatene blir forandret ved å avslutte IF-setningene når en erstatning blir gjennomført; eksempelvis ved å lage èn lang IF-setning (via ElseIf):

' Du kan også bruke en løkke og en Dictionary

If RichTextBox1.Text.Contains("k") Then

   RichTextBox1.Text = RichTextBox1.Text.Replace("k", "ør")

ElseIf RichTextBox1.Text.Contains("a") Then

   RichTextBox1.Text = RichTextBox1.Text.Replace("a", "kü")

End If

Men, om denne koden kjøres flere ganger (eksempelvis i RichTextBox1_TextChanged) burde du heller utføre erstatningen i inndataen:

Public Class Form1

   Private Sub RichTextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyDown

 

       ' Dersom du vil håndtere andre formater (HTML, RTF) må du hente ut tekstfelter slik at en unngår å erstatte

       ' karakterer i metafeltene (om ikke blir <a>ba</a> til <kü>bkü</kü> fremfor <a>bkü</a>)

       If e.Control AndAlso e.KeyCode = Keys.V Then

           If Clipboard.ContainsText(TextDataFormat.Text) OrElse Clipboard.ContainsText(TextDataFormat.UnicodeText) Then

               RichTextBox1.SelectedText = ProcessText(Clipboard.GetText)

               e.Handled = True

           End If

       End If

 

   End Sub

 

   Private Sub RichTextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles RichTextBox1.KeyPress

 

       ' Lar ENTER og BACKSPACE være i fred

       If Not Char.IsControl(e.KeyChar) Then

           RichTextBox1.SelectedText = ProcessText(e.KeyChar.ToString)

           e.Handled = True

       End If

 

   End Sub

 

   Public Function ProcessText(ByVal Value As String) As String

 

       ' Erstatt verdier

       If Value.Contains("k") Then

           Return Value.Replace("k", "ør")

       ElseIf Value.Contains("a") Then

           Return Value.Replace("a", "kü")

       Else

           Return Value

       End If

 

   End Function

End Class

Endret av aadnk
Lenke til kommentar
Oi, litt mye til svar men jeg bruker VB 2008,

og trenger bare kommando for det.

+ At jeg har prøvd elseif greia, og det funka ikke så lett.

Du var nå såpass uklar i problembeskrivelsen at jeg umulig bare kunne gi deg "kommandoen" (koden), og i alle tilfeller vil jeg rent generelt at man faktisk lærer noe fra kodeeksemplene, og ikke bare kopiere kode og utnytte den tjenesten alle her yter gratis.

 

I innlegget ovenfor nevnte jeg at ELSEIF-eksempelet KUN fungerer dersom koden kjøres èn gang. Legges koden inn i en knapp brukeren trykker på flere ganger, er dette såklart ikke tilstrekkelig, og en må dermed enten erstatte teksten etterhvert som den skrives i tekstboksen (mitt andre eksempel), eller ta høyde for indre sekvenser i resultatordene ved å rett og slett ignorere dem. Dette kunne man muligens ha gjort ved å lagre erstattede forekomster i en Array/liste, men da teksten kan endres radikalt av brukeren mellom hver knappetrykk, bør man i stedet bruke selve teksten som basis. Her kunne man godt brukt regulære uttrykk, men dette lar seg vanskelig automatisere for generelle søkeørd. Det beste er nok derfor å lage sin egen skreddesydde erstatningsfunksjon, så som følgende:

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       RichTextBox1.Text = ReplaceEx(RichTextBox1.Text, "k", "ør", "a", "kü")

   End Sub

 

   Public Function ReplaceEx(ByVal Text As String, ByVal ParamArray KeyValues() As String) As String

 

       ' Da vi behøver rask oppslag, konverterer vi til tabeller

       Dim Chars = Text.ToCharArray, Possible As Boolean, Longest As Integer

       Dim Values = KeyValues.Select(Function(x) x.ToCharArray).ToArray

       Dim Candidates As New List(Of Integer), Matches As New List(Of Integer)

       Dim Output As New System.Text.StringBuilder

 

       ' Gå gjennom alle karakterene (bokstaver, tall) èn etter èn

       For i = 0 To Chars.Length - 1

 

           ' Se om vi har kommet til et mulig nøkkelord

           For j = 0 To Values.Length - 1

               If Chars.Length >= Values(j).Length + i AndAlso Values(j)(0) = Chars(i) Then

                   If Values(j).Length = 1 Then Matches.Add(j) Else Candidates.Add(j)

                   Longest = Math.Max(Values(j).Length - 1, Longest)

                   Possible = True

               End If

           Next

 

           ' Test videre om mulig

           If Possible Then

 

               Dim iBest As Integer = 0

 

               For k = 1 To Math.Min(Chars.Length - 1 - i, Longest)

                   For j = 0 To Candidates.Count - 1

                       If j < Candidates.Count Then

                           ' Sjekk alle tegn

                           If Values(Candidates(j))(k) = Chars(i + k) Then

                               If k = Values(Candidates(j)).Length - 1 Then

                                   Matches.Add(Candidates(j))

                                   Candidates.RemoveAt(j)

                                   j -= 1

                               End If

                           Else

                               Candidates.RemoveAt(j)

                               j -= 1

                           End If

                       End If

                   Next

               Next

 

               If Matches.Count > 0 Then

 

                   ' Finn største gyldige forekomst

                   For Each Index In Matches

                       If Values(Index).Length > Values(iBest).Length Then

                           iBest = Index

                       End If

                       ' Om nødvendig, kan du favorisere søkeord over erstatningsord

                       ' (eller omvendt) i denne løkken

                   Next

 

                   '   i mod 2 =     0             1               0

                   ' KeyValues = {[søkeord], [å erstatte med], [søkeord], ...}

                   If iBest Mod 2 = 0 Then

                       If iBest < Values.Length - 1 Then

                           Output.Append(KeyValues(iBest + 1))

                       End If

                   Else

                       Output.Append(KeyValues(iBest))

                   End If

 

                   ' Ikke søk inn i selve søkeordet

                   i += Math.Max(Values(iBest).Length - 1, 0)

               End If

 

               ' Forberedelse til neste runde

               Possible = False

               Candidates = New List(Of Integer)

               Matches = New List(Of Integer)

               Longest = 0

           Else

               Output.Append(Chars(i))

           End If

       Next

 

       Return Output.ToString

 

   End Function

End Class

Hvis du synes den er for lang, kan du jo prøve å forkorte den selv. Da vil du sannsynligvis lære en hel del, enten du lykkes eller ei.

Endret av aadnk
Lenke til kommentar
Du får la aadnk gjøre som han vil da, selv ser jeg på det som en bjørnetjeneste å GIEF TEH CODEZ PLOX.
Hvis han vet hva som er godt for ham selv, burde han kunne velge den løsningen han kan forstå, eventielt droppe det hele.

 

Kanskje regex egentlig hadde vært den mest elegante løsningen her?
Ikke hvis man har å gjøre med mange søkeord. Da må man jo manuelt passe på at de regulære uttrykkene tar hensyn til alle subsequence-ene, og da jeg antok nøkkelordene trådstarter oppgav var eksempler, tenkte jeg først og fremst på en mer generell løsning. Endret av aadnk
Lenke til kommentar
  • 2 uker senere...
Det er nettopp det ElseIf gjør!!!

 

trenger bare en kommando? Hva tror du at programmering er, egentlig?

 

Prøv du da å bruke ElseIf, slik at den gjør

"k" til "ku",

og "u" til "ak"!

 

Se om det går ann at den skriver "ku" og ikke "kak" da

visst du er så knallgod i dette herre!

Lenke til kommentar
Det er nettopp det ElseIf gjør!!!

 

trenger bare en kommando? Hva tror du at programmering er, egentlig?

 

Prøv du da å bruke ElseIf, slik at den gjør

"k" til "ku",

og "u" til "ak"!

 

Se om det går ann at den skriver "ku" og ikke "kak" da

visst du er så knallgod i dette herre!

 

Han prøver å hjelpe, men det føles litt som motgang når du ikke prøver å forstå hva koden gjør.

 

Det en kunne gjort, er å skrive en enkel funksjon som løser akkurat dette tilfellet, det er ikke mange linjene med kode, og det vil være effektivt, MEN det vil ikke være spesielt fleksibelt.

 

Den koden Aadnk skrev skal løse det, jeg har ikke lest nøye igjennom, men jeg vet fra før at han vet godt hva han driver med.

 

For å lage en generell løsning, så må du ikke sitte å jobbe med stringen du leser ifra, så den stringen du leser må ikke være oppdatert med endringene. Derfor ville også regex fungert, det spørs bare helt hvordan du implementerer det, og hva som egentlig er poenget med funksjonen.

Lenke til kommentar
  • 2 uker senere...

Dersom du skal endre teksten i en tekstboks BARE en gang og koden ligger under en knapp, så er det egentli en teit måte å gjøre det på.

 

Men dersom du vil ha det sånn, så kan du bruke en boolean.

 

Private endret As Boolean = False

 

If Not endret then

If RichTextBox1.Text.Contains("k") Then

RichTextBox1.Text = RichTextBox1.Text.Replace("k", "ør")

endret = True

End If

End If

 

 

Da vil koden sjekke om teksten er endret en gang før, hvis ikke endrer den og setter boolean til true, dersom den er endret er allerede boolean true og den endrer ikke.

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...