-
пытаюсь написать свой TIPEditBox, помогите пожалуйста unit DyKOLutils7;
interface
uses Windows, Messages, KOL;
type
PIPEdit = ^TIPEdit;
TIPEdit = object(TControl)
private
FIP: cardinal;
function GetText: AnsiString;
procedure SetText(const Value: AnsiString);
public
constructor Create(AParent: PControl; Rect: TRect);
property Text: AnsiString read GetText write SetText;
end;
type
SunB = packed record
s_b1, s_b2, s_b3, s_b4: char;
end;
SunW = packed record
s_w1, s_w2: Word;
end;
PInAddr = ^TInAddr;
in_addr = record
case integer of
0: (S_un_b: SunB);
1: (S_un_w: SunW);
2: (S_addr: Longint);
end;
TInAddr = in_addr;
function inet_addr(s: PKOLChar): Integer; external 'wsock32.dll' name 'inet_addr';
function NewIPEdit(AParent: PControl; Rect: TRect): PIPEdit;
implementation
constructor TIPEdit.Create(AParent: PControl; Rect: TRect);
var
hz: pointer;
begin
FHandle := kol.CreateWindowEx( WS_EX_CLIENTEDGE, 'SysIPAddress32', nil, WS_CHILD or WS_CLIPCHILDREN
or WS_VISIBLE or WS_TABSTOP,
0,0,140,22, AParent.Handle, 0, hInstance, hz);
end;
function IPint2str(x: Cardinal): Ansistring;
begin
Result := Int2Str((x shr 24)and $FF) + '.' + Int2Str((x shr 16)and $FF) + '.' +
Int2Str((x shr 8)and $FF) + '.' + Int2Str(x and $FF);
end;
function MAKEIPADDRESS(b1, b2, b3, b4: Cardinal): LPARAM;
begin
Result := (b1 shl 24) or (b2 shl 16) or (b3 shl 8) or b4;
end;
function TIPEdit.GetText: AnsiString;
begin
SendMessage( FHandle, WM_USER+102, 0, integer(PCardinal(@FIP)));
Result := IPint2str(FIP);
end;
procedure TIPEdit.SetText(const Value: AnsiString);
var
Tmp: TInAddr;
begin
Tmp.S_addr := inet_addr( PAnsiChar(Value));
if Tmp.S_addr = -1 then Exit;
with Tmp.S_un_b do
FIP := MakeIPAddress( Cardinal(s_b1), Cardinal(s_b2), Cardinal(s_b3), Cardinal(s_b4));
SendMessage( FHandle, WM_USER+101, 0, FIP);
end;
function NewIPEdit(AParent: PControl; Rect: TRect): PIPEdit;
begin
New(Result, Create(AParent, Rect));
end;
end.
-
-
Кладу компонент на пустую форму, запускаю - runtime error 216 at 00403AE4
-
You need to use the conditional define: USE_PROP
-
работает очень криво, лучше никак, чем с таким компонентом. kolnmck 2.94, вроде бы.
-
-
как менять координаты созданного окна? Создаю так:
type
PIPEdit = ^TIPEdit;
TIPEdit = object(TControl)
private
FIP: Integer;
public
destructor Destroy; virtual;
end;
...
function NewIPEdit(AParent: PControl; Left, Top, Width, Height: Longint): PIPEdit;
begin
New(Result, Create);
Result.FHandle := CreateWindow( WC_IPADDRESS, nil, WS_CHILD or WS_VISIBLE, Left, Top, Width, Height, AParent.Handle, 0, hInstance, nil);
end;
-
Left, Top не?
-
не. Куда-то вкось уводит. Работает только SetWindowPos и ничто иное. Не смог найти как получать координаты окна (чтобы работало).
Пробовал просто создавать окно, при выходе уничтожать - иногда вылазили ошибки, вот что странно. А уж установка текста и особенно шрифта - бесполезно. Остаётся ждать, пока прогеры получше чем я исправят старый компонент :)
А винду сносить не хочу, много прог ставить и настраивать.
-
Компонент очень глючный действительно... Да и сам класс SysIPAddress32 уг..
Если так хочется ипэдит, то лучше 4 обычных соедини =)
> А винду сносить не хочу, много прог ставить и настраивать.
а это зачем?
-
Зачем 4-то? В одном всяко удобнее вводить код (и контролировать ввод программно), да и copy/paste обеспечивается автоматом, только проверить при вставке, что не чушь ввели.
-
Чтоб не контролировать ввод программно =)
-
> Если так хочется ипэдит, то лучше 4 обычных соедини =)> так и сделал. SysIPAddress32 красивше :)
> А винду сносить не хочу, много прог ставить и настраивать. > а это зачем? глючноватая она с прошлого года
> Зачем 4-то? В одном всяко удобнее вводить код (и контролировать > ввод программно) точки будут "бегать"
-
а edit с масками не подойдет?
-
на кол не знаю такого
|