Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.360 Beiträge
 
Delphi 12 Athens
 
#4

Re: Problem mit IP-Eingabefld

  Alt 1. Aug 2009, 12:53
OK, zum Teil liegt es an dem komischen Hook, welcher wohl ab (vermutlich) Delphi2006 oder so, nicht mehr richtig mitspielt ... hab den mal in seine Messages zerlegt.

Man müßte nur mal das OnClick überarbeiten ... wenn man da die Mausposition beachtet, dann könnte man versuchen das Feld unter dem Klick zu aktivieren und nicht immer nur das Erste.

benötigt:
TPanel: IPAddress
TButton: SetIP und ClearIP

Panel(IPAddress).TabStop = True
Panel(IPAddress).OnClick = IPAddressEnter
Panel(IPAddress).OnEnter = IPAddressEnter
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, Classes, Forms, Controls, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    IPAddress: TPanel;
    SetIP: TButton;
    ClearIP: TButton;
    procedure FormCreate(Sender: TObject);
    procedure IPAddressEnter(Sender: TObject);
    procedure SetIPClick(Sender: TObject);
    procedure ClearIPClick(Sender: TObject);
  private
    FIPAddress: Longint;
    HIPAddress: HWND;
    procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
    procedure WMCommand(var Message: TWMCommand); message WM_COMMAND;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  CommCtrl;

const
  IP_ADDRESS_ID: Longword = $0100;

procedure TForm1.FormCreate(Sender: TObject);
var
  lpInitCtrls: TInitCommonControlsEx;
begin
  lpInitCtrls.dwSize := SizeOf(TInitCommonControlsEx);
  lpInitCtrls.dwICC := ICC_INTERNET_CLASSES;
  if InitCommonControlsEx(lpInitCtrls) then
  begin
    HIPAddress := CreateWindowEx(WS_EX_LEFT, WC_IPADDRESS, nil,
      WS_CHILD or WS_VISIBLE or WS_BORDER or WS_TABSTOP,
      IPAddress.Left, IPAddress.Top, IPAddress.Width, IPAddress.Height,
      Handle, IP_ADDRESS_ID, HInstance, nil);
    SendMessage(HIPAddress, IPM_SETFOCUS, 0, 0);
  end;
end;

procedure TForm1.IPAddressEnter(Sender: TObject);
begin
  SendMessage(HIPAddress, IPM_SETFOCUS, wParam(0), 0);
end;

procedure TForm1.SetIPClick(Sender: TObject);
begin
  FIPAddress := MAKEIPADDRESS(127, 0, 0, 1);
  SendMessage(HIPAddress, IPM_SETADDRESS, 0, lParam(DWORD(FIPAddress)));
end;

procedure TForm1.ClearIPClick(Sender: TObject);
begin
  SendMessage(HIPAddress, IPM_CLEARADDRESS, 0, 0);
end;

procedure TForm1.WMNotify(var Message: TWMNotify);
var
  nField: longint;
begin
  if Message.NMHdr.idFrom = IP_ADDRESS_ID then
  begin
    case Message.NMHdr.code of
      IPN_FIELDCHANGED:
        begin
          if SendMessage(HIPAddress, IPM_ISBLANK, 0, 0) = 0 then
            SendMessage(HIPAddress, IPM_GETADDRESS, 0, lParam(LPDWORD(@FIPAddress)));
        end;
      else
        inherited;
    end;
  end
  else
    inherited;
end;

procedure TForm1.WMCommand(var Message: TWMCommand);
var
  nField: longint;
begin
  if Message.ItemID = IP_ADDRESS_ID then
  begin
    case Message.NotifyCode of
      EN_SETFOCUS:
        begin
          nField := SendMessage(HIPAddress, IPM_GETADDRESS, 0,
            lParam(LPDWORD(@FIPAddress)));
          if nField = 4 then nField := 0;
          SendMessage(HIPAddress, IPM_SETFOCUS, wParam(nField), 0);
        end;
      EN_KILLFOCUS:
        begin
          if SendMessage(HIPAddress, IPM_ISBLANK, 0, 0) = 0 then
            SendMessage(HIPAddress, IPM_GETADDRESS, 0, lParam(LPDWORD(@FIPAddress)));
        end;
      EN_CHANGE:
        begin
        end;
      else
        inherited;
    end;
  end
  else
    inherited;
end;

end.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat