Avatar billede Claus Mester
21. september 2000 - 07:58 Der er 19 kommentarer og
1 løsning

Txtbox opdager foruddefineret indtastning # 2

Tilsyneladende syntes visse personer, at dette spørgsmål kræver point som \"svært\" ;-)

Here goes:

Jeg skal kode således, at \"01\" i en txtbox erstattes fuldt ud med \"test\", samtidig med at den resterende tekst bibeholdes og så der kan skrives videre i txtboxen. Senere skal teksten \"02\" erstattes med \"test2\". 01 og 02 er således foruddefinerede koder.

Det skal kommenteres, at tallet \"0\" og tallet \"1\" skal kunne indtastes seperat UDEN aktivering af \"test\". \"test\" skal KUN aktiveres ved samtidig indtastning af \"01\" ???
Avatar billede joern Nybegynder
21. september 2000 - 11:09 #1
Hej Nicolaus.

Det er vel ikke svært, der skal bare en del linier til.

Hvis du under txtfelt > change anvender: If instr(tekst,\"01\")>0 then...  kan du få udført det du efterspørger.  Læs om Instr i hjælpen.  Måske kommer der en der vil skrive det hele.  Jeg går ikke selv op i point.

M.v.h.  Jørn
Avatar billede Claus Mester
21. september 2000 - 11:24 #2
Tak Jørn, for din beskrivelse.

Men jeg kan ikke få det til at virke. Jeg må så
også tilstå at jeg ikke forstår forklaringen i hjælp.
Avatar billede winkill Nybegynder
21. september 2000 - 12:34 #3
Vers\'go, du skal bare tilføje de udskiftninger du skal bruge ud over 01 og 02.

Private Sub Text1_Change()
    Text1.Text = Replace(Text1.Text, \"01\", \"test\")
    Text1.Text = Replace(Text1.Text, \"02\", \"test2\")
End Sub
Avatar billede powell Nybegynder
21. september 2000 - 13:00 #4
Jo det vil virke, men ønsker man at cursoren skal stå det samme sted efter koden er skiftet, vil jeg mener at man skal ligge en counter ind, så cursoren ikke hopper tilbage til start hele tiden.
Avatar billede winkill Nybegynder
21. september 2000 - 13:07 #5
Det har du da helt ret i powell.

Hvad med...

Private Sub Text1_Change()
  If Mid(Text1.Text, Text1.SelStart - 1, 2) = \"01\" Then
    Text1.SelStart = Text1.SelStart - 2
    Text1.SelLength = 2
    Text1.SelText = \"test\"
  End If
End Sub

Så skulle den løbende checke... Virker ikke ved Cut\'n Paste
Avatar billede Claus Mester
21. september 2000 - 13:12 #6
Tak, winkill. Men koden funger ikke. VBA kender ikke \"Replace\" ??

Koden skal placeres i VBA for Excel

Claus
Avatar billede powell Nybegynder
21. september 2000 - 13:15 #7
Winkill> Det burde fungere også i VBA for Excel
Avatar billede winkill Nybegynder
21. september 2000 - 13:17 #8
Gør ovenstående ikke det ? Det bruger ikke Replace.
Avatar billede Claus Mester
21. september 2000 - 13:17 #9
Virker ikke.

Jeg skriver:

Private Sub Text1_Change()
  If Mid(Text1.Text, Text1.SelStart - 1, 2) = \"01\" Then
    Text1.SelStart = Text1.SelStart - 2
    Text1.SelLength = 2
    Text1.SelText = \"test\"
  End If
End Sub

Men får fejlkoden:
Procedurekaldet eller argumentet er ugyldigt (fejl 5) - med linien If mid(... ) udpeget ???
Avatar billede winkill Nybegynder
21. september 2000 - 13:19 #10
Hmmm, strange, jeg laver lige en anden version så.
Avatar billede winkill Nybegynder
21. september 2000 - 13:27 #11
Ok, så skulle den være der. Hvis det giver problemer så ser jeg nok først på det senere... jeg skal lige passe mit job lidt ;-)

Private Sub Text1_Change()
    Dim intPos As Integer
    Dim intStart As Integer
    Dim intLength As Integer
    With Text1
        intStart = .SelStart
        intLength = .SelLength
        intPos = InStr(1, .Text, \"01\")
        While intPos > 0
            .Text = Left(.Text, intPos - 1) & \"test\" & Mid(.Text, intPos + 2)
            intStart = intStart + Len(\"test\") - Len(\"01\")
            intPos = InStr(intPos, .Text, \"01\")
        Wend
        .SelStart = intStart
        .SelLength = intLength
    End With
End Sub
Avatar billede Claus Mester
21. september 2000 - 14:03 #12
Hej winkill.

Det fungede om end koden er lidt kringlet. Kan det virkelig ikke gøres mere overskueligt?

Jeg har selv lavet en kode, der ligger i en case sætning. Her isættes \"0\" i en Dim Holder0 og \"1\" i Dim Holder1 as boolean. Så snart begge er true, slettes sidst indtastede bogstav (1) og erstattes med \"test\". Men dette resulterede i forskellige bugs.

Men det må da kunne gøres med case osv.?!

Tak!!!

Claus
Avatar billede winkill Nybegynder
21. september 2000 - 14:12 #13
Det kan det også, problemet er følgende.
Hvis du har teksten \"habla-nohable\" og så indtaster \"01\" i stedet for \"-\" så skulle curseren gerne ende mellem \"test\" og \"nohabla\". Derfor skal lengden af \"test\" - lengden af \"01\" lægges til curserens startposition.

Men det kan helt sikkert laves i en Select Case ting, det skal bare gøres ordentligt.

En anden mulighed er at pakke det ind i en Sub, som du så sender Text1 objektet samt det to stykker tekst der skal udskiftes. Men det er en helt andet historie og den får i i aften. ;o)
Avatar billede Claus Mester
21. september 2000 - 15:51 #14
Hej winkill

Kan du ikke (please) fortælle mig (vise mig), hvordan jeg koder jeg det i en case sætning?
ELLER
Hvordan jeg koder således, at jeg kan tilføje flere koder som f.eks. hvis \"02\" indtastes skal ... ske eller hvis \"08\" indtastes skal ... osv.

Jeg ved jeg beder om meget, men har hårdt brug for det. Hvis jeg så bare kunne forstå din kode :-o.

Håb, håb!!!

Claus
Avatar billede joern Nybegynder
21. september 2000 - 17:17 #15
Hej.

Der er sket meget i dagens løb.  Det vil være nyttigt om spørgere angiver dels hvilken version de benytter, når det er VB, men da især når det \"kun\" er VBA, og da til Office-version....
Men Nicolaus er i gode hænder, ser jeg.  Winkill har før hjulpet mig, så dér kan jeg ikke være med.
M.v.h.  Jørn
Avatar billede winkill Nybegynder
23. september 2000 - 13:13 #16
Sorry, min tid har mildest talt været totalt booket af arbejdet de sidste par dage, men jeg mixer lige et stykke kode sammen som:
1) Kan håndterer alle text_change events.
2) Er let at arbejde med uanset hvor mange \"koder\" der skal udskiftes.
3) Fungerer.

I shall return later...

PS. Jørn, tak men jeg er sikker på at du også kan lære mig et par ting om kodning, vi arbejder vidst med udvikling af vidt forskellige typer applikationer.
Avatar billede winkill Nybegynder
23. september 2000 - 13:45 #17
Vers\'go, dette skulle helst løse alle dine kvaler. Jeg har ikke brugt Select Case, da jeg mener at det ville gå for langsome.

Der er tre ting der skal rettes for at det vil komme til at virke.
1) Der hvor der står \"Set objTextBox = Text1\" skal du rette \"Text1\" til navnet på din textbox sådan at programmet ved hvilken textbox det drejer sig om - det gælder også for selve procedure/event navnet.
2) Du skal tilføje dine egne koder der hvor der står \"strCharCodes() = Array(\"01\", \"02\", \"03\")\" du kunne eks. skrive \"strCharCodes() = Array(\"kodeA\", \"kodeB\", \"kodeC\")\"
3) Du skal angive hvad hver enkelt kode skal udskiftes med der hvor der står \"strCCText() = Array(\"Test1\", \"Test2\", \"Test3\")\" Du kunne eksempelvis skrive \"strCCText() = Array(\"Jensen\", \"Hansen\", \"Mortensen\")\"

