Создание нового компонента на базе элементов управления из библиотеки ComCtl32
function TCustomlPEdit.IsBlank: boolean; begin Result: = SendMessage(Handle, IPM_ISBLANK, 0, 0) = 0; end; procedure TCustomlPEdit.SetCurrentField(Index: Integer); begin if (Index<0) or (Index>3) then Exit; FCurrentField: = Index; SendMessage(Handle, IPM_SETFOCUS, wParam(FCurrentField), 0); end; function TCustomlPEdit.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 TCustomlPEdit.IPStringToDword(s: string): DWORD; var i,j: Integer; NewAddr, Part: DWORD; begin NewAddr: = 0; try i: = 0; repeat j: = PosC. ', s); if j<=l then if i<3 then Abort else Part: = StrToInt(s) else Part: = StrToInt(Copy(s, I, 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 TCustomlPEdit.GetlPString: string; begin SendMessage(Handle,IPM_GETADDRESS, 0, longint(SFIPAddress)); Result: = IpDwordToString(FIPAddress); end; procedure TCustomlPEdit.SetlPString(Value: string); begin FIPAddress: = IPStringToDword(Value); SendMessage(Handle, IPM_SETADDRESS, 0, FIPAddress); end; procedure Register; begin RegisterComponents('Samples', [TIPEdit]); end; end.
Для удобства пользования полезно было бы добавить к компоненту CustomiPEdit задание диапазона для каждого из четырех составляющих и средства преобразования текстовой строки в двоичный адрес. Но это уже совсем другая история, к библиотеке ComQ132 отношения не имеющая.
Резюме
Элементы управления – поистине неисчерпаемая тема. Надеемся, что читатель воспримет данную главу как руководство к последующему углубленному анализу того или иного элемента в свете стоящих перед ним задач.
С элементами управления вам так или иначе придется сталкиваться во всех последующих главах.