procedure TForm1.FormCreate(Sender: TObject);
begin
// IP-Controll erstellen
hIP := CreateWindowEx(WS_EX_CLIENTEDGE,WC_IPADDRESS,
nil,
WS_VISIBLE
or WS_CHILD,80,51,125,21,
Panel1.Handle,IDC_IPCTRL,hInstance,
nil);
// So f.cking what?
if(hIp = 0)
then
begin
MessageBox(self.Handle,'
Fehler beim Erstellen des IP-Controls',
nil,0);
self.Close;
end;
// in die "WndProc" des Panels eingreifen
OldPanelProc := POINTER(SetWindowLong(Panel1.Handle,GWL_WNDPROC,
integer(@PanelWndProc)));
// aktuellen Font für das IP-Control nutzen
hFont := GetStockObject(DEFAULT_GUI_FONT);
if(hFont <> 0)
and (hIP <> 0)
then
SendMessage(hIP,WM_SETFONT,hFont,1);
// in den Edits für die Ports nur Ziffern zu lassen
// im Objektinspektor ist zusätzlich eine Begrenzung auf
// 5 Stellen aktiv!
SetWindowLong(edtStartPort.Handle, GWL_STYLE,
GetWindowLong(edtStartPort.Handle, GWL_STYLE)
or ES_NUMBER);
SetWindowLong(edtEndPort.Handle, GWL_STYLE,
GetWindowLong(edtEndPort.Handle, GWL_STYLE)
or ES_NUMBER);
end;
// -- Panel (Subclassing) ---------------------------------------------------------- //
// dient zum Aktivieren des Buttons "Scannen", wenn direkt eine
// IP-Adresse angegeben wird
var
OldPanelProc : POINTER;
function PanelWndProc(hPanel: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): dword;
stdcall;
var
dwIp : dword;
begin
Result := 0;
case uMsg
of
WM_COMMAND:
case HIWORD(wp)
of
// irgendein Edit wurde geändert
EN_CHANGE:
// es ist das IP-Control; na dann holen wir uns die IP
// doch mal
if(LOWORD(wp) = IDC_IPCTRL)
then
begin
SendMessage(hIp,IPM_GETADDRESS,0,LPARAM(@dwIp));
Form1.btnScan.Enabled := (dwIp <> 0);
end
// hm, interessiert uns nicht; soll sich Windows
// darum kümmern
else
Result := CallWindowProc(OldPanelProc,hPanel,uMsg,wp,lp);
// irgendeine andere Nachricht als EN_CHANGE?
// pöh! wozu gibt´s Windows?
else
Result := CallWindowProc(OldPanelProc,hPanel,uMsg,wp,lp);
end;
WM_NOTIFY:
if(PNMIpAddress(lp)^.hdr.Code = IPN_FIELDCHANGED)
then
begin
SendMessage(hIp,IPM_GETADDRESS,0,LPARAM(@dwIp));
Form1.btnScan.Enabled := (dwIp <> 0);
end;
else
Result := CallWindowProc(OldPanelProc,hPanel,uMsg,wp,lp);
end;
end;