kupferstecher hat geschrieben: Sa 27. Feb 2021, 00:33
Nochmal zur
Ausgangsfrage, wie schon einige geschrieben haben, ist das eher eine Frage der Architektur, und weniger der sprachlichen Möglichkeiten. Solange man selber keinen konkreten Nutzen, bspw. in Interfaces, sieht, sollte man sie m.E. auch nicht benutzen. Der Code wird durch diese sprachlichen Möglichkeiten nämlich (so meine ich) nicht automatisch besser, sondern sie helfen einfach bei bestimmten Architekturen. Aber wenn man die nicht nutzt ...
Ich hatte gestern einen längeren Beitrag geschrieben, hab das meiste aber
wieder rausgelöscht, weil das noch nicht Hand und Fuß hatte.
Natürlich scheue ich mich davor, Konstrukte zu verwenden, die ich (noch) nicht ganz durchblicke (=> Interfaces, abstrakte Klassen)
Aber, das war mein Eindruck nach fleißigem lesen gestern, ich habe möglicherweise
das Paradigma "
benutze keine globalen Variablen" falsch verstanden.
https://stackoverflow.com/questions/577 ... hi/5777482
Möglichweise
gilt das nur für "einfache Datentypen", nicht aber unbedingt für TObjects
?
Es gibt ja gute Gründe, nicht alles offen zu legen, (siehe den Link..) aber jedes neu angelegte LCL Formular
hat ja - automatisch angelegt - eine globale Variable
var MyForm: TForm; in der INTERFACE Sektion der Unit.
Wenn ich jetzt zu meinem Beispiel zurückkehre, ich hatte - um sie nicht als globale Variablen zu definieren (=> Paradigma) -
entweder "TAudioEngine" als
var in den private-Abschnitt von "TAudioFiles" gehängt, oder umgekehrt.
In meinen jeweiligen Units und auch in der Unit der MainForm gab es nie eine
globale Variable "var MyAudioEngine: TAudioEngine" oder "var MyAudioFiles: TAudioFiles"
Wenn ich das aber jetzt so überschaue, spricht doch eigentlich nichts dagegen,
"TAudioEngine" als globale Variable anzulegen.
(hier: Highlander-Prinzip,
von dieser Art meiner Objekte darf es in einem Programm niemals mehr als 1 Objekt geben)
Bei "TAudioFiles" sieht das schon anders aus, öffnet man zwei Projekte zugleich, braucht man zwei verschiedene Sätze AudioFiles ..
Im dollsten Falle müßte man "TAudioEngine" als globale Var sogar
in der INITIALIZATION section der Unit starten
und in der FINALIZATION section destroyen können ... dürfen ... denke ich ... ???
kupferstecher hat geschrieben: Sa 27. Feb 2021, 00:33
Zu Programmstart wird die "Bibliothek" initialisiert, instantiiert, wie auch immer sie aufgebaut ist, Einstellungen und Daten müssen übergeben werden. Zum Teil zum Programmstart, zum Teil erst bei Verwendung. Und für Events, die wirklich "aus der Reihe" an die GUI bzw. andere Programmteile übermittelt werden müssen, werden Callback-Handler registriert. D.h. die "Bibliotheks"-Unit hat einen "procedural type" (=Funktionspointer), dem man bei der Initialisierung einen Handler übergibt. z.B. AudioStream.OnFFTFinished:= @Form1.FFTFinishedHandler.
Dein ausführlich beschriebener Ansatz mit den Events / Callback-Handlern
kam bei mir noch nie zum Einsatz, das sollte ich mal probieren !
Das Problem ist halt daß ich damals, zu Delphi 5 (.. 6, .. 7)-Zeiten, noch alles recht störungsfrei im MainThread anlegen konnte.
Unter dem LCL-Konstrukt stottert eine MIDI- oder Audio-Ausgabe manchmal bereits,
wenn man bloß ein
ShowMessage('blablabla') öffnet.
Dagegen hilft nichtmal ein HighRes-Timer ..
MIDI und Audio hab ich dann unter der LCL in Threads abgeschoben, was das debuggen nicht gerade erleichtert ..