Heute wieder ein wunderschöner Beitrag aus der merkwürdigen Welt der Programmierung. Alles natürlich wieder am praktischen Beispiel erklärt. Angenommen ihr erhaltet Besuch (international, spricht viele Sprachen) und der schnüffelt in eurem Bücherregal herum, was natürlich überhaupt nicht nett ist. Statt zu fragen, vertauscht er die Reihenfolge, ändert Lesezeichen und macht Eselsohren hinein. Da er regelmäßig bei euch vorbeikommt, interessiert ihn natürlich meistens das Buch, was ihr gerade lest, seltener die anderen Bücher, aber das kommt schon mal vor.
Da gibt es nur einen Ausweg – den Bücherschrank absperren und ab sofort muss er euch fragen, was für ein Buch ihr gerade lest, von wem es ist, ob ihr mal eine Seite aufschlagen könnt bzw. wann und wo es erschienen ist usw. Damit hätten wir den theoretischen Teil abgehandelt und können zur Praxis übergehen. Da ihr ja aktive Lebenwesen seid (oder sind auch Zombies oder Untote unter meinen Lesern?), nennt sich das Ergebnis ActiveX. Ihr bereitet euch auf alle Fragen und Aktionen vor, die kommen könnten und stellt fest, dass es Ähnlichkeiten gibt.
Schlag mal Seite … auf, von dem Buch, das du gerade liest!
Schlag mal Seite … auf, von dem Buch, das … hieß!
Blöd wäre ja jetzt, wenn ihr für jede Frage oder Aktion, die neu angefordert wird, zwei neue Formulierungen aufschreiben müßtest. Das ist nicht nur aufwändig, sondern wird mit der Zeit auch ziemlich unübersichtlich. Also beschränkt ihr euch auf eine Formulierung, denn die Mehrzahl der Fragen richtet sich ohnehin nach dem Buch, das ihr gerade lest.
Schlag mal Seite … auf, von dem Buch, das … hieß!
Die zweite Hälfte der Aufforderung ist dabei freiwillig, d.h. wenn der Fragesteller den Teil weglässt, geht ihr einfach davon aus, dass es sich um das aktuelle Buch handelt, das ihr lest. Unter Programmierern wird soetwas optionale Parameter genannt. Jetzt kommt der Moment, wo wir das gesamte Wissen zusammenraffen können und an dem Punkt hängenbleiben, dass wir eine Fragestellung aufschreiben sollen, die auch noch international verständlich ist. Als Programmierer hat man es da einfach, denn für solche Zwecke wurde die Object Definition Language (ODL) erfunden, mit der man beschreiben kann, wie eine solche Frage aussieht – und im Endeffekt von vielen Programmiersprachen aus ansprechbar.
Natürlich kann man sich soetwas schnell zusammenklicken, aber an solchen Fragen, wie optionalen Parametern bleibt man doch hängen und muss von Hand eingreifen. So würde also die Aufforderung zum Aufschlagen einer Seite in ODL aussehen.
1 [id(42)] bool Aufschlagen(long Seite, [optional] VARIANT ISBN);
Das sollte doch auch für Nichtprogrammierer einleuchtend sein – ich gebe an, das ich Seite soundso aufschlagen möchte und wenn ich keine ISBN erhalte, nehme ich das aktuelle Buch. Natürlich versteht unsere ODL auch das Prinzip der Eigenschaften, in dem Fall Autor, Titel, Cover usw. Jetzt fängt der Vergleich mit den Büchern etwas zu hinken, denn die ODL ermöglicht uns nicht nur das Ermitteln, sondern auch das Verändern von Eigenschaften. Wäre ja möglich, in dem unser Besuch den Autor durchstreicht und seinen eigenen Namen darüber schreibt. Nur, dass er uns diesmal um Erlaubnis fragen muss.
Und jetzt treiben wir die Möglichkeiten der ODL auf die Spitze, denn das Object in ODL bedeutet, dass man eigentlich von einem Objekt ausgeht. Von diesem Standpunkt aus, sind optionale Parameter bei Eigenschaften doch etwas kniffliger. Also machen wir uns mal an die Beschreibung…
1
2 [id(42), propget] VARIANT Autor([optional] VARIANT param1);
[id(42), propput] void Autor(VARIANT param1, [optional] VARIANT param2);
Um zu Verstehen, wie dicht wir hier am Limit der ODL arbeiten, brauch man sich nur mal die Parameter ansehen, denn die ODL besteht darauf, dass der erste Parameter jeweils den gleichen Namen hat, obwohl er bei der ersten Funktion (Ermitteln des Autors) inhaltlich der ISBN entspricht und im zweiten (Verändern des Autors) dem neuen Autor. Kommen wir aber zum schönen Teil – dem Einholen der Ernte.
Jetzt wird es natürlich extrem programmierlastig, aber die Kommentare sollten aufschlussreich genug sein.
1
2
3
4
5
6
7
8
9
10
11
12
13 // Verändern des Autors
void CMyActiveX::SetAutor(const VARIANT FAR& param1, const VARIANT FAR& param2)
{
// schauen wir mal nach, ob wir eine ISBN bekommen haben...
if (param2.vt == VT_ERROR && param2.scode == DISP_E_PARAMNOTFOUND)
{
// Keine ISBN, also nehmen wir das aktuelle Buch
}
else
{
// ISBN angegeben, also ein spezielles Buch suchen
}
}
Erste Testergebnisse: Ich bin mit zwei Programmiersprachen auf die ActiveX-Komponente losgegangen und konnte (fast) problemlos damit arbeiten – einzig das Verändern von Eigenschaften mit optionalem Parameter machte in einer Sprache Ärger. Aber wir wollten es ja ohnehin nicht zulassen, dass die Gäste in den Büchern herumschmieren…
*würg*
activeX hatte ich schon wieder verdrängt …..
früher hiess das ja ole (oleoleole) …. und hat mich damals schon gefuxt .. ich wollte autocad-objekte per visual basic kreieren und ändern, etc. nach vielen vielen stunden und tagen mit viel fluchen gings dann auch irgendwann …
in der letzten if-abfrage fehlt ein „=“ …. odr ??
Das komische dabei ist – bei mir ging das sofort. Ich bin nur greife nur mit C++ und FoxPro an.
Das mit dem if ist natürlich absolut korrekt 😳
mag auch daran liegen, dass ich an meiner 2. arbeitsstelle vor – oh schreck – 11 jahren weniger programmiererfahrung hatte als heute …. B)
so lang man die sachen auf den ausgetretenen pfaden und innerhalb der microsoft-welt verwendet, funktioniert das auch tip-top …
Stümmt – so nach 20 Jahren Programmierung jagt einem sowas keinen Schreck mehr ein 😉 Ich finds nur echt genial, sich die Schnittstellen zurückzubiegen. Was nicht passt, wird passend gemacht.
Öhm – irre ich mich oder ist man mit COM bzw. ActiveX nicht zwangsläufig auf den ausgetretenen Pfand von MS unterwegs?! 😉
ach ja .. COM hiess es auch mal … kam nach OLE …..
AutoCAD gehört(e) nicht zu den ausgetretenen Pfaden .. 😉
Ach so meintest du das *g* An AutoCAD-Schnittstellen habe ich noch nicht herumgewurstelt, aber die Programmierer konnten ja auch nur ihr Süppchen mit dem Microsoftwasser kochen 😉 Ist das so kompliziert?
Ich bin schon froh, dass ich zum Test ein ganz lockeres early binding machen kann, da erspare ich mir das Herumgemache mit dem IUnknown-Pointer.
daaaaaaamals …. *augenverdreh* … gab es autocad auch auf unix-systemen ……
und an autolisp erinnere ich mich mit schrecken … *uaaaah* … gruseliges zeug …
vielleicht war es ganz einfach und ich nur zu doof … ich weiss es nicht mehr … hab ich erfolgreich verdrängt 😉
Autolisp *fröstel* Ist das ein LISP-Aufsatz für AutoCAD? *nochmehrfröstel* Die schrecken ja wirklich vor garnix zurück… Sowas würde ich auch verdrängen 😉
jup … sowas in der art ist das …. *grusel*