IP-Adressen eintragen und auslesen


Zum Eintragen einer IP-Adresse stehen uns die Nachricht IPM_SETADDRESS und die Funktion "MAKEIPADDRESS", zur Verfügung. Normalerweise handelt es sich bei einer IP-Adresse nämlich um einen 32-Bit-Wert, der aber (zur besseren Lesbarkeit) in vier Felder zu je 8 Bit aufgeteilt ist, die durch Punkte voneinander getrennt sind ("doted quad notation"). So entspricht z.B. der Wert 2130706433 (0x7f000001) der IP-Adresse "127.0.0.1". Und wenn man nicht umständlich den DWORD-Wert einer Adresse ausrechnen möchte, kann man die Hilfe von "MAKEIPADDRESS" direkt die einzelnen Bytes angeben:

if(hIpAddr <> 0) then
  SendMessage(hIpAddr,IPM_SETADDRESS,0,MAKEIPADDRESS(127,0,0,1));


Das Auslesen der aktuellen IP-Adresse aus dem Control führen wir mit Hilfe der Nachricht IPM_GETADDRESS durch, die als LPARAM-Wert einen Zeiger auf eine DWORD-Variable erwartet, was in unserem Beispiel so aussieht:

var
  curIp : dword;
{ ... }
SendMessage(hIpAddr,IPM_GETADDRESS,0,LPARAM(@curIp));


Damit wir in unseren Programmen ebenfalls die übliche Schreibweise benutzen können, enthält die Unit "CommCtrl.pas" vier Funktionen, mit denen wir die einzelnen Bytes aus unserer Variablen extrahieren können:

FIRST_IPADDRESS (LPARAM lParam)
SECOND_IPADDRESS(LPARAM lParam)
THIRD_IPADDRESS (LPARAM lParam)
FOURTH_IPADDRESS(LPARAM lParam)

Alle vier Funktionen haben gemeinsam, dass sie als Parameter den DWORD-Wert der IP-Adresse erwarten. Jede liefert dann allerdings ein anderes Byte der Adresse zurück. Würde man die Beispieladresse "127.0.0.1" z.B. von "FIRST_IPADDRESS" bearbeiten lassen, wäre das Ergebnis "127". Bei "SECOND_IPADDRESS" dagegen wäre das Ergebnis Null, usw.
Das Beispielprogramm nutzt alle vier Funktionen, um die IP-Adresse formatiert an ein Label weiterzugeben:

IpStr := Format('%d.%d.%d.%d',
  [FIRST_IPADDRESS(curIp),SECOND_IPADDRESS(curIp),
   THIRD_IPADDRESS(curIp),FOURTH_IPADDRESS(curIp)]);
SendMessage(hLabel,WM_SETTEXT,0,LPARAM(@IpStr[1]));


Das Eingabefeld leeren

Um das komplette IP-Eingabefeld zu leeren, verwenden wir die Nachricht "IPM_CLEARADDRESS", die keine besonderen Parameter erwartet:

SendMessage(hIpAddr,IPM_CLEARADDRESS,0,0);