har denna kod i formload: Prova Jag är ganska säker på att det beror på att CallByName förväntar sig ett objekt (en instans av en klass eller ett formulär eller en kontroll) och inte en modul. Module1 är ju inte en instans av ett objekt utan en "referens" till en kodfil i princip. I t ex C# så motsvaras det av statiska metoder i en klass, där man inte behöver skapa en instans av klassen för att anropa metoderna. En annan idé (vet ej om den fungerar): testa med "modulens_namn.script" & cstr(i) istället... Jag är väldigt ny på detta med vb, så du får ursäkta men vad menar du med detta? Och hur gör jag det? Har aldrig använt mej av en klass... Frågan är om du inte angriper problemet på fel sätt; en omstrukturering kan vara mycket enklare. "Enda egentliga skälet jag skulle kunna se är om du måste göra 30 stycken helt skilda grejer och måste välja rätt utifrån en siffra man skriver in." Callbyname var en nyhet för mig. Det är exakt så jag har gjort nu men jag vill ha en enklare lösning... "Enda egentliga skälet jag skulle kunna se är om du måste göra 30 stycken helt skilda grejer och måste välja rätt utifrån en siffra man skriver in.Problem med Callbyname
i = 1
CallByName module1, "script" & i, VbMethod
har denna kod i module1:
Public Function script1()
MsgBox "script1"
End Function
Varför funkar inte Callbyname module1? Det funkar ju när jag lägger funktionen script1 i form1 och skriver:
CallByName form1
Jag vill helst ha mina funktioner i olika moduler för att få mer ordning på dem, eftersom de är ca 30 stycken...Sv: Problem med Callbyname
<code>
CallByName module1, CStr("script" & i), VbMethod
</code>
/MickeSv: Problem med Callbyname
Testa att lägga metoderna i en klass och skapa en instans av klassen och anropa metoderna på denna :
<code>
Dim mFunc As cFunctions
Set mFunc=new cFunctions
i = 1
CallByName mFunc, "script" & i, VbMethod
</code>Sv: Problem med Callbyname
Sv: Problem med Callbyname
"Testa att lägga metoderna i en klass och skapa en instans av klassen och anropa metoderna på denna:"
Tacksam för svar!
//MartinSv: Problem med Callbyname
Vad gör dina funktioner, och varför behöver du anropa dem med CallByName?
Enda egentliga skälet jag skulle kunna se är om du måste göra 30 stycken helt skilda grejer och måste välja rätt utifrån en siffra man skriver in.
Eller eventuellt om du måste loopa igenom dem, men då känns det ändå som att det borde finnas nåt bra mycket enklare sätt.Sv: Problem med Callbyname
Det är precis det jag ska göra. Fast 35 olika saker för att vara exakt. :)Sv: Problem med Callbyname
Jag skulle ha löst det så här (när jag inte visste att callbyname fanns ;) )
Private Sub Form_Load()
Dim i#
i = 2
Call test(i)
End Sub
Private Function test(i As Long)
Select Case i
Case 1
'Starta function1
Case 2
'Starta function2
Case 3
'osv
'många case blir det :)
End Select
End FunctionSv: Problem med Callbyname
Därför skulle jag gärna få följande fråga besvarad: Hur funkar klasser och hur gör man detta:
"Testa att lägga metoderna i en klass och skapa en instans av klassen och anropa metoderna"Sv: Problem med Callbyname
Eller eventuellt om du måste loopa igenom dem, men då känns det ändå som att det borde finnas nåt bra mycket enklare sätt."
Det är inte ofta jag använder CallByName men ett exempel är t ex administrationsprogram som ska uppdatera en databas när man släpper nya versioner. Då skapar jag script som heter t ex 1.sql (skapar hela databasen för version1), 2.sql (uppdaterar från version 1 till version 2), 3.sql (uppdaterar till version 3 och så vidare).
Därefter kör jag en loop :
<code>
For i=currentVersion To LatestVersion
RunScript(i)
CallByName "Update" & i ' pseudo, ej korrekt syntax
Next i
</code>
RunScript(i) kör ett script [i].sql och metoderna Update[i] gör sådant databasunderhåll som är bökigt att fixa med SQL-script och som man hellre gör med kod.
Ett annat exempel är när man skapar väldigt dynamiska kundanpassningar. Då brukar jag lägga ProgID:t samt ev metodnamn i en ini-fil. När man sedan ska göra en kundanpassning så skapar man en ny dll till kunden och skickar ut en ny ini-fil och kör :
Exempel på Ini-fil :
----------
[OriginalFunction]
ProgID=Internal.cConnect
MethodName=Tjoho
[CustomerFunction]
ProgID=Customer.cConnect
MethodName=Tjoho
-------
<code>
Dim mObject As Object
Set mObject=CreateObject(ProgIDFromIniFile)
CallByName mObject,MethodNameFromIniFile,vbMethod
</code>