Entwickler-Ecke
Dateizugriff - Text als Funktion aufrufen
Jakane - Di 30.04.13 10:28
Titel: Text als Funktion aufrufen
Hallo liebe Delphi-Helfer :)
Ich habe einen Timer der je nach Bedingung von Zeit und Einstellung verschiedene Funktionen startet.
Mein Problem dabei ist, das bei ungünstigen Einstellungen eine Funktion aufgerufen werden müsste, die aber nicht aufgerufen wird, weil die vorherige Funtion noch arbeitet, wärend die Zeit-Bedingung gesetzt ist.
Daher habe ich nun vor diese Funktionen in eine ToDo-Liste zu setzen und diese mit einem seperaten Timer die anfallenden Funktionen abzuarbeiten.
Zum Beispiel der 1. STRING: lbToDo.Items.Strings[0] = '_Funktion(Para1, Para2);'
Es gibt in meinem Projekt auch eine Funktion die genau so aufgerufen wird: _Funktion(Para1, Para2);
Das blöde ist nur, dass die Liste nunmal ein String ist.
Übergangsweise werde ich es wie folgt programmieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TfmHaupt.TimerToDoTimer(Sender: TObject); var Funktion : String; begin if lbToDo.Items.Count = 0 then begin TimerToDo.Enabled:= False; EXIT; end; Funktion:= lbToDo.Items.Strings[0]; if Funktion = '_Funktion1(Para1, Para2);' then _Funktion1(Para1, Para2); if Funktion = '_Funktion1(Para1, Para3);' then _Funktion1(Para1, Para3); if Funktion = '_Funktion2(Para4);' then _Funktion2(Para4); ... end; |
Meine Frage:
Gibt es eine Möglichkeit zu sagen, dass der String Funktion direkt als Funktion ausgeführt wird?
Moderiert von
Martok: Code- durch Delphi-Tags ersetzt
WasWeißDennIch - Di 30.04.13 11:34
Das wird nicht funktionieren. Bei parameterlosen Methoden (die je nach Delphi-Version auch noch published sein müssen) könnte man sich ggf. noch mit TMethod behelfen, aber in der Form sehe ich schwarz. Außerdem dürfte damit das Problem auch nicht gelöst sein, da das Programm dann immer noch mit der arbeitenden Routine beschäftigt sein dürfte. Sofern die Routinen nicht auf dieselben Daten zugreifen, könntest Du die Verwendung von Threads ins Auge fassen.
Nersgatt - Di 30.04.13 11:41
Deine Todoliste nennt man FIFO (First in first out), also praktisch die Supermarktkasse. Wer sich als erstes anstellt, wird auch als erstes bedient. In Delphi gibt es dafür die Klasse TQueue, in der Du eine Liste von Pointern nach dem FIFO-Prinzip speichern kannst. Da könntest Du auch Pointer auf Deine Funktionen speichern. Bzw. Pointer auf Instanzen einer Hilfsklasse die Infos zur Funktion und der Parameter hält.
Ansonsten wäre noch in neuere Delphiversionen die erweiterte RTTI zu nennen, mit der man Funktionen anhand des Namens finden und aufrufen kann.
Jakane - Di 30.04.13 12:15
hmm ok, danke für die Infos :)
muss nachdenken welche ich davon am besten für mich umsetze
jaenicke - Di 30.04.13 13:03
Um welche Delphiversion geht es denn eigentlich? Bei neueren Delphiversionen wäre eine typisierte Liste mit anonymen Funktionen darin eine einfache Lösung.
WasWeißDennIch - Di 30.04.13 13:26
Zwar ziemlicher Hardcore, aber mit selbst definierten Messages samt zugehöriger Handler müsste es auch gehen. Die Problematik, dass Routinen ggf. nicht gleichzeitig arbeiten können, wird ohne Threads aber wohl trotzdem bestehen bleiben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!