Topic : Ausgabe Juni/Juli '95 Author : Jörg Schmela @ WI2 Version : 6+7/95 Subject : ATOS Diskettenmagazine Nodes : 836 Index Size : 29488 HCP-Version : 3 Compiled on : Atari @charset : atarist @lang : @default : @help : Helptaste @options : -i +zz -t4 @width : 75 View Ref-FileProgrammierung -> Wie geht denn das? Fensterreihenfolge ATOS 6/7'95 Hiermit beginnt eine neue Reihe in der ATOS, in der ich diverse Programmiererthemen vorstellen möchte. Es kommen nämlich immer wieder Fragen auf, wie man bestimmte Dinge realisieren könnte. Hier sollen nun diverse Möglichkeiten für bestimmte Problemfälle beschrieben werden. Ob sich nun aber ein Programmierer daran hält oder nicht, das bleibt Ihm selber überlassen. Nichts desto trotz darf jeder Programmierer, ob Hobbyist oder Profi, die hier veröffentlichen Programmteile bedenkenlos in seine Programme übernehmen. Nun fangen wir aber mal schleunigst an. Um was soll es mir nun in meiner ersten Folge gehen? Wie stellt man fest, in welcher Reihenfolge die Fenster in der AES-internen Liste stehen? 1. wozu denn das nun wieder? Manchmal steht man vor dem Problem, wie die Reihenfolge der geöffneten Fenster festgestellt werden kann. Ich höre jetzt schon die Stimmen: "Wozu soll das gut sein?", "Quatsch sowas brauch ich doch nicht." Soll ein Programm die Funktion "Konfiguration sichern mit Fensterpositionen" bieten, dann ist es fast unumgänglich, daß man die Reihenfolge der geöffneten Fenster erfahren muß. Damit kann man diese bei einem erneuten Start wieder in genau der Reihenfolge öffnen, wie sie zum Zeitpunkt des Sicherns waren. Auch wenn viele das vielleicht als unnützen Schnickschnack ansehen, macht es ein Programm doch gleich viel symphatischer, wenn der Benutzer ohne großartige Klickerei gleich wieder das richtige Fenster zur Bearbeitung vorliegen hat. Vielleicht wird er dadurch animiert, endlich den längst fälligen Sharewarebetrag zu überweisen..... Im MausNetz kamen auf Fragen, wie man solche Dinge programmieren kann, immer wieder Antworten, wie "In den AES-Vektor einklemmen und mitprotokollieren, welches Fenster geöffnet wird", oder "Mit geringem Aufwand ist das nicht zu realisieren". Allein das "Einhängen in den AES-Vektor" ist wohl schon eher als größeres Schweineprogramm™ anzusehen und sollte wenn möglich vermieden werden. Denn es ist nirgends dokumentiert, wie die Fensterreihenfolge verwaltet wird und es könnte bei diversen AES anders gelöst sein als in den orginal ATARI-AES. (Anm. d.Red.: AES, mehrzahl, "Application Environment Services") 2. ist das denn schwierig? Nun möchte ich mit diesem Artikel ein Verfahren vorstellen, das sauber und problemlos, weil dokumentiert, zu verwenden ist. Es ist außerdem noch recht einfach und mit wenig Aufwand einzubinden, so daß es eigentlich auch ein Hobbyprogrammierer innerhalb einer Viertelstunde implementiert hat. Um dieses Problem zu lösen hab ich mir mal das Atari Compendium zur Hilfe genommen und darin herumgestöbert. Dort bin ich auf eine Funktion gestoßen, die das oben genannte Problem lösen könnte. 3. wie kommt man an den Anfang der Liste? Die AES-Funktion wind_get(handle, WF_TOP, &top); kennt wohl jeder Programmierer. Sie liefert das Handle des obersten Fensters. Laut Compendium gibt es ab AES 4.0 noch weitere Parameter, die mehr Informationen über weitere Fenster herausrücken. Der erweiterte Befehl sieht dann so aus: wind_get(handle, WF_TOP, &top, &owner, &below); Er liefert noch zusätzlich folgende Informationen: handle = Das Handle des Fensters für das die Funktion gilt. Bei WF_TOP ist das Blödsinn, da ja kein definiertes Fenster angegeben werden kann. Also kann man 0 eintragen. WF_TOP = WF_TOP ist als 10 definiert! (#define WF_TOP 10) &top = ist ein Zeiger auf einen int-Wert und liefert das Handle des obersten Fensters. Bis hierher war der Befehl bereits bekannt. &owner = Ist ein Zeiger auf einen int-Wert und liefert die Applikations-ID des Fensterinhabers! &below = Ist ein Zeiger auf einen int-Wert und liefert das Fenster-Handle des Fensters, das direkt unter dem obersten Fenster liegt. Nun ist es zwar toll, daß man nun das oberste Fenster, sowie das zweitoberste Fenster feststellen kann, aber die Kritiker werfen gleich wieder ein, daß man ja mit Sicherheit mehr als zwei Fenster offen haben kann und dann geht das wohl wieder nicht. Aber ich kann Sie auch hier beruhigen, denn Wunder, oh Wunder, die AES-Programmierer haben nachgedacht und weitere Möglichkeiten geschaffen, die auch die weiteren Fenster in der ganzen Liste bearbeiten können. 4. und die weiteren Einträge? Laut Compendium gibt es ab AES 4.0 eine weitere Unterfunktion zu wind_get und zwar nennt sich der Parameter WF_OWNER. Die Ganze Funktion sieht so aus: wind_get(handle, WF_OWNER, &owner, &open, &above, &below); Er liefert folgende Informationen: handle = Das Handle des Fensters für das die Funktion gilt. WF_OWNER = WF_OWNER ist als 20 definiert! (#define WF_OWNER 20) &owner = Ist ein Zeiger auf einen int-Wert und liefert die Applikations-ID des Fensterinhabers! &open = Ist ein Zeiger auf einen int-Wert und liefert die Information, ob ein Fenster geöffnet (1) oder geschlossen (0) ist. &above = Ist ein Zeiger auf einen int-Wert und liefert das Fenster-Handle des Fensters, das direkt über dem mit handle festgelegtem Fenster liegt. Ist dieser Wert -1, dann gibt es kein höheres Fenster mehr! &below = Ist ein Zeiger auf einen int-Wert und liefert das Fenster-Handle des Fensters, das direkt unter dem mit handle festgelegtem Fenster liegt. Ist dieser Wert -1, dann gibt es kein niedrigeres Fenster mehr! Mit diesen beiden Funktionen ist es nun ein Leichtes die gewünschten Resultate zu erzielen. Mit den beiden Funktionen kann man also die Fensterliste von oben nach unten durchsuchen. weiter