Frohes Neues euch Beiden! (und allen anderen)
Ja, damit scheidet Hansa's Lösung wohl aus.
Aber willst du komplett auf Delphi Komponenten verzichten oder nur auf Controlls (also die Sichtbaren Dinge). Also wenn du jetzt (noch?) eine TObjectList verwendest, dann wäre das ja auch schon eine Delphi Komponente, da würde ich dann aber über den Sinn des Ersetzens nachdenken.
Jedenfalls ist es auch kein Problem eine
GUI mit Delphi Komponenten zu schreiben und diese dann später durch eigene Implementierungen zu ersetzen. Das Zauberwort heißt (überraschender Weise) mal wieder Interfaces.
Ich weiß, die Idee von den Dingern ist noch nicht so wirklich klar (oder?). Also gehen wir mal ein sehr schönes praktisches Beispiel an, du möchtest Plugins ermöglichen.
Die Motivation hinter Plugins ist natürlich allen klar, aber trotzdem noch einmal grob zusammen gefasst:
Plugins ermöglichen es, ein Programm mit weiteren Funktionen auszustatten. Zum Zeitpunkt der Programmerstellung ist dabei noch nicht klar, was für Plugins es geben wird. Der Sinn ist es gerade beliebige Funktionen (nahezu) in ein Programm aufnehmen zu können.
Ok, jetzt muss also das Programm mit etwas umgehen können, dass noch gar nicht existiert. Wie also kann man das eigene Programm darauf vorbereiten mit unbekanntem umzugehen. Man könnte natürlich mit Neuronalen Netzen arbeiten und das Programm lernen lassen und irgendwann (hoffentlich) versteht es dann jedes Plugin, dass kommt, ist aber nicht grade trivial und eigentlich hätte man doch gerne, dass schon das erste Plugin funktioniert.
Muss man also einen anderen Weg gehen. Da man wie gesagt noch nicht weiß was genau kommt, geht man in gewisser Weise den anderen Weg. Man stellt alle (öffentlichen) Daten einem Plugin zur Verfügung. Dieses muss die dann über eine festgelegte Schnittstelle holen und zurück geben (also die Daten). Ganz wichtig ist natürlich noch, das Plugin muss sich bekannt machen können (Registrieren/Deregistrieren), da dass Programm ja sonst nichts vom Plugin weiß.
Definierte Schnittstelle, hm, die nahezu sinngemässe deutsche Übersetzung von Interface (Zwischengesicht tut es auch). Ein Interface macht nichts anderes, als solche Schnittstellen fest zu legen. Da alle Methoden eines Interface nach aussen Sichtbar sind, kann ein Plugin über diese Methoden auf ein Programm zugreifen. Benutzt das Plugin als Schnittstelle ein Interface, wird es nie mehr können als eben genau diese Schnittstellen zu benutzen (das Programm kennt nicht direkt das Plugin und das Plugin kennt nicht direkt das Programm). Beide kennen nur das Interface.
Das ist auch gut so, wenn jmd. ein Plugin für den InternetExplorer schreiben wollen würde und der müsste erst die mind. 4 mio. Zeilen durchgehen (letzter Stand den ich kenne), nun ja...
Ok, was hat das jetzt mit der
GUI zu tun? Schauen wir uns doch mal eine beliebige
GUI an, warum nicht Delphi. Delphi ist erstmal eine
GUI, ok, das ist gut. Delphi hat Komponenten und was noch ganz toll ist, man kann sogar welche nachrüsten. Viele davon stammen nicht aus dem Hause Borland, es spricht also einiges dafür, dass die Erzeuger nicht den Source von Delphi kennen. Und trotzdem funktionieren (die meisten) Komponenten wie sie sollen. Warum?
Nun ja, Delphi macht natürlich nichts anderes als ein Interface zur Verfügung zu stellen. Es ist natürlich etwas komplexer als ein in Delphi geschriebenes Interface (immerhin gehört der Programmcode ja mit zu dem was Delphi verstehen muss), aber es ist an sich auch nur ein Interface.
Wichtig ist, wenn ein Komponente benutzbar sein soll, muss diese über eine festgelegte Methode registriert werden und ebenso wird eine Komponente über ein festgelegte Methode entfernt.
Dabei ist halt nur der Name der Methode sowie die Parameter bekannt. Man weiß natürlich auch was die Methode leistet, aber es interessiert einen i.d.R. nicht, was intern gemacht wird. Deshalb benutzt man hier ein Interface.
Wenn Delphi Komponenten nun anders in 2005 registriert als in 7, dann störrt einen das nicht (sehr idealisierte Vorstellung, die durch Änderungen an Interfaces zu nichte gemacht wird).
Genauso ist es mit deiner
GUI, legst du nur die Schnittstellen fest, kannst du die
GUI beliebig erweitern. Es muss halt nur eine Möglichkeit geben, neues bekannt zu machen. Würdest du ein Delphi-Form benutzen, was zusätlich ein MainForm-Interface implementiert, dann könntest du dies auch später durch eine beliebige andere Implementierung des MainForm-Interfaces ersetzen.
Du abstrahierst also wieder einfach vom Konkreten (deshalb solltest du dir immer noch über die Beziehung der einzelnen Interfaces Gedanken machen).
Gruß Der Unwissende