Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 15:16 Der er 26 kommentarer og
1 løsning

Køre Sub'er fra array

Jeg har et array med fx:
A
S
Sa
As

Hvordan kører jeg så Sub'erne "A_Click()","S_Click()" osv.?

Array'et ændrer sig hele tiden...
Avatar billede mikker Nybegynder
04. marts 2003 - 15:23 #1
DEN må du lige forklare nærmere...
Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 15:26 #2
jeg skal køre Sub'er dynamisk.
Dvs. at jeg vil køre alle sub'er der hedder "X_Click()" hvor X er værdier fra mit array...

Håber du forstår...
Avatar billede mikker Nybegynder
04. marts 2003 - 15:26 #3
Call a_click
Call b_click

- Mikker
Avatar billede mikker Nybegynder
04. marts 2003 - 15:27 #4
Gælder naturligvis kun hvis du har foruddefineret dine subs...

- Mikker
Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 15:29 #5
ja... men de skal hentes fra et array...
jeg forsøgte med:
For t = 0 To UBound(arrStof) - 1
    Call arrStof(t) & "_click()"
Next t
Avatar billede nop Nybegynder
04. marts 2003 - 15:35 #6
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
Avatar billede martin_moth Mester
04. marts 2003 - 15:44 #7
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...
Avatar billede mikker Nybegynder
04. marts 2003 - 15:44 #8
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

- Mikker
Avatar billede martin_moth Mester
04. marts 2003 - 15:45 #9
PS. Og HVIS du kunne, skulle du i øvrigt ikke have paranteserne med i dit kald
_click og ikke _click() ;o)
Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 15:47 #10
Det er til "kemikerens lommeregner" der kan udregne molarmassen for alle stoffer...
Avatar billede mikker Nybegynder
04. marts 2003 - 15:54 #11
Jamen held og lykke. Jeg gad nok se koden til den lille sag når den er færdig :O)

- Mikker
Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 15:55 #12
kom med en email (gerne MSN) så sender jeg den når den er færdig...
Avatar billede nop Nybegynder
04. marts 2003 - 15:58 #13
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

sub a_click()
  molarMasse(.03245)
end sub

sub sa_click()
  molarMasse(0.6667)
end sub

..osv
Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 16:02 #14
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

    Next t
End Sub
Avatar billede martin_moth Mester
04. marts 2003 - 16:11 #15
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?
Avatar billede martin_moth Mester
04. marts 2003 - 16:12 #16
PPs. For at være helt korrekt:

Xsum.Text = Str(val(Xsum.Text) + tal)

:o)
Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 16:14 #17
aaahhhh... god idé...

og tak for tippet med val() (det har jeg aldrig brugt) :-(
Avatar billede martin_moth Mester
04. marts 2003 - 16:16 #18
PS: Bare for at få stillet min nysgerrighed - er fx. Be_Click clickhændelsen for en kontrol ved navn Be, eller er det en Sub du selv har defineret?
Avatar billede tiger_webdesign Nybegynder
04. marts 2003 - 16:34 #19
det er klikhændelsen, og en funktion jeg bruger når den "selv" analysere en formel...
Avatar billede martin_moth Mester
04. marts 2003 - 16:38 #20
Altså har du også kontroller der hedder H, He osv. Trykknapper, formoder jeg :o)
Avatar billede _darkstar_ Nybegynder
04. marts 2003 - 16:47 #21
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.

...bare en lille kommentar.
Avatar billede martin_moth Mester
04. marts 2003 - 17:01 #22
darkstar: Men der er nu mange fordele ved VB(A), især hvis man er lidt "grøn" som tiger er :o)
Avatar billede mikker Nybegynder
04. marts 2003 - 17:48 #23
Og hvad er det der sker for mange af de andre 'sprog' ?
Hvad skal det gøre godt for med == og ++ osv osv

Nej jeg ved godt at jeg nok bare ikke ejer den rette intelligens til at kunne forstå det :O)
Men IMHO er VB mere logisk opbygget..

SES DÉR !

- Mikker
Avatar billede martin_moth Mester
04. marts 2003 - 18:59 #24
Men VB6 er ikke ægte objektorienteret - ta den og ta den :o)
Det er VB.NET dog, og det er lååårvly :o)

Nå - er vi kommet af sporet her eller..?
Avatar billede martin_moth Mester
04. marts 2003 - 19:09 #25
PS: i VB.NET kan man også skrive += - og det er jo egentligt smart nok ;o)

Nå - skal vi SÅ stoppe (sorry - ved godt, at det er mig selv der bliver ved) og høre om tiger_webdesign egentligt har fået svar nok?
Avatar billede tiger_webdesign Nybegynder
05. marts 2003 - 06:58 #26
martin_moth -->> hvad mener du med at "VB.net er lååårvly"???


Tak for hjælpen...
Avatar billede martin_moth Mester
05. marts 2003 - 09:49 #27
lååårvly er "lydskrift" for lovely - fordi jeg synes at VB.NET er helt fantastisk lækkert :o)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester