PHP goes .Net

Windows-Forms-Anwendung

Windows-Forms-Anwendungen

image.jpg

© Hersteller/Archiv

Der Wecker im Entwurfsmodus im Visual Studio Designer als Windows-Forms-Anwendung.

Als zweite Anwendung soll ein einfacher Wecker programmiert werden, über den Sie eine Weckzeit einstellen und die zeitgebundene Alarmierung auf Wunsch aktivieren. Der Wecker wird als Windows-Forms-Anwendung umgesetzt. Prinzipiell nutzen Sie den integrierten Designer von Visual Studio, um Formulare zu gestalten. Der Entwurf ist zwar unproblematisch, allerdings lassen sich nach Quelltexteingaben Formulare nicht mehr bearbeiten.

Daher sollte ein Design vollständig sein, ehe Quelltext zugewiesen wird. Dementsprechend sollten bereits im Entwurf alle Ereignisprozeduren angelegt sein. Standardereignisse legen Sie durch Anwahl per Doppelklick im Designer an. Für zusätzliche Ereignisse nutzen Sie die Symbolschaltfläche Ereignisse im Eigenschaftenfenster.

Steuerelemente sind zwar platzierbar, lösen aber nicht immer Ereignisse korrekt aus. Auch die Änderung der Eigenschaften wird nicht immer korrekt übernommen. Ob Steuerelemente wie gewünscht funktionieren, lässt sich häufig nur durch Tests ermitteln.

Der Wecker wurde entsprechend dieser Tests entworfen. Die Alarmzeit (Stunden/Minuten) wird über vorkonfigurierte Kombinationslistenfelder bestimmt. In die Zeitauswahl kann die aktuelle Zeit per Befehlsschaltfläche übernommen werden. Die einmalige Aktivierung der Weckfunktion erfolgt per Kontrollfeld.

Um die Aktivierung aufzuheben, braucht die Alarmzeit (Stunde oder Minute) lediglich geändert zu werden. Das Design steht alternativ als Beispiel mit zugewiesenem Quelltext auf der Heft-DVD bereit, so dass Sie mit dem Design oder dem Quelltext arbeiten können.

Das Projekt wird über den Typ Phalanger WinForms Application angelegt und erhält den Namen PhalangerWakeup zugewiesen. Neben den automatisch eingebundenen Verweisen für die Windows-Forms-Anwendungen wird auch hier der Verweis Microsoft.VisualBasic hinzugefügt, über den später eine Klangdatei abgespielt wird.

Die Anwendung wird über die Routine Main der Quelldatei Program.php ausgeführt, die für das Laden des Hauptformulars frmMain und zur Aktivierung der visuellen Stile verantwortlich ist. Alle Programmbestandteile sind dem Namespace PhalangerWakeop zugeordnet. Im Programm werden die Namespaces System und System:::Windows:::Forms mit entsprechenden import-namespace-Anweisungen importiert.

<?php import namespace System;
import namespace
System:::Windows:::Forms;
import namespace PhalangerWakeup;
class Program {
static function Main() {
Application::EnableVisualStyles();
Application::Run(new frmMain()); }}?>

In der Programmdatei frmMain.php ist das Formular für den Wecker samt zugeordnetem Quelltext definiert. Ein Großteil des Quelltextes wird durch den Formular-Designer generiert. Die Funktion InitializeComponent definiert dabei Objekte sowie deren Eigenschaften und Ereignisse. Der Konstruktor __construct() des Formulars frmMain ruft die Methode InitializeComponent auf. Das aktuelle Formular wird über den Bezeichner $this angesprochen (entspricht Me in VB). Variablen werden über das $-Präfix gekennzeichnet.

... private $cbMinute;
private $cbHour;
...
$this->cbMinute = new System:::Windows:
::Forms:::ComboBox();
$this->cbHour = new System:::Windows:::
Forms:::ComboBox();

Wie Sie ereignisorientierten Quelltext in einer Windows-Forms-Anwendung kodieren, wird hier exemplarisch an ausgewählten Ereignissen der Wecker-Anwendung gezeigt. Beim Laden des Formulars sorgt die Ereignisprozedur frmMain_Load für die Anzeige der aktuellen Zeit in den Kombinationslistenfeldern cbHour (Stunde) und cbMinute (Minute). Stunden und Minuten sind aufgrund der vordefinierten Items-Auflistungen der genannten Kombinationslistenfelder identisch mit den entsprechenden Index-Werten.

Die aktuelle Zeit wird zunächst über ein neu instanziiertes DateTime-Objekt und die untergeordnete, statische Now-Eigenschaft abgefragt. Die letztgenannte Eigenschaft liefert ihrerseits aktuelle Stunden- und Minutenwerte über die Eigenschaften Hour und Minute zurück. Diese Werte werden direkt an die SelectedIndex-Eigenschaften der jeweiligen Kombinationslistenfelder übernommen.

