dynamische Parameter im Funktionsaufruf

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

dynamische Parameter im Funktionsaufruf

Post by Holle » 16 Oct 2013, 08:10

Hallo,
ich versuche parameter dynamisch zu erstellen und an einer Funktion weiter zu geben.
Irgendwie klappt das aber nicht.
Wenn ich die Parameter direkt angebe geht alles, aber wenn ich diese in einer Variable zusammenstelle geht´s nicht.
Hier ist ein Beispielscript ( siehe " <--- so klappts (nicht) ")

Code: Select all

Func := Func("Stadt")
test("München","Nürnberg","Ansbach","Lichtenau","Blubb","Blubber","Glucks")
return

test(parameter*) {
   global func
   Loop, % parameter.MaxIndex()
      param%a_index% := parameter[a_index]
   if Func.name
   {
      MsgBox Erst muss Stadt aufgerufen werden...
      Loop, % Func.MinParams
         ;~ params .= ",param" A_Index
         params .= ",""" param%A_Index% """"
      if (Substr(params, 1, 1) = ",")
         StringTrimLeft, params, params, 1
      MsgBox % "...dazu werden folgende Parameter benutzt: " params
      ;~ %func%(param1,param2,param3,param4)   ; <--- so klappts
      %func%(params)  ; <--- so klappts nicht
   }
   MsgBox Dann kommt das "geblubber":`nParam5 = %Param5%`nParam6 = %Param6%`nParam7 = %Param7%
return
}

Stadt(Metropole,Grossstadt,Kleinstadt,Ort) {
   MsgBox Stadt`nMetropole = %Metropole%`nGrossstadt = %Grossstadt%`nKleinstadt = %Kleinstadt%`nOrt = %Ort%
   return
}
Was mache ich falsch?

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: dynamische Parameter im Funktionsaufruf

Post by just me » 16 Oct 2013, 08:49

Stadt(Metropole,Grossstadt,Kleinstadt,Ort) hat vier Pflichtparameter. %func%(params) übergibt aber nur einen Parameter, den String params. Das führt dazu, dass das Funktionsobjekt ohne Fehlermeldung einfach nicht aufgerufen wird.

Code: Select all

func := Func("Stadt")
test("München","Nürnberg","Ansbach","Lichtenau","Blubb","Blubber","Glucks")
return

test(parameter*) {
   global func
   Loop, % parameter.MaxIndex()
      param%a_index% := parameter[a_index]
   if Func.name
   {
      MsgBox Erst muss Stadt aufgerufen werden...
      params := [], paramstr := ""
      Loop, % Func.MinParams {
         paramstr .= ",""" param%A_Index% """"
         params[A_Index] := parameter[A_Index]
      }
      MsgBox % "...dazu werden folgende Parameter benutzt: " paramstr
      %func%(params*)
   }
   MsgBox Dann kommt das "geblubber":`nParam5 = %Param5%`nParam6 = %Param6%`nParam7 = %Param7%
return
}

Stadt(Metropole,Grossstadt,Kleinstadt,Ort) {
   MsgBox Stadt`nMetropole = %Metropole%`nGrossstadt = %Grossstadt%`nKleinstadt = %Kleinstadt%`nOrt = %Ort%
   return
}

User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: dynamische Parameter im Funktionsaufruf

Post by Holle » 16 Oct 2013, 23:49

Vielen Dank für die Erklärung, nun habe ich das auch verstanden.

...und zudem habe ich noch gelernt, daß ein Komma am Anfang des Strings gar nicht entfernt werden muss. :)

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: dynamische Parameter im Funktionsaufruf

Post by just me » 17 Oct 2013, 00:09

Holle wrote:...und zudem habe ich noch gelernt, daß ein Komma am Anfang des Strings gar nicht entfernt werden muss. :)
Na ja, es kommt darauf an, was Du später damit machen willst! ;)

User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: dynamische Parameter im Funktionsaufruf

Post by Holle » 17 Oct 2013, 02:22

Das ist nun zwar eigentlich ein anderes Thema, aber irgendwie gehört das auch zusammen, deswegen mache ich hier mal weiter...

Gibt es eine Möglichkeit in der Funktion festzustellen, durch welches Ereignis (OnMessage) diese aufgerufen wurde?

Eine "Notlösung" habe ich gefunden, aber die funktioniert auch nur solange, wie sich die Parameterlänge unterscheidet oder solange ein Ereignis die Variable A_GuiControl übergibt und die andere nicht.

Hier ist mein Beispielscript (Notlösung)

Code: Select all

OnMessage(0x111, "test") ; WM_COMMAND ---> Reagiert auf alle möglichen Kommandos
OnMessage(0x100, "test") ; WM_KEYFIRST

Gui, Add, ComboBox, x10 w80, Auswahl 1|Auswahl 2|Auswahl 3
Gui, Add, Button, x30 w40 Default, Exit
Gui, Show,w100 ,Test

return

Test(parameter*) {
   params := [], paramstr := ""
   Loop, % parameter.MaxIndex() 
      paramstr .= ",""" parameter[a_index] """"
   If (SubStr(paramstr,1,1) = ",")
      StringTrimLeft, paramstr, paramstr, 1
   
   ; --- Der folgende Teil funktioniert zwar, ist aber "unschön" ---
   if (StrLen(parameter.1) > 3)
      aufrufer := 111
   else 
      aufrufer := 100
   ;----------------------------------------------------------------
   
   ; --- Würde auch funktionieren, solange ein Ereignis A_GuiControl übergibt und das andere Ereignis nicht ---
   ; if A_GuiControl
   ;    aufrufer := 100
   ; else 
   ;    aufrufer := 111
   ;------------------------------------------------------------------------------------------------------------------------

   TrayTip,, % "Parameter = " paramstr "`nAufgerufen von 0x" aufrufer "`nA_GuiControl = " A_GuiControl
   if (aufrufer = 100) ; Damit man erkennt dass 0x100 auch aufgerufen wurde, bevor 0x111 aufgerufen wurde
      sleep 500
   return
}

GuiClose:
ButtonExit:
ExitApp
Ideal wäre ein Befehl mit dem man direkt den Namen (bzw. den Hex-Code) des Ereignisses ermitteln könnte.

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: dynamische Parameter im Funktionsaufruf

Post by just me » 17 Oct 2013, 03:47

Hallo,

die OnMessage-Funktionen haben bis zu 4 Parameter: MyMessageMonitor(wParam, lParam, msg, hwnd).

Die Nachrichtennummer (allerdings dezimal) findest Du im dritten Parameter, bei einer "variadischen" Funktion also in parameter.3.

User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: dynamische Parameter im Funktionsaufruf

Post by Holle » 17 Oct 2013, 03:59

Genial.
Vielen Dank !

Post Reply

Return to “Ich brauche Hilfe”