Welcome to the new Friends-of-FPC!

Here you can find all kinds of information about the FreePascal Compiler. We have many tutorials and howtos as well as a selection of tools to help you with your programming. We also have some example codes for you. And if you want to contribute some information/ sources/ tools yourself you can do so.
Also we have finally relaunched the FoFPC forum. It's your chance for some Q&A about everything FreePascal.

Friends-of-FPC

Tutorials: Learn how to code with FreePascal.

Source Codes: A collection of examples, miscellaneous source codes and open source stuff.

Tools and Help Files: Intro- duction of some tools that might help you with FPC.

Community

Forum: Ask or answer questions about the FreePascal Compiler, programming or just babble about coding.

Contribute! Contribute your own Tutorial, Source Codes or Tools and send them to us!

Website

About: Information about Friends-of-FPC.org.

Win32 Programmierung mit FPC - Teil 2 - by Delax

Andre LaMothe sagte einmal "In Windows zu programmieren ist wie zum Zahnarzt zu gehen: Man weiß das es gut für einen ist, aber niemand mag es." Ich für meinen Teil habe Windows-Programmierung lange Zeit höflich vermieden. Als es dann doch Zeit war verbrachte ich 3 Wochen in der Hölle, aber inzwischen mag ich es sogar. Kein Witz!

Grundsätzlich unterschiedet sich ein Windows-Programm nur in wenigen Bereichen von einem DOS-Programm. Legendlich durch die Art wie Windows funktioniert ergeben sich die Unterschiede. Und natürlich dadurch das Windows selbst unzähliche Funktionen bereitstellt, die man in DOS selbst programmieren müsste.

Wenn wir heute von Windows reden, meinen wir eine Version von Win32, also Win95, 98, NT4, 2000 oder XP. Diese sind Multitasking und Multithreading fähig. Das bedeutet: mehrere Programme können gleichzeitig ausgeführt werden und diese Programme können aus mehreren Unterprogrammen und Aufgaben bestehen, die ebenfalls gleichzeitig ausgeführt werden. So - und jetzt zur Realität.

Windows hat im Kern den sogenannten Scheduler. Dieser macht nichts anderes, als jedem Programm welches gerade startet eine Prozessnummer zuzuweisen. Aus der Sicht von Windows ist jedes Programm ein Prozess. Jene Prozessnummern werden nun in eine Prozessliste eingetragen. Unter NT kann man sich diese Prozessliste bequem anzeigen lassen: STRG, ALT, ENTF und dann "Task Manager" und "Prozessliste". Der Scheduler ruft die Prozesse in der Prozessliste nacheinander für Sekundenbruchteile auf. Gleichzeitig läuft da also gar nichts, nur so schnell das man den Eindruck hat.

Und hier liegt auch schon ein Vierbeiner begraben, denn die Entscheidung wie lange welcher Prozess läuft liegt bei Windows. Windows kann und wird (!) euch gnadenlos den Teppich unter eurer Applikation weg ziehen, wenn es mal gerade Lust darauf hat. Der User hat kaum einen Einfluß darauf, da nützt auch das erhöhen der Priorität eurer Programme wenig.

Windows ist "event driven". Das bedeutet das Windows alles erst einmal als Ereignis (event) sieht, welches es dann als Nachricht (message) weiter verarbeitet. Allerdings sieht es so aus, das Windows die Nachrichten an euer Programm weiter leitet und ihr dann etwas mit diesen Nachrichten anfangen müsst. Ein Event kann z.B. ein Tastendruck des Nutzers sein aber auch die Aktivierung des Bildschirmschoners. Das ist wichtig zu verstehen, denn im Grunde ist es genau das, worauf eure Applikation reagieren muß: auf Ereignisse des Benutzers.

Wenn Windows Nachrichten an unser Programm weiter gibt brauchen wir eine Art Schnittstelle um diese Nachrichten zu verarbeiten. Dazu aber später noch mehr als euch lieb ist. Merkt euch im Moment einfach nur: damit Windows mit eurem Programm kommunizieren kann (und umgekehrt) gibt es eine Art Kanal, auf dem man Nachrichten senden und empfangen kann.