Derudover skulle der ikke være noget at tilføje andet end koden. Den kommer her:

Private Sub Text1_Change()
    Dim objTextBox As TextBox
   
    \' VIGTIGT!! Hvis du ikke bruger Text1 som textbox skal du rette nedenstående.
    \' Eks. Hvis din textbox hedder \"txtRedigeringsfelt\" skal nedenstående linie rettes til:
    \' Set objTextBox = txtRedigeringsfelt
    Set objTextBox = Text1
   
    If Len(objTextBox.Text) = 0 Then Exit Sub \' Hvis der ikke står noget i objTextBox så smutter vi bare videre ;o)
   
    \' Gør et par variabler klar til brug.
   
    Dim strCharCodes()
    Dim strCCText()
    Dim intCharCodeCounter As Integer
   
    Dim intPosition As Integer
    Dim strFoer As String
    Dim strEfter As String
   
    Dim intStartPos As Integer
    Dim intLength As Integer
   
    \' Her kan du tilføje de koder der skal bruges.
    strCharCodes() = Array(\"01\", \"02\", \"03\")
    \' Her kan du angive hvad hver enkelt kode skal erstattes med.
    strCCText() = Array(\"Test1\", \"Test2\", \"Test3\")
    s
    \' Husk hvor courseren er inden vi starter.
    intStartPos = objTextBox.SelStart
    intLength = objTextBox.SelLength
   
    For intCharCodeCounter = LBound(strCharCodes) To UBound(strCharCodes)
        \' Denne del skal løbes igennem én gang for hver kode der skal ændres.
        intPosition = InStr(1, objTextBox.Text, strCharCodes(intCharCodeCounter)) \' Find næste kode
        While intPosition > 0 \' Så længe der bliver fundet flere koder.
            \' Koden udskiftes med den rette tekst
            strFoer = Left(objTextBox.Text, intPosition - 1)
            strEfter = Mid(objTextBox.Text, intPosition + Len(strCharCodes(intCharCodeCounter)))
            objTextBox.Text = strFoer & strCCText(intCharCodeCounter) & strEfter
            \' Der skal tages højde for at coursorens position forskydes hvis koden ikke har samme længde som den tekst der bliver indsat i stedet for koden.
            intStartPos = intStartPos + Len(strCCText(intCharCodeCounter)) - Len(strCharCodes(intCharCodeCounter))
            \' Find næste kode
            intPosition = InStr(1, objTextBox.Text, strCharCodes(intCharCodeCounter))
        Wend
    Next intCharCodeCounter
   
    \' Sæt courseren der hvor den var da vi startede.
    objTextBox.SelStart = intStartPos
    objTextBox.SelLength = intLength
End Sub
Avatar billede winkill Nybegynder
23. september 2000 - 13:47 #18
Ups, beskrivelsen kommer lige igen her, i en lidt mere overskuelig version.

Der er tre ting der skal rettes for at det vil komme til at virke.

1) Der hvor der står \"Set objTextBox = Text1\" skal du rette \"Text1\"
  til navnet på din textbox sådan at programmet ved hvilken textbox
  det drejer sig om - det gælder også for selve procedure/event navnet.

2) Du skal tilføje dine egne koder der hvor der står
  \"strCharCodes() = Array(\"01\", \"02\", \"03\")\" du kunne eks. skrive
  \"strCharCodes() = Array(\"kodeA\", \"kodeB\", \"kodeC\")\"

