Конференция "KOL" » Сообщение в форме Ballon [Delphi, Windows]
 
  • RusSun © (05.07.11 21:00) [0]
    Доброе время суток.
    Уважаемые форумчане:)

    Как можно реализовать сообщение как на рисунке.
    http://i037.radikal.ru/1107/e9/c2f21af80bdc.jpg
    когда строка больше четырех символов после запятой, то
    должно возникать сообщение такой формы на 2 секунды.

    пока я нашел только как вызвать для Tray:pTrayIcon;
    ShowBalloonHint(Form.Handle, DWORD(Tray), 'Лишний символ', 'Внимание', NIIF_INFO, 2);

  • RusSun © (08.07.11 16:09) [1]
    пока я нашел только как вызвать для Tray:pTrayIcon;

    program Project1;

    uses
     windows,messages,
     kol,ShellAPI;
    const
    NIF_INFO = $00000010;
    NIIF_NONE = $00000000;
    NIIF_INFO = $00000001;
    NIIF_WARNING = $00000002;
    NIIF_ERROR = $00000003;

    NOTIFYICONDATA_V2_SIZE = $1E8;

    type
    DUMMYUNIONNAME = record
    case Integer of
    0: (uTimeout: UINT);
    1: (uVersion: UINT);
    end;

    _NOTIFYICONDATAA_V2 = record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    // Расширение структуры для Shell32.dll версии пять
    szTip: array [0..MAXCHAR] of AnsiChar;
    dwState: DWORD;
    dwStateMask: DWORD;
    szInfo: array [0..MAXBYTE] of AnsiChar;
    UNIONNAME: DUMMYUNIONNAME;
    //uTimeout: UINT;
    szInfoTitle: array [0..63] of AnsiChar;
    dwInfoFlags: DWORD;
    // Расширение структуры для Shell32.dll версии шесть
    //guidItem: DWORD;
    end;

    {$R *.res}
    var
    form,Button1:PControl;
    Tray:pTrayIcon;

    // balloon hint for tray
    function ShowBalloonHint(const Handle, uID: DWORD; const Hint, Title: String; const Style, TimeOut: Byte): Boolean;
    var
    BalonNID: _NOTIFYICONDATAA_V2;
    begin
    ZeroMemory(@BalonNID, NOTIFYICONDATA_V2_SIZE);
    BalonNID.cbSize := NOTIFYICONDATA_V2_SIZE;
    BalonNID.Wnd := Handle;
    BalonNID.uID := uID;
    StrPCopy(BalonNID.szInfo, Hint);
    StrPCopy(BalonNID.szInfoTitle, Title);
    BalonNID.UNIONNAME.uTimeout := TimeOut * 1000;
    BalonNID.dwInfoFlags := Style;
    BalonNID.uFlags := NIF_INFO;
    Result := Shell_NotifyIcon(NIM_MODIFY, @BalonNID);
    end;
    //область для процедур
    procedure clickbutton1(Dummy: Pointer;Sender:PControl; var mouse:TMouseEventData);
    begin
    ShowBalloonHint(Form.Handle, DWORD(Tray), 'Text', 'Caption:', NIIF_NONE, 2);
    end;

    Begin
    Applet := NewApplet('');
    form:=NewForm(Applet,'шаблон').SetSize(300,200).setposition(330,300);

    //область для работы
    Button1:=NewButton(form,'Кнопка').SetSize(120,50);
    Button1.CenterOnParent;//размещаент объект по середине родительского.
    Button1.OnClick:=TonEvent(MakeMethod(nil,@clickbutton1));

    Tray := NewTrayIcon(form,form.Icon) ;
    Run(Applet);
    end.

  • QAZ (08.07.11 22:50) [2]
    это называется туллтип
  • RusSun © (30.07.11 14:00) [3]
    Уточняю это сообщение
    должно возникать к примеру над третей цифрой в  EditBox'ce
    помогая пользователю увидеть где нужно править и через 2 секунды
    сообщение должно исчезнуть.

    Туллтип возникает над контролом в том месте где сейчас курсор, если
    курсора нет то и сообщения тоже не будет.

    Вот для демонстрации пример http://zalil.ru/31486787
  • QAZ (01.08.11 11:06) [4]
    хоть уточняй ,хоть переуточняй :)
    это всеравно используеца тултип,какбы его не называли
    кури тему про TTM_TRACKACTIVATE,TTM_TRACKPOSITION
    и будет вылазить где захочеш и за мышкой бегать и тд и тп
    а то что у тебя в трее ,то сама винда за тебя уже сделала

    зы для кола как минимум 2 компонента-обертки есть и примеры
  • RusSun © (01.08.11 19:38) [5]
    Спасибо. Что доходчиво объяснили.)
  • RusSun © (01.08.11 19:41) [6]

    > 2 компонента-обертки есть и примеры

    Можно ссылку если не трудно.
  • QAZ (01.08.11 20:32) [7]
    kolmck.net/Components/HintRA.zip
    kolmck.net/Components/KOLMHToolTip.rar
    kolmck.net/Components/ApiToolTipsSimple.zip
    kolmck.net/Components/ApiToolTips.zip
  • Дмитрий К © (01.08.11 20:39) [8]
    web.archive.org/web/20061208140957/www.kolnmck.ru/files/components/formext/kolmdvtooltip.zip
  • RusSun © (17.08.11 19:59) [9]
    Получилось следующее У меня Windows XP SP3 и код без лекарства не работает.
    пробовал на трех компах один и тот же результат.)
    [URL=http://radikal.ru/F/s48.radikal.ru/i119/1108/58/8b6189603913.jpg.html][IMG]http://s48.radikal.ru/i119/1108/58/8b6189603913t.jpg[/IMG][/URL]

    Добавляем строки:

    var ... Tray:pTrayIcon;
    ...
    Tray := NewTrayIcon(W,W.Icon) ;//убираю трей туллтип пропадает;) мистика да и только



    [URL=http://radikal.ru/F/s004.radikal.ru/i207/1108/e0/cae138112ff3.jpg.html][IMG]http://s004.radikal.ru/i207/1108/e0/cae138112ff3t.jpg[/IMG][/URL]
  • RusSun © (17.08.11 20:05) [10]
  • RusSun © (17.08.11 20:08) [11]
    QAZ и Дмитрий К Спасибо за ссылки :)
  • Grademax (18.08.11 13:01) [12]
    Не знаю поможет ли, но попробуй воспользоваться функцией InitCommonControls;

    Пример использования:

    Program MiniForm;
    uses windows, KOL;
    var W:PControl;
    begin
        InitCommonControls;
        W := NewForm( Applet, 'MiniForm' ).SetClientSize( 400, 300 );
        Run( W );
    end.

  • RusSun © (18.08.11 17:09) [13]
    Сработало! ))
  • RusSun © (20.10.11 20:25) [14]
    Небольшой вопрос. У меня несколько Edit'в. Нужно чтобы
    сообщение позиционировалось относительно контрола в
    котором набирается текст
    В VCL

    Windows.GetClientRect(hWnd, ti.rect);
       SendMessage(hWndTip, TTM_ADDTOOL, 1, Integer(@ti));
       SendMessage(hWndTip, TTM_SETTITLE, Icon mod 4, Integer(Title));

       GetCaretPos(Mypos);
       SendMessage(hWndTip, TTM_TRACKPOSITION, 0, MakelParam(Control.ClientOrigin.X + Mypos.X ,Control.ClientOrigin.Y + Control.ClientHeight - Mypos.Y));
       SendMessage(hWndTip, TTM_TRACKACTIVATE, 1, Integer(@ti));


    Отвечает за это код. Kol его не знает. Какая нужна замена?
  • Дмитрий К © (21.10.11 21:11) [15]
     GetCaretPos(Mypos);
     Mypos := Edit.Client2Screen(Mypos);
     SendMessage(hWndTip, TTM_TRACKPOSITION, 0, MakelParam(Mypos.X, Mypos.Y));


    Как-то так.
  • RusSun © (22.10.11 15:18) [16]
    Вот уменьшенный вариант.
    program Project1;
    {$R StyleXP.res}
    uses
     windows,messages,
     kol;
    const
    TOOLTIPS_CLASS = 'tooltips_class32';

    TTS_BALLOON = $40;
    TTM_SETTITLE = (WM_USER + 32);

    WM_USER             = $0400;

    TTS_ALWAYSTIP           = $01;
    TTF_TRACK               = $0020;

    TTM_ACTIVATE            = WM_USER + 1;
    TTM_ADDTOOL             = WM_USER + 50;
    TTM_TRACKACTIVATE       = WM_USER + 17;
    TTM_TRACKPOSITION       = WM_USER + 18;
    {$R *.res}
    var
    form,Edit1,Edit2,Edit3:PControl;
    //для тултипа
    hTooltip: Cardinal;
    ti: TToolInfo; //Wnd:Hwnd;
    //область для процедур
    procedure CreateToolTips(hWnd: Cardinal;Sender: PObj;Icon: integer; Title: pchar; Text: WideString);
    var MyPos: TPoint;   //                                                          //;PosX, PosY:Integer
    begin
    If hToolTip > 0 then
        DestroyWindow(hToolTip);

     hToolTip := CreateWindowEx(0, 'Tooltips_Class32', nil, TTS_ALWAYSTIP or
       TTS_BALLOON,
       Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
       Integer(CW_USEDEFAULT), hWnd, 0, hInstance, nil);

      if hToolTip <> 0 then
     begin
       ti.cbSize := SizeOf(ti);
       ti.uFlags :=TTF_TRACK;  //TTF_SUBCLASS
       ti.hwnd := hWnd;
       ti.lpszText := PChar(Text); //PWideChar

       Windows.GetClientRect(hWnd, ti.rect);
       SendMessage(hToolTip, TTM_ADDTOOL, 1, LPARAM(@ti));
       SendMessage(hToolTip, TTM_SETTITLE, 1, LPARAM(Title));

      GetCaretPos(Mypos);
       Mypos := pcontrol(sender).Client2Screen(Mypos);
       SendMessage(hToolTip, TTM_TRACKPOSITION, 0, MakelParam(Mypos.X, Mypos.Y+10));
       SendMessage(hToolTip, TTM_TRACKACTIVATE, 1,LPARAM(@ti));

     end;

    end;
    procedure Editkey(Dummy: Pointer;Sender: PControl); //pcontrol(sender)
    begin        //не знаю почему но на один завышает
    if Length(sender.Text)>5 then begin
    CreateToolTips(Form.handle,pcontrol(sender),1, 'Внимание', 'Лишний символ');
    end else  DestroyWindow(hToolTip);
    end;
    Begin
    InitCommonControls;
    form:=NewForm(Applet,'Edit K').SetSize(300,200).setposition(330,300);
    //.centeronparent.Tabulate;
    //область для работы                                                      

    Edit1 := NewEditBox( form, [  ] ).SetPosition( 128, 32 );
    Edit1.Color := clWindow;
    Edit1.Text := '0.521';
    Edit1.TabOrder:=11;Edit1.Tabulate;
    Edit1.OnChange := TOnEvent( MakeMethod( nil, @Editkey));

    Edit2 := NewEditBox( form, [  ] ).SetPosition( 128, 64 );
    Edit2.Color := clWindow;
    Edit2.Text := '0.968';
    Edit2.TabOrder:=12;Edit2.Tabulate;
    Edit2.OnChange := TOnEvent( MakeMethod( nil, @Editkey));

    Edit3 := NewEditBox( form, [  ] ).SetPosition( 128, 96 );
    Edit3.Color := clWindow;
    Edit3.Text := '1.459';
    Edit3.TabOrder:=13;Edit3.Tabulate;
    Edit3.OnChange := TOnEvent( MakeMethod( nil, @Editkey));

    Run(form);
    end.


    Большое Спасибо :)
 
Конференция "KOL" » Сообщение в форме Ballon [Delphi, Windows]
Есть новые Нет новых   [119252   +34][b:0][p:0.004]