Sehen wir uns erst einmal ein simples Windows-Programm an.

{$APPTYPE GUI}
program WinHello;

uses
  Windows;

begin
    MessageBox(0, 'Hello World', 'Hi there!', mb_Ok);
end.

Hier als Datei zum download.

Das Programm gibt einfach nur ein Nachrichtenfenster aus. Kompiliert es mal und schaut es euch an. Um es zu kompilieren müsst ihr allerdings dem Compiler mitteilen, das es sich um ein Windows Programm handelt. Das macht ihr mit dem Parameter "-TWin32". Wer nach dem "FPC für Einsteiger Tutorial" den EditPlus Editor verwendet wird vor dem kompilieren nach den Parametern gefragt - von der Kommandozeile aus könnt ihr das Programm mit "ppc386.exe source1.pp -TWin32" kompilieren. Doch jetzt zur Obduktion ;)

{$APPTYPE GUI} - APPTYPE zeigt an, um welche Art Programm es sich handelt. Hier ein Windows Programm innerhalb der Windows Oberfläche (Gegenteil: Konsolen-Applikationen für Windows). Wenn man diese Zeile weglässt würde als Unterbau für das Programm erst einmal eine Konsole erscheinen.

MessageBox(0, 'Hello World', 'Hi there!', mb_Ok);

Hierzu ist etwas mehr Erklärung nötig. MessageBox gibt eine Nachrichtenbox aus. Die Parameter dahinter bestimmen Aussehen und Verhalten der Box. Im Windows Guide steht folgendes über die Standard Windows MessageBox:

MessageBox(hwnd, lptext, lpcaption, utype);

Gehen wir einmal die Parameter durch:

hwnd - In unserem Falle NULL. Es ist das Handle der Box und enthält, an welche Applikation die Box gebunden ist. Indem wir NULL setzen ist der Desktop das übergeordnete Fenster. Mehr dazu später.

lptext - Das ist der Text den ihr ausgeben wollt - in unserem Falle "Hello World!".

lpcaption - Der Titel unseres Fenster "Hi there!". Beachtet aber das diese Texte NICHT vom Typ String sind, sondern vom Typ PChar. Das hängt mit der Wurzel C zusammen, in der dieser typ eher verbreitet ist.

utype - Das ist der einzig aufregende Parameter. Hier könnt ihr festlegen welche Buttons (OK, Cancel, Retry, ...) euer Fenster haben soll und welche Icons (Ausrufezeichen, ...) angezeigt werden sollen. Es gibt eine Menge Parameter, die hier angegeben werden können. Alle hier zu zeigen würde den Rahmen sprengen (und ist auch nicht Sinn der Sache). Schnappt euch die Windows SDK Help und schlagt nach, was alles möglich ist.

Diese MessageBox ist eine der angesprochenen Funktionen, die Windows bereitstellt. Ob es nun Dialoge für Dateioperationen sind oder Nachrichten und Kommunikation zu anderen Programmen, Windows bietet eine Lösung an. Tatsächlich muß man sich eigentlich nur um das Aussehen und das Verhalten seines Programmes kümmern, den Rest erledigt Windows für uns. Und das ist auch gut so, denn es bedeutet das ein Dialog Datei/ Öffnen in Programm A genauso aussieht wie in Programm B.

Diese Funktionen von Windows sind in der Tat alle Functions mit Rückgabewert. Das liegt daran das Windows eben auf C++ beruht, was keine Prozedures in dem Sinne kennt. In Pascal heißt das aber nicht viel, denn wir können hier auch Functions wie Procedures behandeln und den Rückgabewert ignorieren.

Gut, ich gebe es zu: das obere Programm ist kein echtes Windows Programm. Es ist einfach nur eine Spielerei, damit ihr Fuß fassen könnt. Um richtige Windowsprogramme zu erstellen benötigt man einiges an Grundwissen. Das folgt jetzt in den nächsten Teilen.

Delax/ Sundancer Inc.
[delax@sundancerinc.de]

Back to previous page

Useful Links









Link to us