-
Доброе время суток. Уважаемые форумчане:) Как можно реализовать сообщение как на рисунке. http://i037.radikal.ru/1107/e9/c2f21af80bdc.jpgкогда строка больше четырех символов после запятой, то должно возникать сообщение такой формы на 2 секунды. пока я нашел только как вызвать для Tray:pTrayIcon; ShowBalloonHint(Form.Handle, DWORD(Tray), 'Лишний символ', 'Внимание', NIIF_INFO, 2);
-
пока я нашел только как вызвать для 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;
szTip: array [0..MAXCHAR] of AnsiChar;
dwState: DWORD;
dwStateMask: DWORD;
szInfo: array [0..MAXBYTE] of AnsiChar;
UNIONNAME: DUMMYUNIONNAME;
szInfoTitle: array [0..63] of AnsiChar;
dwInfoFlags: DWORD;
end;
var
form,Button1:PControl;
Tray:pTrayIcon;
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.
-
это называется туллтип
-
Уточняю это сообщение должно возникать к примеру над третей цифрой в EditBox'ce помогая пользователю увидеть где нужно править и через 2 секунды сообщение должно исчезнуть. Туллтип возникает над контролом в том месте где сейчас курсор, если курсора нет то и сообщения тоже не будет. Вот для демонстрации пример http://zalil.ru/31486787
-
хоть уточняй ,хоть переуточняй :) это всеравно используеца тултип,какбы его не называли кури тему про TTM_TRACKACTIVATE,TTM_TRACKPOSITION и будет вылазить где захочеш и за мышкой бегать и тд и тп а то что у тебя в трее ,то сама винда за тебя уже сделала
зы для кола как минимум 2 компонента-обертки есть и примеры
-
Спасибо. Что доходчиво объяснили.)
-
> 2 компонента-обертки есть и примеры
Можно ссылку если не трудно.
-
kolmck.net/Components/HintRA.zip kolmck.net/Components/KOLMHToolTip.rar kolmck.net/Components/ApiToolTipsSimple.zip kolmck.net/Components/ApiToolTips.zip
-
web.archive.org/web/20061208140957/www.kolnmck.ru/files/components/formext/kolmdvtooltip.zip
-
-
-
QAZ и Дмитрий К Спасибо за ссылки :)
-
Не знаю поможет ли, но попробуй воспользоваться функцией InitCommonControls;Пример использования:
Program MiniForm;
uses windows, KOL;
var W:PControl;
begin
InitCommonControls;
W := NewForm( Applet, 'MiniForm' ).SetClientSize( 400, 300 );
Run( W );
end.
-
Сработало! ))
-
Небольшой вопрос. У меня несколько 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 его не знает. Какая нужна замена?
-
GetCaretPos(Mypos);
Mypos := Edit.Client2Screen(Mypos);
SendMessage(hWndTip, TTM_TRACKPOSITION, 0, MakelParam(Mypos.X, Mypos.Y)); Как-то так.
-
Вот уменьшенный вариант. program Project1;
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;
var
form,Edit1,Edit2,Edit3:PControl;
hTooltip: Cardinal;
ti: TToolInfo;
procedure CreateToolTips(hWnd: Cardinal;Sender: PObj;Icon: integer; Title: pchar; Text: WideString);
var MyPos: TPoint; 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; ti.hwnd := hWnd;
ti.lpszText := PChar(Text);
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); 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);
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. Большое Спасибо :)
|