Seuraavanlaista ongelmaa pähkäilen:
Visual Basic 6:ssa on textboxeja, joihin haluan käyttäjän syöttävän yhden kirjaimen. Jos textboxissa on jo ennestään kirjain, käyttäjän syöttämän kirjaimen tulisi korvata tuo textboxissa aikaisemmin ollut kirjain. Jotta kirjaimia ei pääsisi syöttämään lisää, olen määritelyt MaxLength-ominaisuuden ykköseksi.
Luen näppäimiä tapahtumassa txtKirjaimet_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer).
Eli saan näppäinpainalluksen kiinni ennenkuin kirjain ilmestyy ruutuun. Nyt korvaan, tässä tapahtumassa, ruudussa mahdollisesti aikaisemmin olleen kirjaimen, käyttäjän syöttämällä: txtKirjaimet(1).Text=Chr(KeyCode).
Tapahtuu seuraavaa:
Teksti korvautuu heti, kuten halusinkin.
Mutta sen jälkeen ohjelman suoritus palaa tapahtumasta ja järjestelmä käsittelee näppäimen vasta tässä vaiheessa! Ruudun ensimmäiseksi merkiksi yrittää tulla käyttäjän painama kirjain, mutta se ei sinne mahdu, koska MaxLength=1. Seurauksena on system beep.
Elikä ruutuun jää kyllä ihan oikea merkki, mutta miten saisi vielä estettyä tuon piippauksen?
Kokeile laittaa tuohon KeyUpiin vielä KeyCode = 0. Sen pitäisi eliminoida tuo napinpainallus.
Laita txtKirjaimet-objectin locked arvoksi true.
Siis helpoin homma on laittaa keyDown-tapahtumaan txtkirjaimet(1).Text = "" eikä muuta. MaxLength voi olla 1 mutta ei tarvitse koska ruutuun jää vain yksi merkki.
setä kirjoitti:
Siis helpoin homma on laittaa keyDown-tapahtumaan txtkirjaimet(1).Text = "" eikä muuta. MaxLength voi olla 1 mutta ei tarvitse koska ruutuun jää vain yksi merkki.
Ainoa vain, että tekstilaatikkoon voi tällöin kopioida mitä tahansa roskaa. Käyttämällä locked=true "menetelmää", en havainnut kyseistä ongelma. No mutta tämä on tietenkin vain saivartelua ja "turhaa" hienosäätöä :)
Blaze kirjoitti:
Kokeile laittaa tuohon KeyUpiin vielä KeyCode = 0. Sen pitäisi eliminoida tuo napinpainallus.
Ei ole vaikutusta. Piippaus tulee silti.
Kokeilin tuota jo aikaisemminkin, koska se on neuvottu myös Visual Basic 6.0 Ohjelmoijan käsikirjassa, sivulla 586.
En edes ymmärrä miten se voisi vaikuttaa. Palautuuko KeyCoden arvo sitten jotenkin vielä takaisinpäinkin tapahtumasta?
Piippaus tulee, koska KeyUp tapahtuu vasta sitten kun näppäin on nostettu pohjasta. Joten KeyCoden muuttamisella siinä vaiheessa ei ole mitään merkitystä.
Kun painat näppäimen pohjaan, tapahtuu seuraavaa:
- KeyDown (nappulaa pidetään pohjassa)
- KeyPress (ennen kuin merkki lisätään)
- Change (merkki on lisätty)
- näppäimistötauko, jos tauon jälkeen näppäin on edelleen pohjassa, siirry kohtaan KeyDown
- KeyUp (nappula vapautetaan)
Joten näppäinkoodin muuttaminen täytyy suorittaa joko KeyDownissa tai KeyPressissä, jotta sillä olisi vaikutusta.
setä kirjoitti:
Siis helpoin homma on laittaa keyDown-tapahtumaan txtkirjaimet(1).Text = "" eikä muuta.
Tämä on hyvä idea!
Nyt toimii.
Kiitos!
Gaxx kirjoitti:
Laita txtKirjaimet-objectin locked arvoksi true.
Tästäkin on apua!
Kiitos!
Nyt voin KeyUp:issa tutkia mitä näppäintä on painettu ja muuttaa .Text-ominaisuuteen minkä merkin haluan. Voin päästää läpi vain halutut merkit ja muuttaa niitä miksi haluan. Tämä on hyvä, koska haluan päästää läpi vain isot kirjaimet ja numerot.
Ääkköset vaan näyttää tulevan sellaisilla KeyCodeilla, että niitä ei voi suoraan siirtää .Text-ominaisuuteen. Mutta ne on helppo käsitellä erikseen kun niitä on vain kolme.
Gaxx kirjoitti:
Ainoa vain, että tekstilaatikkoon voi tällöin kopioida mitä tahansa roskaa. Käyttämällä locked=true "menetelmää", en havainnut kyseistä ongelma. No mutta tämä on tietenkin vain saivartelua ja "turhaa" hienosäätöä :)
Merkkihän tulee textboxiin KeyPress-tapahtumalla, jonka Locked=True estää. KeyCodella tulee yhtälailla roskaa. Jos halutaan sallia vain tietyt merkit, ne voidaan suodattaa KeyPress-tapahtumassa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.