•  Back 
  •  ATOS Magazin für den TOS Anwender und MagiCMac Freunde 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Helptaste 
  •  Show info about hypertext 
  •  View a new file 
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