• Dy1 (18.11.10 21:42) [0]
    пытаюсь написать свой TIPEditBox, помогите пожалуйста
    unit DyKOLutils7;
    interface
    uses Windows, Messages, KOL;

    type
     PIPEdit = ^TIPEdit;
     TIPEdit = object(TControl)
     private
       FIP: cardinal;
    //    FHandle: THandle;
    //    FFont: Integer;
       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

    { TIPEdit }
    constructor TIPEdit.Create(AParent: PControl; Rect: TRect);
    var
     hz: pointer;
    begin
    //  kol.InitCommonControls;
    //  kol.DoInitCommonControls(ICC_INTERNET_CLASSES);

     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);

    //  SendMessage( FHandle, WM_SETFONT, AParent.Font.Handle, 0);//
     //Text := '127.0.0.1';
    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{INADDR_NONE} 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{IPM_SETADDRESS}, 0, FIP);
    end;

    function NewIPEdit(AParent: PControl; Rect: TRect): PIPEdit;
    begin
     New(Result, Create(AParent, Rect));
    end;

    end.

  • Thaddy © (19.11.10 00:55) [1]
  • Dy1 (19.11.10 11:43) [2]
    Кладу компонент на пустую форму, запускаю - runtime error 216 at 00403AE4
  • Jon © (19.11.10 23:28) [3]
    You need to use the conditional define: USE_PROP
  • Dy1 (20.11.10 00:59) [4]
    работает очень криво, лучше никак, чем с таким компонентом.
    kolnmck 2.94, вроде бы.
  • Dy1 (20.11.10 02:11) [5]
    AV на CreateFont, строка 122
    http://www.dy.cdrrhq.ru/ipedit.zip
  • Dy1 (21.11.10 12:01) [6]
    как менять координаты созданного окна? Создаю так:

    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;

  • Dufa © (21.11.10 20:39) [7]
    Left, Top не?
  • Dy1 (22.11.10 00:25) [8]
    не. Куда-то вкось уводит. Работает только SetWindowPos и ничто иное. Не смог найти как получать координаты окна (чтобы работало).

    Пробовал просто создавать окно, при выходе уничтожать - иногда вылазили ошибки, вот что странно. А уж установка текста и особенно шрифта - бесполезно.
    Остаётся ждать, пока прогеры получше чем я исправят старый компонент :)

    А винду сносить не хочу, много прог ставить и настраивать.
  • Dufa © (22.11.10 11:49) [9]
    Компонент очень глючный действительно... Да и сам класс SysIPAddress32 уг..

    Если так хочется ипэдит, то лучше 4 обычных соедини =)


    > А винду сносить не хочу, много прог ставить и настраивать.

    а это зачем?
  • Vladimir Kladov © (22.11.10 18:42) [10]
    Зачем 4-то? В одном всяко удобнее вводить код (и контролировать ввод программно), да и copy/paste обеспечивается автоматом, только проверить при вставке, что не чушь ввели.
  • Dufa © (22.11.10 20:31) [11]
    Чтоб не контролировать ввод программно =)
  • Dy1 (22.11.10 21:15) [12]
    > Если так хочется ипэдит, то лучше 4 обычных соедини =)>
    так и сделал. SysIPAddress32 красивше :)

    > А винду сносить не хочу, много прог ставить и настраивать.
    > а это зачем?

    глючноватая она с прошлого года

    > Зачем 4-то? В одном всяко удобнее вводить код (и контролировать
    > ввод программно)

    точки будут "бегать"
  • Vidog © (06.12.10 00:48) [13]
    а edit с масками не подойдет?
  • Dy1 (06.12.10 07:12) [14]
    на кол не знаю такого
Есть новые Нет новых   [134430   +2][b:0][p:0.002]