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. :mrgreen:
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.