AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

Ein Thema von fisipjm · begonnen am 17. Okt 2022 · letzter Beitrag vom 18. Okt 2022
Antwort Antwort
Seite 1 von 2  1 2      
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#1

Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 17. Okt 2022, 09:13
Delphi-Version: 10.4 Sydney
Hi,

ich würde in einem Projekt gerne eine elegante Lösung finden, für ein Problem, dass denke ich viele so in irgendeiner Spielart schon hatten.
Also, ich habe aktuell einen Dienst, der sich in einer Datenbank gewissen Jobs anschaut und diese dann nach einer zeitlichen Vorgabe ausführt. Diese Tasks sind relativ klein strukturiert, jetzt ist es manchmal so, dass es einen Task gibt, der einzeln ausgeführt werden kann, aber zwingend erforderlich für einen anderen Task ist. Manchmal muss ein Task vor einem "Haupttask" laufen und manchmal danach.

Ich würde das gerne irgendwie relativ dynamisch aufrufen können, ohne dafür den Code hart in die jeweilige Hauptfunktion stecken zu müssen. Ich hatte mir vorgestellt, dass ich das eventuell mit einer dynamischen Prozedur lösen kann, indem ich den Haupttask z.B. um TaskBefore, TaskAfter = Tproc erweitere.

Ich könnte mir allerdings vorstellen, dass es da Probleme mit diversen Uses gibt, weil der Haupttask ja erst mal nicht weis, welche Sachen in der Anonymen Prozedur genutzt werden. Ist das der richtige Weg? Wie lösen das die langjährigen Profis
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 17. Okt 2022, 13:28
Der "Haupttask" muß nur die Signatur der anonymen Methoden kennen, die "Nebentasks" können dann entsprechende Methoden beim Haupttask registrieren. In diesem Scenario kennen die Nebentasks den Haupttask, d.h nutzen dessen Unit in der Uses-Klause, aber nicht umgekehrt. Das läßt sich noch weiter entkoppeln, wenn Du einen "task manager" als separate Klasse in einer eigenen unit verwendest (z. B. als Singleton), mit der sich auch der Haupttask registriert. Besonders wenn es davon nur einen geben kann brauchen die Nebentasks dann den Haupttask nicht zu kennen, alle task units würden nur die unit des Managers in ihrer Uses-Klausel verwenden. Diese würde dann auch eine Basisklasse (oder ein Interface) für die Tasks deklarieren.
Peter Below
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#3

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 17. Okt 2022, 16:17
Die Anforderung ist für mich etwas unklar formuliert, ich weiss jetzt nicht ob das dynamisch je nach Datenbank-Feldinhalt sein soll,
oder nicht.

Falls es nur um einen dynamischen Aufruf geht, welchen Du je nach Anforderung im Aufruf anpassen möchtest,
dann könntest Du auch sowas wie einen "Builder" einsetzen um die SubTasks jeweils in anonymen Prozeduren zu halten.
Delphi-Quellcode:
...

LMyTask := MyTask_Builder
.Conf_MainTask(
    procedure
    begin
       A();
    end )
.Conf_SubTaskBefore(
    procedure
    begin
       B();
    end )
.Conf_SubTaskAfter(
    procedure
    begin
       C();
    end );

LMyTask.Execute;

...
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#4

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 18. Okt 2022, 07:31
Die Anforderung ist für mich etwas unklar formuliert,...
[/DELPHI]
Hast absolut recht. Ich versuchs nochmal. Die Proceduren existieren schon.

Beispiel:

Delphi-Quellcode:
procedure a;
begin
...
end;

procedure b;
begin
...
end;

procedure c;
begin
...
end;

procedure d;
begin
...
end;

procedure e;
begin
...
end;
Alle Prozeduren erledigen eigenständig ihre Aufgabe und sind auch in sich geschlossen. Es kann allerdings sein, dass z.B. Prozedur a zwingend, vor Prozedur b laufen muss. Oder wenn man es nochmal anders ausdrücken möchte, dass Prozedur b zwingend nach Prozedur a laufen muss. Das hat keinerlei technische Gründe. Das Programm würde auch ohne auf einen Fehler zu laufen einfach nur Prozedur A oder nur Prozedur B ausführen. Das würde einfach nur zu logischen Fehlern in den Daten führen. Da sich diese Anforderungen während der Benutzung der Anwendung ändern können, möchte ich das gerne dynamisch zusammen setzen können. Müsste ja mit RTTI gehen, dass ich aus den Strings in der Datenbank die Prozeduren raus fische und die dann entsprechend dran hänge. Mein Frage wäre jetzt nur, ob ich die vorhandenen Prozeduren "stöpselfähig" machen kann. In meiner Vorstellung sowas:


