VK
Vasiya Kurganov

Нормальный ввод ip адреса. В чем проблемма? Delphi

Вообщем создаем, скажим так, edit для нормально ввода ip. Происходит переполнение, может с типами где то накосячил=) Гляньте мож заметите. Delphi EX2.

Описываю:
type
TIPEdit = class
private
FHandle: THandle;
FIP: Cardinal;
FFont: Cardinal;
function GetText: string;
procedure SetText(const Value: string);
public
constructor Create(AOwner: TWinControl; Rect: TRect); // Создаем
destructor Destroy; override; // Убиваем
property Text: string read GetText write SetText; // для отображения текста в едите
end;

Создаю:
constructor TIPEdit.Create(AOwner: TWinControl; Rect: TRect);
begin
// Инициализируем дополнительные классы библиотеки ComCtl32.dll.
InitCommonControl(ICC_INTERNET_CLASSES);

// Создадим само окошко (предком ему будет gbIP)
FHandle:= CreateWindow(WC_IPADDRESS, nil, WS_CHILD or WS_VISIBLE,
Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, AOwner.Handle, 0, hInstance, nil);

//Подберем нужный шрифтик для него.. .
FFont := CreateFont(-11, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');

//Указываем на шрифты
SendMessage(FHandle, WM_SETFONT, FFont, 0);

//Выводим первоначальный текст
Text := '0.0.0.0';
end;

procedure TIpPing.FormCreate(Sender: TObject);
begin
IPFrom := TIPEdit.Create(gbAddrRange, Rect(32, 16, 121, 21));
IPFrom.Text:='200.133.112.123'; /////////////При попытке программно указать ip, определенных чисел происходит переполнение;

end;

Ну и обрабатываем ip:
function TIPEdit.GetText: string; //преобразуем в нормальный вид (123.13.34.5)
begin
SendMessage(FHandle, IPM_GETADDRESS, 0, Longint(PDWORD(@FIP)));
Result := IntToStr(FIRST_IPADDRESS(FIP))+
'.' + IntToStr(SECOND_IPADDRESS(FIP)) +
'.' + IntToStr(THIRD_IPADDRESS(FIP)) +
'.' + IntToStr(FOURTH_IPADDRESS(FIP));
end;

procedure TIPEdit.SetText(const Value: string);

function MakeIPAddressEx(b1, b2, b3, b4: AnsiChar):LPARAM;
begin
// запихиваем ip в созданный едит
Result := MAKEIPADDRESS(DWORD(b1), DWORD(b2), DWORD(b3), DWORD(b4));
end;

//Заполняем MAKEIPADDRESS
var
Tmp: TInAddr;
begin
//используем виндозовскую функцию inet_addr для разделения адреса как нужно
Tmp.S_addr := inet_addr(PAnsiChar(AnsiString(Value)));

//Проверяем, что б ничего лишнего не вылезло
if Tmp.S_addr = INADDR_NONE then Exit;

//Ну и разделяем
with Tmp.S_un_b do
FIP := MakeIPAddressEx(Ansichar(s_b1), Ansichar(s_b2), Ansichar(s_b3), Ansichar(s_b4));

// Указываем какой IP показывать
SendMessage(FHandle, IPM_SETADDRESS, 0, FIP);
end;

Решил извинением типа у одной переменной, и добавлением дополнительного условия.

Венера Палашкина
Венера Палашкина

Класс окна для IP - "SysIPAddress32"
Сообщение для получения IP - IPM_GETADDRESS message
Сообщение для установки IP - IPM_SETADDRESS message

Похожие вопросы
как вычисляют ip адрес ?
delphi как узнать свой ip
определение ip адреса в php
IP. Можно ли уничтожить IP адрес?
Можно ли узнать адрес через ip?
куда надо вводить постоянный IP адрес
как в delphi получить ip адрес в глобальной сети и вывести его, допустим, в label
Что означают цифры в IP адресе?
Как зарезервировать ip-адрес?
Можно изменить свой IP адрес компьютера, на другой конкретный IP адрес (известный мне).