3) Du skal angive hvad hver enkelt kode skal udskiftes med der hvor
  der står \"strCCText() = Array(\"Test1\", \"Test2\", \"Test3\")\" Du kunne
  eksempelvis skrive \"strCCText() = Array(\"Jensen\", \"Hansen\", \"Mortensen\")\"
Avatar billede Claus Mester
25. september 2000 - 16:10 #19
MANGE TAK winkill !!!!!!!!

Det var en ordentlig mundfuld.

Men jeg må desværre observere, at koden ikke virker helt endnu. Når jeg kører programmet eller fejlfinding, standser den op ved \"strcharcodes\" og \"strcctext\" med meddelelsen: Kan ikke tildele til matrix ?????

Hvad gør jeg forkert?
Avatar billede winkill Nybegynder
25. september 2000 - 16:51 #20
Jeg går ud fra at det er disse linier du hentyder til:

\' Her kan du tilføje de koder der skal bruges.
strCharCodes() = Array(\"01\", \"02\", \"03\")
\' Her kan du angive hvad hver enkelt kode skal erstattes med.
strCCText() = Array(\"Test1\", \"Test2\", \"Test3\")

I så fald skulle dette kunne rette det.

Private Sub Text1_Change()
    Dim objTextBox As TextBox
   
    \' VIGTIGT!! Hvis du ikke bruger Text1 som textbox skal du rette nedenstående.
    \' Eks. Hvis din textbox hedder \"txtRedigeringsfelt\" skal nedenstående linie rettes til:
    \' Set objTextBox = txtRedigeringsfelt
    Set objTextBox = Text1
   
    If Len(objTextBox.Text) = 0 Then Exit Sub \' Hvis der ikke står noget i objTextBox så smutter vi bare videre ;o)
   
    \' Gør et par variabler klar til brug.
   
    Dim strCharCodes
    Dim strCCText
    Dim intCharCodeCounter As Integer
   
    Dim intPosition As Integer
    Dim strFoer As String
    Dim strEfter As String
   
    Dim intStartPos As Integer
    Dim intLength As Integer
   
    \' Her kan du tilføje de koder der skal bruges.
    strCharCodes = Array(\"01\", \"02\", \"03\")
    \' Her kan du angive hvad hver enkelt kode skal erstattes med.
    strCCText = Array(\"Test1\", \"Test2\", \"Test3\")
   
    \' Husk hvor courseren er inden vi starter.
    intStartPos = objTextBox.SelStart
    intLength = objTextBox.SelLength
   
    For intCharCodeCounter = LBound(strCharCodes) To UBound(strCharCodes)
        \' Denne del skal løbes igennem én gang for hver kode der skal ændres.
        intPosition = InStr(1, objTextBox.Text, strCharCodes(intCharCodeCounter)) \' Find næste kode
        While intPosition > 0 \' Så længe der bliver fundet flere koder.
            \' Koden udskiftes med den rette tekst
            strFoer = Left(objTextBox.Text, intPosition - 1)
            strEfter = Mid(objTextBox.Text, intPosition + Len(strCharCodes(intCharCodeCounter)))
            objTextBox.Text = strFoer & strCCText(intCharCodeCounter) & strEfter
            \' Der skal tages højde for at coursorens position forskydes hvis koden ikke har samme længde som den tekst der bliver indsat i stedet for koden.
            intStartPos = intStartPos + Len(strCCText(intCharCodeCounter)) - Len(strCharCodes(intCharCodeCounter))
            \' Find næste kode
            intPosition = InStr(1, objTextBox.Text, strCharCodes(intCharCodeCounter))
        Wend
    Next intCharCodeCounter
   
    \' Sæt courseren der hvor den var da vi startede.
    objTextBox.SelStart = intStartPos
    objTextBox.SelLength = intLength
End Sub

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
Kurser inden for grundlæggende programmering

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

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel