Нормальный ввод 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;
Решил извинением типа у одной переменной, и добавлением дополнительного условия.