Поле для ввода IP-адресаDelphi , Компоненты и Классы , Создание компонентПоле для ввода IP-адресаunit uIPEdit; interface uses Windows, Messages, SysUtils, Classes, Controls; type TCustomIPEdit = class(TWinControl) private { Private declarations } FIPAddress: DWORD; FIPLimits: array[0..3] of word; FCurrentField: Integer; //procedure CMWantSpecialKey(var Msg: TCMWantSpecialKey); message CM_WANTSPECIALKEY; procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; //procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY; protected { Protected declarations } function GetIP(Index: Integer): Byte; procedure SetIP(Index: Integer; Value: Byte); function GetMinIP(Index: Integer): Byte; procedure SetMinIP(Index: Integer; Value: Byte); function GetMaxIP(Index: Integer): Byte; procedure SetMaxIP(Index: Integer; Value: Byte); function GetIPString: string; procedure SetIPString(Value: string); function IsBlank: boolean; procedure SetCurrentField(Index: Integer); // procedure CreateParams(var Params: TCreateParams); override; procedure CreateWnd; override; //procedure KeyDown(var Key: Word; Shift: TShiftState);override; function IPDwordToString(dw: DWORD): string; function IPStringToDword(s: string): DWORD; public { Public declarations } constructor Create(AOwner: TComponent); override; property IP[Index: Integer]: byte read GetIP write SetIP; property MinIP[Index: Integer]: byte read GetMinIP write SetMinIP; property MaxIP[Index: Integer]: byte read GetMaxIP write SetMaxIP; property IPString: string read GetIPString write SetIPString; property CurrentField: Integer read FCurrentField write SetCurrentField; procedure Clear; end; TIPEdit = class(TCustomIPEdit) published property Align; property Anchors; property BorderWidth; property DragCursor; property DragKind; property DragMode; property Enabled; property Font; property Hint; property Constraints; property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; property TabStop; property Visible; property OnContextPopup; property OnDragDrop; property OnDragOver; property OnEndDock; property OnEndDrag; property OnEnter; property OnExit; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnStartDock; property OnStartDrag; { Published declarations } property IPString; end; procedure Register; implementation uses Graphics, commctrl, comctrls; constructor TCustomIPEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FIPAddress := 0; ControlStyle := [csCaptureMouse, csClickEvents, csDoubleClicks, csOpaque]; Color := clBtnFace; Width := 160; Height := 25; Align := alNone; TabStop := True; end; procedure TCustomIPEdit.CreateParams(var Params: TCreateParams); begin InitCommonControl(ICC_INTERNET_CLASSES); inherited CreateParams(Params); CreateSubClass(Params, WC_IPADDRESS); with Params do begin Style := WS_VISIBLE or WS_BORDER or WS_CHILD; if NewStyleControls and Ctl3D then begin Style := Style and not WS_BORDER; ExStyle := ExStyle or WS_EX_CLIENTEDGE; end; end; end; procedure TCustomIPEdit.CreateWnd; var i: Integer; begin inherited CreateWnd; Clear; { for i := 0 to 3 do begin MinIP[i] := 0; MaxIP[i] := $FF; end;} CurrentField := 0; end; procedure TCustomIPEdit.WMGetDlgCode(var Message: TWMGetDlgCode); begin inherited; Message.Result := {Message.Result or} DLGC_WANTTAB; end; procedure TCustomIPEdit.CNNotify(var Message: TWMNotify); begin with Message.NMHdr^ do begin case Code of IPN_FIELDCHANGED: begin FCurrentField := PNMIPAddress(Message.NMHdr)^.iField; {if Assigned(OnIpFieldChange) then with PNMIPAdress(Message.NMHdr)^ do begin OnIPFieldChange(Self, iField, iValue);} end; end; end; end; {procedure TCustomIPEdit.KeyDown(var Key: Word; Shift: TShiftState); begin inherited KeyDown( Key, Shift ); if Key = VK_TAB then if ssShift in Shift then CurrentField := (CurrentField - 1 + 4) mod 4 else CurrentField := (CurrentField + 1) mod 4; end;} {procedure TCustomIPEdit.CMWantSpecialKey(var Msg: TCMWantSpecialKey); begin inherited; //Msg.Result := Ord(Char(Msg.CharCode) = #9); end;} procedure TCustomIPEdit.CMDialogChar(var Message: TCMDialogChar); begin with Message do if CharCode = VK_TAB then begin Message.Result := 0; if GetKeyState(VK_SHIFT) <> 0 then begin if (CurrentField = 0) then Exit; CurrentField := CurrentField - 1; end else begin if (CurrentField = 3) then Exit; CurrentField := CurrentField + 1; end; Message.Result := 1; end //VK_TAB else inherited; end; {procedure TCustomIPEdit.CMDialogKey(var Message: TCMDialogKey); begin if (Focused or Windows.IsChild(Handle, Windows.GetFocus)) and (Message.CharCode = VK_TAB) and (GetKeyState(VK_CONTROL) < 0) then begin if GetKeyState(VK_SHIFT)<>0 then CurrentField := (CurrentField - 1 + 4) mod 4 else CurrentField := (CurrentField + 1) mod 4; Message.Result := 1; end else inherited; end;} function TCustomIPEdit.GetIP(Index: Integer): Byte; begin SendMessage(Handle, IPM_GETADDRESS, 0, longint(@FipAddress)); case Index of 1: Result := FIRST_IPADDRESS(FipAddress); 2: Result := SECOND_IPADDRESS(FipAddress); 3: Result := THIRD_IPADDRESS(FipAddress); 4: Result := FOURTH_IPADDRESS(FipAddress); else Result := 0; end; end; procedure TCustomIPEdit.SetIP(Index: Integer; Value: Byte); begin case Index of 1: FIPAddress := FIPAddress and $FFFFFF or DWORD(Value) shl 24; 2: FIPAddress := FIPAddress and $FF00FFFF or DWORD(Value) shl 16; 3: FIPAddress := FIPAddress and $FFFF00FF or DWORD(Value) shl 8; 4: FIPAddress := FIPAddress and $FFFFFF00 or DWORD(Value); else Exit; end; SendMessage(Handle, IPM_SETADDRESS, 0, FIPAddress); end; function TCustomIPEdit.GetMinIP(Index: Integer): Byte; begin if (Index < 0) or (Index > 3) then Result := 0 else Result := LoByte(FIPLimits[Index]); end; procedure TCustomIPEdit.SetMinIP(Index: Integer; Value: Byte); begin if (Index < 0) or (Index > 3) then Exit; FIPLimits[Index] := MAKEIPRANGE(HiByte(FIPLimits[Index]), Value); SendMessage(Handle, IPM_SETRANGE, Index, FIPLimits[Index]); end; function TCustomIPEdit.GetMaxIP(Index: Integer): Byte; begin if (Index < 0) or (Index > 3) then Result := 0 else Result := HiByte(FIPLimits[Index]); end; procedure TCustomIPEdit.SetMaxIP(Index: Integer; Value: Byte); begin if (Index < 0) or (Index > 3) then Exit; FIPLimits[Index] := MAKEIPRANGE(Value, LoByte(FIPLimits[Index])); SendMessage(Handle, IPM_SETRANGE, Index, FIPLimits[Index]); end; procedure TCustomIPEdit.Clear; begin SendMessage(Handle, IPM_CLEARADDRESS, 0, 0); end; function TCustomIPEdit.IsBlank: boolean; begin Result := SendMessage(Handle, IPM_ISBLANK, 0, 0) = 0; end; procedure TCustomIPEdit.SetCurrentField(Index: Integer); begin if (Index < 0) or (Index > 3) then Exit; FCurrentField := Index; SendMessage(Handle, IPM_SETFOCUS, wParam(FCurrentField), 0); end; function TCustomIPEdit.IPDwordToString(dw: DWORD): string; begin Result := Format('%d.%d.%d.%d', [FIRST_IPADDRESS(dw), SECOND_IPADDRESS(dw), THIRD_IPADDRESS(dw), FOURTH_IPADDRESS(dw)]); end; function TCustomIPEdit.IPStringToDword(s: string): DWORD; var i, j: Integer; NewAddr, Part: DWORD; begin NewAddr := 0; try i := 0; repeat j := Pos('.', s); if j <= 1 then if i < 3 then Abort else Part := StrToInt(s) else Part := StrToInt(Copy(s, 1, j - 1)); if Part > 255 then Abort; Delete(s, 1, j); NewAddr := (NewAddr shl 8) or Part; Inc(i); until i > 3; Result := NewAddr; //Windows.MessageBox( 0, pChar(IntToHex(FIPAddress, 8 )), '', MB_Ok ); except end; end; function TCustomIPEdit.GetIPString: string; begin SendMessage(Handle, IPM_GETADDRESS, 0, longint(@FIPAddress)); Result := IpDwordToString(FIPAddress); end; procedure TCustomIPEdit.SetIPString(Value: string); begin FIPAddress := IPStringToDword(Value); SendMessage(Handle, IPM_SETADDRESS, 0, FIPAddress); end; procedure Register; begin RegisterComponents('Samples', [TIPEdit]); end; end. Привет! Я перевёл текст на русский язык: Это код Delphi Pascal для компонента редактирования IP-адреса, который позволяет ввести и отображать IP-адрес в формате Вот разбивка кода:
В целом, этот код обеспечивает компонент редактирования IP-адреса с различными методами для получения и установки IP-адресов, а также возможностями проверки и форматирования. Поле для ввода IP-адреса: компонент для редактирования и ввода адресов в интернете. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Создание компонент ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |