Shmotes Skrevet 16. oktober 2008 Del Skrevet 16. oktober 2008 (endret) 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 16. oktober 2008 av Shmotes Lenke til kommentar
aadnk Skrevet 17. oktober 2008 Del Skrevet 17. oktober 2008 (endret) 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 DictionaryIf 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 17. oktober 2008 av aadnk Lenke til kommentar
Shmotes Skrevet 17. oktober 2008 Forfatter Del Skrevet 17. oktober 2008 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. Men finnes det ikke en måte å gjøre slik at RichTextBox1 bare kan forandres 1 gang etter at Button1 har blitt trykket på? Lenke til kommentar
Manfred Skrevet 17. oktober 2008 Del Skrevet 17. oktober 2008 Det er nettopp det ElseIf gjør!!! trenger bare en kommando? Hva tror du at programmering er, egentlig? Lenke til kommentar
aadnk Skrevet 17. oktober 2008 Del Skrevet 17. oktober 2008 (endret) 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 18. oktober 2008 av aadnk Lenke til kommentar
Alexen Skrevet 17. oktober 2008 Del Skrevet 17. oktober 2008 Hehe.. Du høres ut som en lærebok aadnk Tror kanskje han må over stadiet "GIMME TEH CODE" før han skjønner det du skriver men jøss, bra engasjement Lenke til kommentar
Alexen Skrevet 18. oktober 2008 Del Skrevet 18. oktober 2008 Det var aldri ment som no angrep fra min side. Jeg synes det er flott at du tar deg tid til å skrive kode med kommentarer, og du har jo rett i at det kan være til hjelp for andre enn trådstarter. Jeg er bare litt fascinert over at du faktisk gidder Lenke til kommentar
GeirGrusom Skrevet 19. oktober 2008 Del Skrevet 19. oktober 2008 Du får la aadnk gjøre som han vil da, selv ser jeg på det som en bjørnetjeneste å GIEF TEH CODEZ PLOX. Tror ikke det hjelper at du bruker LINQ heller Kanskje regex egentlig hadde vært den mest elegante løsningen her? Lenke til kommentar
aadnk Skrevet 19. oktober 2008 Del Skrevet 19. oktober 2008 (endret) 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 19. oktober 2008 av aadnk Lenke til kommentar
ilpostino Skrevet 19. oktober 2008 Del Skrevet 19. oktober 2008 jeg har ryddet i tråden. vær snille og hold dere til topic gutter og jenter. Lenke til kommentar
Shmotes Skrevet 2. november 2008 Forfatter Del Skrevet 2. november 2008 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
GeirGrusom Skrevet 2. november 2008 Del Skrevet 2. november 2008 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
Manfred Skrevet 3. november 2008 Del Skrevet 3. november 2008 Sant. Det er litt frustrerende å prøve å hjelpe noen som det virker som om absolutt ikke tar til seg det man sier og prøver. Lenke til kommentar
miXer Skrevet 18. november 2008 Del Skrevet 18. november 2008 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
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å