Delphi-Quellcode:
procedure a (Runbefore: array of Tproc; Runafter: array of Tproc);
begin
for Tproc in Runbefore do
Tproc.run;
...
for Tproc in Runafter do
Tproc.run;
end;
Ich hoffe, ich konnte mich ein bissel klarer ausdrücken
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 18. Okt 2022, 07:44
Für mich macht es dann aber meinen Sinn, das im Code zu machen, weil wenn isch etwas ändert, musst Du den Code ändern und eventuell neu ausliefern. Da ist es vllt. besser, man steuert es über die DB. Vllt mit einem Feld Pre-Task mit der Id des Tasks, der vorher laufen soll. Sind es 2 Tasks vorher, dann hat einer einfach auch einen Pre-Task...
Und auf diese weise, wenn Du man was ändern willst, dann einfach in der DB den Aufruf ändern
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#6

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 18. Okt 2022, 08:34
Für mich macht es dann aber meinen Sinn, das im Code zu machen, weil wenn isch etwas ändert, musst Du den Code ändern und eventuell neu ausliefern. Da ist es vllt. besser, man steuert es über die DB. Vllt mit einem Feld Pre-Task mit der Id des Tasks, der vorher laufen soll. Sind es 2 Tasks vorher, dann hat einer einfach auch einen Pre-Task...
Und auf diese weise, wenn Du man was ändern willst, dann einfach in der DB den Aufruf ändern
Ich meinte, das wäre das, was ich in meinem Post zuvor beschrieben hätte?

Ich würde das halt auch gern im Code abbilden, nicht nur in der Datenbank. Sehe jetzt nicht, warum ich bei dem Anonymen Prozeduren Aufruf den Code neu Compilieren müsste? Wenn man das ganze nämlich noch auf die Spitze treibt, und zum Beispiel die einzelnen Funktionen als BPL ausliefert, dann hat man ein schönes Plugin-System, dem ich neue Funktionen hinzufügen und alte wegnehmen kann, ohne dass ich jedes Mal die Hauptanwendung neu ausliefern muss. Das wäre so zu sagen der LongTime Plan dazu
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#7

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 18. Okt 2022, 08:54
Da sich diese Anforderungen während der Benutzung der Anwendung ändern können, möchte ich das gerne dynamisch zusammen setzen können. Müsste ja mit RTTI gehen, dass ich aus den Strings in der Datenbank die Prozeduren raus fische und die dann entsprechend dran hänge.
Könntest du hierfür noch ein konkretes Beispiel geben?
Also, was steht in der Datenbank und was soll damit passieren?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#8

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 18. Okt 2022, 09:10
Da sich diese Anforderungen während der Benutzung der Anwendung ändern können, möchte ich das gerne dynamisch zusammen setzen können. Müsste ja mit RTTI gehen, dass ich aus den Strings in der Datenbank die Prozeduren rausfische und die dann entsprechend dran hänge.
Könntest du hierfür noch ein konkretes Beispiel geben?
Also, was steht in der Datenbank und was soll damit passieren?
Moin,

Noch steht in der Datenbank
1. Zeile - Task 1
2. Zeile - Task 2
3. Zeile - Task 3
usw.*...

Ich hätte es zukünftig gerne so:
Tabelle 1 (Sichtbar für Otto normal Bediener)
1. Zeile - Bundle 1

Andere Tabelle (Zugriff von Benutzern mit Ahnung vom Ablauf)
BundleName = Bubndle 1
PreTask = Task 1;Task x ...
MainTask = Task 2
PostTask = Task 3;Task x ...

Andere Tabelle (irgendwann mal halbautomatisch gefüllt) zur Verfügung stehende Tasks
1. Zeile - Task 1
2. Zeile - Task 2
3. Zeile - Task 3


Diese Struktur hatte ich gedacht mit den Anonymen Prozeduren abbilden zu können. Also im Prinzip das Bundle
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#9

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 18. Okt 2022, 09:15
Und "Task x" steht dann für eine der Prozeduren a, b, c,...?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#10

AW: Frage zu Anonymen Prozeduren (TProc) und verwendung als Bauskasten

  Alt 18. Okt 2022, 09:54
Und "Task x" steht dann für eine der Prozeduren a, b, c,...?
Genau, alle Prozeduren, die angehängt werden sollen, existieren bereits im Code. Sollten aber in beliebiger Anzahl dran gehängt werden können.
Also Pro bzw. Post Prozedur kann auch leer sein oder eben 10 Prozeduren enthalten, deshalb im Code das
Code:
Array of TProc
Ich habe absolut keinen Peil, ob das funktionieren kann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz