Du bliver nød til at teste dig ud af det, select eller if. for t=0 to ubound(arrStof)-1 x=arrstof(t) if x='a' then a_click() if x='s' then s_click() if x='sa' then sa_click() ...osv next
Yep - "nop" har ret. Du kan ikke kalde en procedure ved at angive dens navn som sammensat af forskellige strings. Så du må i gang med en Select Case eller en masse If'er...
Nu er det ikke sådan, at man bare kunne overføre en værdi til din sub? Der er jo ingen grund til at køre næsten den samme sub, hvis den eneste forskel er navnet. Så kan du jo ligeså godt gøre noget lignende det her:
Private Sub a(streng) MsgBox streng End Sub
Private Sub Command3_Click() Call a("A") Call a("Sa") End Sub
Er det så ikke omvendt at du kommer ind i fx sa_click via en knap (navnet siger vel det) og at du i knappen gerne ville have noget generel kode for ikke at skulle kode x næsten-ens knap-events. Så kan du jo gøre lidt som martin_moth hvor du kalder en sub med et parameter med molarmassen (hvad er det?)
sub molarMasse(mm as real) ..res=20 dialog('Massen er: '+fmt('###.###,#######',res)) 'bare ex. linjer end sub
Molarmassen er den mængde stof du skal have (i gram) for at have 6.02*10*26 molekyler...
Det har jeg gjort... :
Function Add(tal As Double) Xsum.Text = Xsum.Text + tal End Function
Private Sub Al_Click() temp = Add(26.981538) End Sub
Private Sub XBeregn_Click() Dim MyString As String Dim MyStringArray() As String Dim I As Integer Dim j As Integer Dim CharCode As Byte Dim ArraySize As Byte
MyString = test.Text If Len(MyString) > 1 Then j = 1 For I = 1 To Len(MyString) CharCode = Asc(Mid(MyString, I, 1)) If CharCode > 64 And CharCode < 91 Then ArraySize = ArraySize + 1 ReDim Preserve MyStringArray(ArraySize) MyStringArray(ArraySize - 1) = Mid(MyString, j, I - j) j = I End If Next I End If
If j < Len(MyString) Then ArraySize = ArraySize + 1 ReDim Preserve MyStringArray(ArraySize) MyStringArray(ArraySize - 1) = Mid(MyString, j, Len(MyString) - j + 1) End If
For t = 0 To UBound(MyStringArray) x = MyStringArray(t) test.Text = test.Text & "|" & x If x = "H" Then Call H_Click If x = "He" Then Call He_Click If x = "Li" Then Call Li_Click If x = "Be" Then Call Be_Click If x = "B" Then Call B_Click If x = "C" Then Call C_Click If x = "N" Then Call N_Click If x = "O" Then Call O_Click If x = "F" Then Call F_Click
Wuups - en lille fejl i første funktion - du skal bruge Val-funktionen, ellers lægger du en værdi til en string
Function Add(tal As Double) Xsum.Text = val(Xsum.Text) + tal End Function
Det der undrer os er vist, at om fx. "Be_click" er click-hændelsen for en kontrol (fx. en knap) ved navn "Be", eller om det er en selvdefineret Sub... Er det sidstnævnte, er det lidt (meget!) forvirrende at du kalder den _Click...
Men ovenstående kode virker jo som du ønsker, det kan sikkert bare gøres meget nemmere ved blot at kalde den SAMME Sub med x som parameter ( x= "H", "He, ...), i stedet for at definerer 9 FORSKELLIGE Subs. Men denne forenkling gælder kun, hvis de 9 forskellige subs du har udfører nogenlunde det samme - er du med?
tiger>>> Dit spørgsmål er rigtig godt fordi at det betyder at du gør noget som alt for få gør - nemlig bruger dynamisk tilpasset kode.
Det kan i mange situationer gøre programmer langt nemmere at udvide og vedligeholde. Desværre understøtter Visual Basic (og VBA) ikke den slags. Den foreslåede løsning med Case er den eneste vej igennem, men den er også klodset, og kan være anledning til nogle pi...irriterende fejl.
Jeg foreslår at du tager et kig på Perl - der kan du lave det, som du spurgte efter.
lååårvly er "lydskrift" for lovely - fordi jeg synes at VB.NET er helt fantastisk lækkert :o)
Synes godt om
Ny brugerNybegynder
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.