Eli mulla on tällänen koodi
Public Function GetAllVars() As String Dim X As Long Dim Av() As String Dim ArVar As String Dim Final As String 'muutama muuttuja ArVar = code.VarEnviron.Text 'haetaan muuttujat muuttujat muodossa muuttujannimi=arvo ja entteri Av = Split(ArVar, vbCrLf) 'koko muuttujataulukko splitataan enttereiden välein For X = 0 To UBound(Av) 'x on taulukon indexi 0sta loppuun saakka fPos = InStr(Av(X), "=") ' fpos muuttuja on taulukon x indexin ensimmäinen "=" merkki Final = Final & Mid(Av(X), 1, fPos - 1) & ":" 'lisätään final muuttujaan taulukon x indexin 1 paikasta fpos -1 paikkaan Next X 'seuraavaa GetAllVars = Mid(Final, 1, Len(Final) - 1) 'palautetaan End Function Public Function ReplaceVars(CodeS As String) As String Dim VarsIn As String Dim Vars As String Dim Vatr() As String VarsIn = CodeS Vars = GetAllVars DoEvents Vatr = Split(Vars, ":") For i = 0 To UBound(Vatr) VarsIn = Replace(VarsIn, "$" & Vatr(i), GetVar(Vatr(i))) Next i MsgBox VarsIn ReplaceVars = VarsIn End Function
Mistä johtuu että kun kutsutaan getallvars funktiota niin se ei palaudu enään sieltä vaan koodin suoritus lakkaa siihen replacevars funktiosta?
Noh kerrotaanpa tässä viel sitten että mihin tuota tarvitsen. Olen tuon ratkaissut toisella tavalla, mutta se menee jo aika purkaksi eli haluaisin tämän toimimaan. Olen tekemässä flashin tapaista "Actionscript" kieltä, joka on tämännäköistä
(Käytän C kielen kooditageja)
Generals { Call, Format; //Kutsutaan funktiota nimeltä format //Nytten tulee itse objektien luonti kohta Load, 5; //Ladataan 5 kuva objektia muistiin Create, pena, C:\kuva.bmp; //Luodaan objekti nimeltä pena Var, riit, integer; //riit niminen muuttuja integeriksi Set, riit, 850; //Laitetaan riitin arvo 850 } Format { //Alku koko systeemin alustus funktio Def, $a, 0x0000; //Muistin alotuskohta Def, $b, 5xFFFF; //Muistin lopetuskohta //itse saa määritellä kuinkapaljon ohjelma maksimissaan saa käyttää muistia Format, $a-$b, NULL; //Tyhjennetään objektimuisti sekä muuttujaympäristömuisti jotka ovat jääneet edelliseltä ajokerralta Res, $a, $b; //Voi myös itse tässä laittaa arvot //Nyt on alustettu koko höskä } OnOverflow { //Tämä funktio kutsutaan jos muuttujat tai objektit ylittävät muistille sallitun määrän printf, Muistialueen ylitys; //Printataan konsoliin että on ylitetty Show, msgbox:Ohjelmalle ei ole riittävästi muistia:Tiedoksi:Info; //Annetaan windows msgbox käyttäjälle ylityksestä Quit, 1; //Häivytään ajotilasta } Main { //Itse koodifunkkari Loop (5) // Loopataan 5 kertaa eli kutsutaan alifunktioita Chapter1 - Chapter5 //Käytämme kuitenkin vain yhtä niistä laitettu 5 esimerkin vuoksi Chapter1 ( //Haluamme liikuttaa objektia niin kauan että x If, *pena.posX >=, $riit, If1, If1e; // Jos pena objektin x arvo on riit tai suurempi niin kutsutaan If1 alialifunktiota muussatapauksessa If1e If1 [ Call, OmaFunktio; //Kutsutaan alifunktiota nimeltä OmaFunktio break; //Lopetetaan looppi ] If1e [ Mov, pena, 5, 0; //Liikutetaan penan X akselissa 5 eteenpäin ] ) OmaFunktio ( Var, nimi, string; //Nimi muuttuja printf, Loppu hyvin kaikki hyvin; //Printataan konsoliin tekstiä Get, Input:Anna nimesi:Nimi?, nimi; //Pyydetään käyttäjältä nimeä ja tallennetaan se nimi muuttujaan printf, Terveppä terve $nimi; //Moikataan käyttäjää ) }
Ja muuttujaympäristön haluaisin tuollatavalla toteutettua
InStr:ä käytetään arvoilla mistä lähdetään, merkkijono, mitä etsitään, eli muuta...
fPos = InStr(Av(X), "=") 'muotoon fPos = InStr(1, Av(X), "=") 'voit jättää ykkösen poiskin, mutta pilkku pitää löytyä
"Kauneusvirheenä" korjaisisin myös...
Final = Final & Mid(Av(X), 1, fPos - 1) & ":" 'muotoon If LenB(Final) > 0 Then Final = Final & ":" 'LenB() vastaa = "", mutta on nopeampi suorittaa Final = Final & Mid(Av(X), 1, fPos - 1) 'näin : on aina kahden arvon välissä jakajana
Tuolla korjauksella splitattaessa GetAllVars:n palauttamia arvoja ReplaceVars:ssa, ei splitissä ole yhtä tyhjää arvoa lopussa. Kuten sanoin, kauneusvirhe...
Olen kyllä aina käyttänyt instr tällätavalla
InStr(merkkijono,"haettavamerkki")
Ja hyvin on toiminut
Aihe on jo aika vanha, joten et voi enää vastata siihen.