Seite 1 von 1
Problem mit Prozedur und For To
Verfasst: 04.11.2004 10:14
von Graffiti
Wie kann ich einen Prozedurnamen mit einer Variablen verknüpfen,
so das ich beim Combogadget jeder aktiven Zeile eine seperate
Prozedur zuordnen kann
der Code unten funktioniert leider nicht
Code: Alles auswählen
For i = 1 To 10
ix = GetGadgetState(#Gadget_1 +i-1)
If ix > 0
Buttonxx_1() + ix -1 ; hier liegt mein Problem eine Prozedur zuzuweisen
EndIf
Next
gruß Graffiti
Verfasst: 04.11.2004 12:57
von Falko
Geht, glaube ich, währender der Laufzeit nicht. Vielleicht erzeugst du eine
externe Datei bzw. eine DLL , die du nachher wieder einfügst oder ausführst.
Beispielsweise könnte das in etwa so aussehen:
Code: Alles auswählen
Anzahl=5
CreateFile(0,"MyProcedure.pb")
For i= 0 To Anzahl
WriteString("Procedure Test_"+Str(i)+"(a)"+Chr(10))
WriteString("a=a+1"+Chr(10))
WriteString("Debug a"+Chr(10))
WriteString("EndProcedure"+Chr(10))
Next i
For i= 0 To Anzahl
WriteString("Test_"+Str(i)+"("+Str(10+i)+")"+Chr(10))
Next i
CloseFile(0)
RunProgram("pbcompiler","MyProcedure.pb /debugger","",1)
Verfasst: 04.11.2004 13:01
von Graffiti
Hallo Falco,
ich glaube dann ist es einfacher 120 mal
if ix = 1 : Buttonxx_1() : EndIf
........
if ix = 120 : Buttonxx_120() : EndIf
oder nicht
Verfasst: 04.11.2004 13:08
von bluejoke
Nein, in so einem Fall, glaube ich, sollte man auf jeden Fall Select verwenden.
also:
Code: Alles auswählen
Select ix
Case 1
Buttonxx_1()
Case 2
Buttonxx_2()
...
EndSelect
Verfasst: 04.11.2004 13:21
von Falko
Wenn du die 120 Zeilen oder mehr schreiben willst, wohl kaum.

Dann währe dieses vielleicht doch schneller, oder??
Leider kann man das im Programm nicht nachträglich mit
include einfügen. Geht leider nicht, da die Datei "MyProcedure.pb"
vorher vorhanden sein muß.
Code: Alles auswählen
Anzahl=120; variabel
CreateFile(0,"MyProcedure.pb")
For i= 0 To Anzahl
WriteString("Procedure Buttonxx_"+Str(i)+"(a)"+Chr(10))
WriteString("a=a+1"+Chr(10))
WriteString("Debug a"+Chr(10))
WriteString("EndProcedure"+Chr(10))
Next i
For i= 0 To Anzahl
string$="if ix="+Str(i)
string$=string$+":Buttonxx_"+Str(i)+"("+Str(10+i)+")"
string$=string$+":Endif"+Chr(10)
WriteString(string$)
Next i
CloseFile(0)
RunProgram("MyProcedure.pb","","",1)
;RunProgram("pbcompiler","MyProcedure.pb /debugger","",1)
Verfasst: 04.11.2004 13:37
von helpy
Ein weiteres Beispiel:
Code: Alles auswählen
Procedure Test_001(val)
MessageRequester("","Test_001" + #CRLF$ + Str(val))
EndProcedure
Procedure Test_002(val)
MessageRequester("","Test_002" + #CRLF$ + Str(val))
EndProcedure
Procedure Test_003(val)
MessageRequester("","Test_003" + #CRLF$ + Str(val))
EndProcedure
Procedure Test_004(val)
MessageRequester("","Test_004" + #CRLF$ + Str(val))
EndProcedure
Dim FunctionList(3)
FunctionList(0) = @Test_001()
FunctionList(1) = @Test_002()
FunctionList(2) = @Test_003()
FunctionList(3) = @Test_004()
For i = 1 To 4
Debug i
CallCFunctionFast(FunctionList(i-1),i*10)
Next
@Graffiti:
Aber eine frage habe ich schon noch:
Unterscheiden sich die Prozeduren denn so voneinander, dass es nicht möglich ist für alle Zeilen des Combo-Gadgets eine Prozedur zu verwenden, die als Argument dann die ausgewählte Zeile erhalten?
cu, helpy
Verfasst: 04.11.2004 13:38
von bobobo
bluejoke hat geschrieben:Nein, in so einem Fall, glaube ich, sollte man auf jeden Fall Select verwenden.
also:
Code: Alles auswählen
Select ix
Case 1
Buttonxx_1()
Case 2
Buttonxx_2()
...
EndSelect
aber nur wegen der Übersichtlichkeit
zumindest ein ASM-Output per PB zeigt dass if : endif Entscheidungen weniger Befehle benötigen als Select case endselect Entscheidungen und damit womöglich etwas schneller sind.
ist mir aber eigentlich auch egal
Verfasst: 04.11.2004 13:39
von Danilo
Graffiti hat geschrieben:ich glaube dann ist es einfacher 120 mal
if ix = 1 : Buttonxx_1() : EndIf
........
if ix = 120 : Buttonxx_120() : EndIf
Oder Du nimmst ein Array dazu.
Code: Alles auswählen
Dim Buttonxx.l(120)
Buttonxx(1) = @Buttonxx_1()
...
Buttonxx(120) = @Buttonxx_120()
Aufruf von Procedure-Nr i:
CallFunctionFast( Buttonxx(nr) )
Viel schneller als If..EndIf oder Select..Case, aber trotzdem
platformunabhängig.
Verfasst: 04.11.2004 14:06
von Graffiti
Danke erstmal für die verschiedenen Möglichkeiten, jetzt habe ich
wieder was zu testen und tüfteln
aber warum geht das prinzipiell nicht so wie bei den Gadgets
einfach ein + i - 1 dranhängen und gut ists.
schätze das könnten mehrere mal gebrauchen.
@Danilo
wäre doch noch ne Idee für deine PureTools oder nicht
gruß Graffiti
Verfasst: 05.11.2004 07:41
von Danilo
Graffiti hat geschrieben:@Danilo
wäre doch noch ne Idee für deine PureTools oder nicht
Nein.