Ищу компонент VCL средства выбора адресов FOSS IPv4 - PullRequest
2 голосов
/ 09 марта 2012

Строго для использования в зарезервированных диапазонах адресов, поэтому IPv4 достаточно хорош.Я пока не знаю, буду ли я использовать класс A, B или C (возможно, C, но ...), поэтому было бы неплохо иметь возможность справиться со всеми.

И дополнительный бонус, если я смогутакже введите что-то вроде "localhost", хотя я могу жить без этого.

Итак, минимальное требование - указать 192.xxx.xxx.xxx и убедиться, что xxx не превышает 255.

Конечно, я мог бы подправить один из них несколькими правками маски, но наверняка кто-то изобрел это конкретное (FOSS) колесо раньше?


Примечание для себя: если вам нужно его кодировать, эта страница выглядит полезной

Ответы [ 2 ]

5 голосов
/ 09 марта 2012

Windows имеет встроенный элемент управления IP-адресами . Вы можете обернуть это в пользовательский компонент-потомок TWinControl для легкого доступа и повторного использования, например:

type
  TIPAddressFieldChange = procedure(Sender: TObject; Field: Integer; Value: Integer) of object;

  TIPAddress = class(TWinControl)
  private
    FOnFieldChange: TIPAddressFieldChange;
    function GetIP: String; 
    function GetIsEmpty: Boolean; 
    procedure SetIP(const Value: String);    
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
    procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE; 
    procedure WMSetFont(var Message: TWMSetFont); message WM_SETFONT;
  public
    constructor Create(Owner: TComponent); override; 
    procedure Clear;
    property IP: String read GetIP write SetIP; 
    property IsEmpty: Boolean read GetIsEmpty; 
  published:
    property OnFieldChange: TIPAddressFieldChange read FOnFieldChange write FOnFieldChange;
  end; 

.

uses
  Commctrl;

constructor TIPAddress.Create(Owner: TComponent);
begin
  inherited;
  InitCommonControl(ICC_INTERNET_CLASSES}; 
end;

procedure TIPAddress.CreateParams(var Params: TCreateParams);
begin
  inherited;
  CreateSubClass(Params, WC_IPADDRESS); 
  Params.Style := WS_CHILD or WS_TABSTOP or WS_VISIBLE; 
  if NewStyleControls and Ctl3D then
  begin 
    Params.Style := Params.Style and not WS_BORDER; 
    Params.ExStyle := Params.ExStyle or WS_EX_CLIENTEDGE; 
  end;
  Params.WindowClass.style := Params.WindowClass.style and not (CS_HREDRAW or CS_VREDRAW); 
end;

procedure TIPAddress.Clear;
begin
  Perform(IPM_CLEARADDRESS, 0, 0);
end;

function TIPAddress.GetIP: String;
var
  dwIp: DWORD; 
begin
  dwIp := 0; 
  Perform(IPM_GETADDRESS, 0, LPARAM(@dwIp)); 
  Result := Format('%d.%d.%d.%d', [FIRST_IPADDRESS(dwIp), SECOND_IPADDRESS(dwIp), 
THIRD_IPADDRESS(dwIp), FOURTH_IPADDRESS(dwIp)]); 
end;

function TIPAddress.GetIsEmpty: Boolean;
begin
  Result := Perform(IPM_ISBLANK, 0, 0) <> 0; 
end;

procedure TIPAddress.SetIP(const Value: String);
var
  dwIP: LPARAM;
begin
  with TStringList.Create do try
    Delimiter := '.';
    StrictDelimiter := True;
    DelimitedText := Value;
    Assert(Count = 4);
    dwIP := MAKEIPADDRESS(StrToInt(Strings[0]), StrToInt(Strings[1]), StrToInt(Strings[2]), StrToInt(Strings[3]));
  finally
    Free;
  end;
  Perform(IPM_SETADDRESS, 0, dwIP);
end;

procedure TIPAddress.CNNotify(var Message: TWMNotify);
begin
  inherited;
  if (Message.NMHdr^.code = IPN_FIELDCHANGED) and Assigned(FOnFieldChange) then
  begin
    with PNMIPAddress(Message.NMHdr)^ do
      FOnFieldChange(Self, iField, iValue);
  end;
end;

procedure TIPAddress.WMGetDlgCode(var Message: TMessage);
begin
  inherited; 
  Message.Result := Message.Result or DLGC_WANTARROWS; 
end;

procedure TIPAddress.WMSetFont(var Message: TWMSetFont); 
var 
  LF: LOGFONT; 
begin 
  if GetObject(Message.Font, SizeOf(LF), @LF) <> 0 then
  begin 
    Message.Font := CreateFontIndirect(LF); 
    inherited; 
  end; 
end; 
3 голосов
/ 09 марта 2012

Как насчет попробовать TJvIPAddress из JEDI Visual Component Library?Он имеет автоматическую коррекцию значений диапазона и выводится из стандартного поля редактирования Windows IP.

...