Dies ist eine Erweiterungsantwort, wie versprochen. Im Jahr 2000 haben wir begonnen, eine Anwendung mit Delphi zu schreiben. Dies war eine EXE-Datei und einige DLLs, die Logik enthielten. Dies war Filmindustrie, also gab es Kunden-DLL, Buchungs-DLL, Kassen-DLL und Abrechnungs-DLL. Wenn der Benutzer die Abrechnung durchführen wollte, öffnete er das entsprechende Formular, wählte den Kunden aus einer Liste aus, lud die OnSelectItem-Logik die Kunden-Theater in das nächste Kombinationsfeld und füllte nach Auswahl des nächsten OnSelectItem-Ereignisses das dritte Kombinationsfeld mit Informationen zu den Filmen, die noch nicht vorhanden waren noch in Rechnung gestellt. Der letzte Teil des Prozesses war das Drücken der Schaltfläche "Rechnung machen". Alles wurde als Event-Prozedur durchgeführt.
Dann entschied jemand, dass wir eine umfassende Tastaturunterstützung haben sollten. Wir haben aufrufende Ereignishandler von anderen geraden Handlern hinzugefügt. Der Workflow von Ereignishandlern begann sich zu verkomplizieren.
Nach zwei Jahren entschied sich jemand, eine andere Funktion zu implementieren, sodass dem Benutzer, der mit Kundendaten in einem anderen Modul (Kundenmodul) arbeitet, die Schaltfläche "Diesen Kunden in Rechnung stellen" angezeigt werden sollte. Diese Schaltfläche sollte das Rechnungsformular auslösen und in einem solchen Zustand anzeigen, als wäre es der Benutzer, der alle Daten manuell ausgewählt hat (der Benutzer sollte in der Lage sein, die Daten anzuzeigen, einige Anpassungen vorzunehmen und die magische Schaltfläche „Rechnung erstellen“ zu drücken ). Da es sich bei den Kundendaten um eine DLL und bei der Abrechnung um eine andere handelte, wurden EXE-Nachrichten an EXE weitergeleitet. Die offensichtliche Idee war also, dass der Kundendatenentwickler eine einzige Routine mit einer einzigen ID als Parameter haben wird und dass sich all diese Logik innerhalb des Abrechnungsmoduls befindet.
Stellen Sie sich vor, was passiert ist. Da sich ALLE Logik in Ereignishandlern befand, haben wir viel Zeit damit verbracht, keine Logik zu implementieren, sondern Benutzeraktivitäten nachzuahmen - wie das Auswählen von Elementen, das Anhalten von Application.MessageBox in Ereignishandlern mithilfe von GLOBAL-Variablen usw. Stellen Sie sich vor, wenn wir sogar einfache logische Prozeduren hätten, die in Ereignishandlern aufgerufen werden, hätten wir die boolesche Variable DoShowMessageBoxInsideProc in die Prozedursignatur einführen können. Eine solche Prozedur könnte mit true-Parametern aufgerufen worden sein, wenn sie vom Ereignishandler aufgerufen wurde, und mit FALSE-Parametern, wenn sie von einem externen Ort aufgerufen wurde.
Das hat mich also gelehrt, Logik nicht direkt in GUI-Ereignishandler zu integrieren, mit einer möglichen Ausnahme von kleinen Projekten.
cooked up
einigespaghetti
Anwendungen, die ein wahrer Albtraum sind, und das ist schade, da die Apps sehr nett waren. Aber ich hasste meine eigene Schöpfung. Robs Antwort ist wirklich nett und erschöpfend, IMO.