private function frmMain_
Load(System:::Object $sender, System:::EventArgs $e) {
$dt = new DateTime;
$dt = DateTime::$Now;
$h = $dt->Hour;
$m = $dt->Minute;
$this->cbHour->SelectedIndex = $h;
$this->cbMinute->SelectedIndex = $m; }

Wählen Sie im Programm die Schaltfläche Aktuelle Zeit übernehmen an, wird die Ereignisprozedur btnNow_Click ausgeführt, die entsprechend der Ereignisprozedur frmMain_Load aufgebaut ist.

Bei Anwahl des Kontrollfeldes Alarmzeit aktivieren wird über die Ereignisprozedur chkActive_CheckedChanged das verborgen platzierte Zeitgebersteuerelement TimerCtl über die Eigenschaft Enabled aktiviert und gleichzeitig das Kontrollfeld chkActive über die Eigenschaft Enabled deaktiviert. Eine direkte Deaktivierung des Zeitgebers wird von Phalanger nicht korrekt verarbeitet.

private function chkActive_
CheckedChanged(System:::Object $sender, System:::EventArgs $e) {
if ($this->chkActive->checked = true)
{ $this->TimerCtl->Enabled = true;
$this->chkActive->Enabled = false;} }

Die Weckfunktion ist an das Tick-Ereignis des Zeitgebersteuerelement TimerCtl gebunden. Das Tick-Ereignis wird im aktiven Modus alle zwei Sekunden aufgerufen. In der Ereignisprozedur wird über die Funktion Now des DateTime-Objektes $dt zunächst die aktuelle Zeit ermittelt (Stunde (Hour)/Minute (Minute)).

Die Weckzeit wird direkt über die Kombinationslistenfelder cbHour und cbMinute und deren SelectedIndex-Eigenschaften ausgelesen. Anschließend wird die Aktivierung der Weckfunktion über die Eigenschaft $this->TimerCtl->Enabled geprüft.

image.jpg

© Hersteller/Archiv

Der Wecker zur Laufzeit. Der Anwender aktiviert den Wecker mit einem Häkchen im Kontrollfeld.

Ist diese aktiv (true), so werden die Stunden und Minuten der aktuellen Zeit mit der Weckzeit verglichen. Stimmen sowohl die Stunden als auch die Minuten überein, wird der Alarm ausgelöst. Dazu wird die Klangdatei C:\Windows\Media\chimes.wav über ein neu instanziertes Audioobjekt sowie die zugehörige Methode Play wiederholt abgespielt.

Damit ist der Wecker bereit umgesetzt. Er kann in der Entwicklungsumgebung ausgeführt oder in eine Anwendung übersetzt werden. Phalanger zeigt sich bei der Entwicklung von Konsolenanwendungen und Klassenbibliotheken stabil. Windows-Forms-Anwendungen werden derzeit allerdings noch stiefmütterlich behandelt. Objekte und Ereignisse liefern hier mitunter nicht die von Visual Basic und C# bekannten Ergebnisse.

Phalanger eignet sich dazu, PHP-Funktionen in .Net per Klassenbibliothek bereitzustellen. Visuelle Front-Ends lassen sich derzeit einfacher mit VB oder C# umsetzen. Unproblematisch ist hingegen die Erzeugung von Konsolenanwendungen. Eine Unterstützung für WPF- und eine verbesserte Unterstützung für die Windows Forms wünscht man sich für die Nachfolgeversionen.

Mehr zum Thema

Amazon Blitzangebote
Technik-Deals

Die Highlights der Amazon Blitzangebote - heute unter anderem mit stark reduzierten PCs und Laptops, Gigaset ME Smartphone, Asus-Router und mehr.
Pokemon GO Beste Pokemon Arena Verteidigung
Liste

Welche sind die besten Pokémon, um eine Arena zu verteidigen? Wir haben die Tipps in diesem Pokémon GO Guide.
Shutterstock Teaserbild
Pokémon GO & Co.

Pokémon GO hat einen neuen Hype ausgelöst: Augmented Reality. Wir verraten, was möglich ist und wie die virtuellen Dinge in die wirkliche Welt…
Smartphone-Tuning (Symbolbild)
So geht's

Wer Admin über sein Android-Smartphone sein will, braucht Root-Rechte. Mit diesen Tipps und Tools rooten Sie Ihr Galaxy, Nexus & Co.
Pokémon GO Kumpel Liste
Übersicht & Tipps

Unsere Pokémon GO Kumpel-Liste zeigt für alle Monster, wie viele KM Sie mit Ihrem Pokémon-Buddy für eine Bonbon-Belohnung spazieren müssen.