Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: *VB6* Replace & SendKeys

Nobo [12.01.2006 16:32:48]

#

Teen ohjelmaa, missä F1:stä painamalla ohjelma kirjoittaa SendKeysillä tekstiboksin sisällön.
Nyt jos tekstiboksi sisältää tiettyjä merkkejä, esim ^ tai }, niin tulee "Invalid procedure call of argument"-virhe.
No aikaisemmin Merri antoi koodin, joka muuttaa niiden toimimattomien merkkien eteen { ja taakse } merkin jolloin ne toimivat.

Eli mitenköhän saisin sen koodin niin, ettei se lisää { ja } -merkkiä silloin, kun siinä tekstiboksissa on {enter} tai vastaava näppäinkoodi.
Eli esimerkiksi, jos tekstiboksissa on kirjoitettuna "Nobo on noob ^^ {enter}" eli tuon {enter}n kohdalla ei tule { ja } merkkejä siihen, mutta ^ merkeissä tulee.

Ja tässä se koodi:

                Private Function Replace2(teksti As String) As String
    Dim barTemp() As Byte, barOutput() As Byte
    Dim intA As Integer, intB As Integer
    ' muutetaan testistring byte arrayksi
    If LenB(teksti) = 0 Then Exit Function
    barTemp = teksti
    ' varataan tarpeeksi tilaa lopputulokselle eli koska jokainen merkki
    ' voi pituudeltaan kolminkertaistua, eikä me tiedetä sisältöä
    ' etukäteen, varataan lopputulokselle kolminkertainen määrä tilaa
    ReDim barOutput(UBound(barTemp) * 3 + 2)
    ' stringien sisältö on kaksi tavua per merkki: siksi step 2
    For intA = 0 To UBound(barTemp) Step 2
        ' muutetaan yksi tavu string-merkiksi koodaamisen helpottamiseksi
        ' nopeampaa olisi vain käsitellä lukuina, mutta en jaksa luntata koodeja
        ' selkeämpää näin :)
        Select Case ChrW$(barTemp(intA))
            Case "[", "]", "%", "+", "(", ")", "^", "~", "{", "}"
                ' muuta sitten AscW luvuksi, minä en jaksa lunttia
                barOutput(intB) = CByte(AscW("{"))
                barOutput(intB + 2) = barTemp(intA)
                barOutput(intB + 4) = CByte(AscW("}"))
                ' siirry kolme merkkiä eteenpäin lopputuloksessa
                intB = intB + 6
            Case Else
                ' kopioi haluttu tavu
                barOutput(intB) = barTemp(intA)
                ' siirry merkki eteenpäin lopputuloksessa
                intB = intB + 2
        End Select
    Next intA
    ' sitten siistitiään lopputuloksen koko (eli tiputetaan käyttämätön data pois)
    ReDim Preserve barOutput(intB - 1)
    ' ja mallin vuoksi: ulosta
    Replace2 = CStr(barOutput)
End Function

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta