eli miten teen koodia että se tarkistaa kun olen painanut command1:stä niin se katsoo onko text1:sessä sanaa päivi. Jos on niin tulee msgbox joka sanoo hei päivi?
if text1.text = "päivi" then msgbox "hei päivi"
ei tuota! se on se ainoastaan jos siinä lukee päivi ja ei muuta!
Private Sub Command1_Click()
For a = 1 To Len(Text1.Text)
For b = 1 To Len(Text1.Text)
If Mid$(Text1.Text, a, b) = "päivi" Then Joo = 1
Next b
Next a
If Joo = 1 Then MsgBox ("Hei päivi")
End SubTuo koodi pilkkoo kirjoitetun tekstin kaikkiin mahdollisiin pätkiin ja tarkistaa ne. Jos yksikin niistä on "päivi", silloin asetetaan joo-muuttujan arvo todeksi. Kun tarkistus on tehty, katsotaan, mikä on joon tilanne. Jos se on tosi, näytetään teksti.
Miksi se piti tehdä joon kanssa? No, muuten se message olisi voinut näkyä useamman kerran.
Private Sub Command1_Click()
If InStr(Text1.Text, "päivi") Then MsgBox "hei päivi"
End SubAi, VB:ssä on siis jo valmiiksi funktio tuota varten.
en usko että on edes mahdollista, mutta onko mahdollista laittaa että kirjoitan "hei ja joku nimi" ja kun painan command1:stä niin text2:seen tulee pelkästään hein jälkeen tuleva nimi?
lainaus:
en usko että on edes mahdollista
Ohjelmoimalla kaikki on mahdollista.
lainaus:
Ohjelmoimalla kaikki on mahdollista.
Ei nyt ihan niinkään.
Mutta tuo mitä Jasmin kysyi on mahdollista (jos nyt ymmärsin sen oikein).
lainaus:
lainaus:
Ohjelmoimalla kaikki on mahdollista.
Ei nyt ihan niinkään.
Kylläpäs :P
niin, mutta miten?
Toki moinen on mahdollista. Esim. voit tarkistaa Left-funktiolla neljä ensimmäistä merkkiä, ja jos ne ovat "moi" ja välilyönti, näyttää teksti Mid-funktiolla viidennestä merkistä lähtien. Tässä esimerkki:
If Left(Text1.Text, 4) = "moi " Then
MsgBox Mid(Text1.Text, 5)
End Ifkiitos antti, mutta nyt ongelmana on se että se kirjoittaa kaiken 5 välistä asti alaspäin. Haluaisin sen siltä riviltä kaiken missä lukee moi päivi
nyt tällä alkaa olla jo kiire
Private Sub Command1_Click() Do For a = 1 To Len(Text1.Text) For b = 1 To Len(Text1.Text) If Mid$(Text1.Text, a, b) = "hei" Then Exit Do Next b Next a Loop Until 1 = 1 Text2.Text = Mid$(Text1.Text, a + b + 1, 10) End Sub
Ellei VB:ssä ole jo tätäkin varten omaa funktiota, joudut sittenkin käyttämään minun koodinpätkääni. Älä ihmettele tuota UNTIL 1 = 1, se on sitä varten, että pystytään poistumaan kahden silmukan sisältä heti kerralla. Lieneeköhän tähänkin joku parempi keino?
Jos ymmärsin oikein mitä tarkoitit, niin tämä koodi lukee text1:sen tekstin, etsii siitä sanan "hei", ja kirjoittaa text2:seen kaiken mitä "hein" jälkeen tulee. (kymmeneen merkkiin asti) sen 10 voi vaihtaa koodia muokkaamaalla.
Edit:
Ja tottahan toki tällainen on mahdollista. Ohjelmoinnissa on periaatteessa mahdollista kaikki, minkä tietokone pystyy suorittamaan. Tällainen koodi on ihan "mahdollisimmasta" päästä. Niin että paljon mahdottomammaltakin tuntuvia asioita on.
olisiko mitään helpompaa tapaa?
Jos on niin minä en sellaista tiedä. Tuohan toimii niin miten halusit, vai toimiiko? Miksi se ei kelpaa?
tuon
Do For a = 1 To Len(Text1.Text) For b = 1 To Len(Text1.Text) If Mid$(Text1.Text, a, b) = "hei" Then Exit Do Next b Next a Loop
voi toki tehdä helpommpinkin:
Do
For a = 1 To Len(Text1.Text)
If Mid$(Text1.Text, a, len("hei")) = "hei" Then Exit Do
Next a
Loopei vaihdat "hei" tekstin tilalle vaikka jonkun muuttujan.
Unohdit ottaa yhden asian huomioon sooda. Jos tekstistä ei löydy sanaa "hei", ohjelma jää loputtomaan luuppiin, josta ei koskaan pääse pois. :) UNTIL 1 = 1 varmistaa että luuppi loppuu silloinkin, jos "hei":tä ei löydy.
Edit: Toisaalta voisihan sen pistää myös
UNTIL -1
ei minä sekoilin taas! kiitos kiitos
aijjoo... mutta siis tota do-jutskuahan ei tarvitse tossa oikeastaan mihinkään...
eli:
For a = 1 To Len(Text1.Text)
If Mid(Text1.Text, a, len("hei")) = "hei" Then Exit for
Next aNo mutta sitten
Text2.Text = Mid$(Text1.Text, a + b + 1, 10)
Tarvitsee sekä muuttujat a ja b. b on kohta missä etsittävä sana loppuu. Olis ton kai voinu tehdä kahdella erillisellä luupilla ja jos etsittävä sana on aina "hei" pituus on vakiona aina 3... joo meneepäs monimutkaiseksi. :)
Seuraava hakee tietyn sanan jälkeisen sanan (joka kenties on nimi). Oletan, että kirjoittaja käyttää kuitenkin välejä :P
Dim TerSana As String
Dim Nimi As String
TerSana = "hei" 'Sana, jonka jälkeinen sana on siis nimi
Nimi = ""
a = InStr(Text1.Text, TerSana) 'Mistä alkaa
For b = a + Len(TerSana) + 1 To Len(Text1.Text) 'haetaan seuraavan sanan loppua
If Mid(Text1.Text, b, 1) = " " Then 'Seuraavan sanan loppu
Nimi = Mid(Text1.Text, a, (b - a))
Exit For
End If
Next bJa nyt on nimi selvillä :)
MsgBox "No terve, " & Nimi & "!"
Mutta jäin vaan yhä miettimään mitä se "helpoin" tapa tarkoitti. Ei kai siinä ollut kysymys koodin pituudesta...? Ei VB:ssä nyt sentään kaikkeen omia funktioita ole. Niitä voi kaikeksi onneksi tehdä itse. :)
lainaus:
Mutta jäin vaan yhä miettimään mitä se "helpoin" tapa tarkoitti. Ei kai siinä ollut kysymys koodin pituudesta...? Ei VB:ssä nyt sentään kaikkeen omia funktioita ole. Niitä voi kaikeksi onneksi tehdä itse. :)
yhdelle riville tarkoitettua siis
No kokeile muuntaa tuo koodi funktioksi, jota sitten voi kutsua yhdellä ainoalla käskyllä. Sitä funktiota itseään ei kyllä saa pienempään tilaan.
mikä olisi nopein tapa ladata ja soittaa wav tiedosto?
Inline ASM, mutta sitä en sinulle suosittele...
Muista, että o-putkassa on haku!
Tästä on ollut ennenkin keskustelua:
Tämä on lähinnä ongelmaasi: https://www.ohjelmointiputka.net/keskustelu/3882-kysymys-taas-vb
Ja sitten muita samaa aihetta:
https://www.ohjelmointiputka.net/keskustelu/3138-wav-tiedostot-vb-ssä
https://www.ohjelmointiputka.net/keskustelu/441-ääni-vb
Jopa vinkki!
https://www.ohjelmointiputka.net/koodivinkit/
Käytä Windowsin API -funktiota sndPlaysound()
eli:
Option Excplicit:n alle
Public Declare Function sndPlaySound& Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long)
Ja sitten jonnekkin sopivaan aliohjelmaan:
Dim wFlags%, X%
wFlags% = SND_ASYNC Or SND_NODEFAULT
X% = sndPlaySound("C:\Soundi.wav", wFlags%)En tätä oo testannu mitenkään, mutta pitäis toimia
Vielä tuohon "<tekstiä> Hei Nimi <tekstiä>"-ongelmaan jonka josta pitäisi löytää nimi. Kyllä se ilman looppiakin onnistuu (sama idea kuitenkin), mutta ei yhdelle riville mahdu luultavasti pakollisen If-lauseen takia.
Dim Nimi_alku, SeuraavaVali As String
Const HeiSana As String = "Hei"
Nimi_alku = InStr(Text1.Text, HeiSana) + Len(HeiSana) + 1
SeuraavaVali = InStr(Nimi_alku, Text1.Text, " ")
If SeuraavaVali = 0 Then
MsgBox HeiSana & " " & Mid(Text1.Text, Nimi_alku) & "!"
Else
MsgBox HeiSana & " " & Mid(Text1.Text, Nimi_alku, SeuraavaVali - Nimi_alku) & "!"
End IfSplittauksella saattaisi onnistua yhdellä rivillä, mutta se ei olisi tehokasta koodin toiston takia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.