Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Edit für eine IP Adresse

  Alt 1. Feb 2009, 23:18
Du kannst das Win-API IP-Adresseingabfeld benutzen:
Delphi-Quellcode:
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat