AppSys.prg

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen

Bedeutung der Funktion AppSys()

Unter Clipper gab es nur ein "Fenster", das quasi den ganzen DOS-Bildschirm einnahm. Unter Windows muss ein Applikations-Fenster erzeugt werden, das dazu dient, dass das Programm mit dem Anwender (und Windows) kommunizieren kann.

Die generische AppSys()-Funktion von Xbase++ orientiert sich an der Art des Programms, die über die XPJ-Datei bzw. eine entsprechende Linker-Option festgelegt wird.

Es gibt eine Vielzahl von Optionen, die in der Funktion AppSys() eingestellt werden können, und auf die hier nicht in aller Tiefe eingegangen werden kann.


Beispiel einer AppSys() Funktion

#INCLUDE "AppEvent.CH"
#INCLUDE "Gra.CH"
#INCLUDE "NLS.CH"
#INCLUDE "Xbp.CH"
FUNCTION AppSys()
   Local aSize[2], aPos[2]
   Local nI
   Local oDlg
   SetLocale(NLS_ICURRENCYEURO, "1")
   SET CHARSET TO ANSI
   aPos := {1, 1}
   aSize := {800, 600}
   oDlg := XbpDialog():new(AppDesktop(), AppDesktop(), aPos, aSize)
   oDlg:sysmenu := .T.
   oDlg:hideButton := .T.
   oDlg:taskList := .T.
   oDlg:close := {|| PostAppEvent(xbeP_Quit)}
   oDlg:title := GetProgramTitle()
   oDlg:create()
   CenterControl(oDlg)
   RootWindow(oDlg)
   oDlg:setTitle(GetProgramTitle())
   SetAppWindow(oDlg)
RETURN (.T.)
FUNCTION RootWindow(oDlg)
   Static oStatic
   IF oDlg <> NIL
      oStatic := oDlg
   ENDIF
   IF oStatic = NIL
      ConfirmBox(, "Fehler", "Programm nicht richtig geladen", XBPMB_CRITICAL, XBPMB_OK)
      QUIT
   ENDIF
RETURN (oStatic)
FUNCTION GetProgramTitle
   //
RETURN("Ein erstes Programm")


Die einzelnen Schritte

Zeichensatz und Darstellung des €-Zeichens

Diese Angaben gehören nicht zwingend in die AppSys(), sondern können auch an andere Stelle im Programm stehen, wobei von den Start-Funktionen die AppSys() sicherlich die geeigneteste Funktion hierfür ist.


Grösse und Position

Ein Fenster benötigt eine Grösse und eine Position.

Standardmässig wird die Grösse und die Position in Pixel bestimmt. Für die Position ist der Ausgangspunkt die untere, linke Ecke des Windows-Desktop.

Beide Parameter werden in einem Array definiert und übergeben.

In diesem Beispiel ist das Fenster 800 Pixel breit und 600 Pixel hoch, und die Position, an der das Fenster angezeigt werden soll, befindet sich einen Pixel in horizontaler und vertikaler Richtung von Ausgangspunkt entfernt.

Die Grösse bezieht sich übrigens auf das Fenster, beinhaltet also (falls definiert) Titelleiste, Rahmen etc.


Erstellen des XbpDialog() Objektes

Unser Programm-Fenster benötigt einen Parent, sowie einen Owner. Dies ist in beiden Fällen der Windows-Desktop, der über die Funktion AppDesktop() ermittelt werden kann. Diese Funktion liefert eine Referenz (!) auf den Windows-Desktop zurück (übrigens auch ein XbpDialog() Objekt).

Als weitere Parameter werden die Arrays mit den Angaben zur Grösse und zur Position des Fensters übergeben.

Die weiteren Parameter der :new() Methode sind nicht angegeben, daher werden hier zum einen die Windows-Standards verwendet, und das Fenster ist nach erstellen direkt sichtbar.

Die Methode :new() erzeugt ein Objekt von einer bestimmten Klasse, das Objekt ist jedoch noch nicht "funktionsfähig". Gewisse Instanzvariablen sind verfügbar, bestimmte Methoden jedoch noch nicht.

Die Funktionsfähigkeit wird später durch das Ausführen der Methode :create() hergestellt. Dazu gleich noch ein wenig mehr.


Konfiguration des XbpDialog() Objektes

Die hier verwendeten Konfigurationsoptionen stellen nur einen Ausschnitt dar, helfen jedoch, die wichtigsten Windows-spezifischen Funktionen zur Verfügung zu stellen:

oDlg:sysmenu := .T.
oDlg:hideButton := .T.
oDlg:taskList := .T.
oDlg:close := {|| PostAppEvent(xbeP_Quit)}
oDlg:title := GetProgramTitle()

Die Instanzvariable :sysmenu bestimmt, ob das in der linken, oberen Ecke angezeigte Systemmenü angezeigt wird oder nicht.

Die Instanzvariable :hideButton bestimmt, ob der Button zum Verkleinern (Minimieren) des Fensters angezeigt wird oder nicht.

Die Instanzvariable :taskList bestimmt, ob das Programm durch eine Icon in der Taskliste dargestellt wird oder nicht (auf die Darstellung im TaskManager hat diese Instanzvariable keinen Einfluss).

Die Instanzvariable :close enthält einen Codeblock, der ausgeführt wird, wenn das Fenster geschlossen werden soll (durch eine der klassischen Aktionen wie Anklicken des roten X in der rechten, oberen Ecke, Strg bzw Alt-F4 oder durch Auswählen von Schliessen im Systemmenü des Programms. In unserem Beispiel wird das Event xbeP_Close in die Event-Schlange gestellt.

Die Instanzvariable :title bestimmt, welcher Text im oberen Rahmen des Fensters dargestellt wird.


Anfordern der System-Resourcen

Mit der Methode :create() wird das Programmfenster sichtbar gemacht (Voraussetzung: der entsprechende Parameter wurde bei :new() weggelassen oder mit TRUE angegeben.

oDlg:create()

Damit ist das Fenster vorhanden und dialog-fähig.


Positionieren des Fensters

Wahrscheinlich dürfte die Mitte des Windows-Desktops eine der überfülltes Data Highway Strecken überhaupt sein ... Mit der Funktion CenterControl() wird ein Xbase-Part in Bezug auf seinen Parent zentriert (oder in Bezug auf das Xbase-Part, das als zweiter Parameter genannt wird:

CenterControl(oDlg)


Bedeutung der Funktion RootWindow()

Die (neue) Funktion SetAppWindow() definiert, welches Dialog-Fenster eines Xbase-Anwendung als "Hauptfenster" fungiert.

In der Vergangenheit wurde dies häufig über eine Funktion RootWindow() abgebildet. Diese Funktion wird nach Erstellen des Dialogs aufgerufen und erhält als Parameter eine Referenz auf das Fenster. Diese Referenz wird in einer STATIC Variablen abgelegt, die bei folgenden Aufrufen als RETURN-Wert zurückgegeben wird:

RootWindow(oDlg)


Änderung des Programm-Titels nach der Erstellung eines Fensters

Die Verwendung der Methode :setTitle() dient zur Illustration, wie Änderungen an einem Xbase-Part zur Laufzeit ausgeführt werden können:

// a) zwischen :new() und :create()
oDlg:title := cTitle
// b) nach :create() - Variante 1
oDlg:setTitle(cTitle)
// c) nach :create() - Variante 2
oDlg:title := cTitle
oDlg:configure()


Festlegen des Anwendungsfensters

Mit der Funktion SetAppWindow() wird festgelegt, dass das als erster Parameter übergebene Xbase-Part als Anwendungsfenster fungiert.