-
Буду признателен за любую информацию по САБЖу. Может существуют готовые компоненты? Или хотя-бы найти теорию реализации
-
вообще это уже будет не подсказка, т.к. на нее для копирования нужно перейти, мышкой/клавишами выделить, окно должно "держатся", а не как у обычной подсказки закрываться/меняться по контексту... неудобно. проще определить в программе сочетание клавиш по которому и заносить в буфер подсказку с элемента "под мышкой", ну или тупо последнюю показанную, что проще в реализации, удобнее и не требует специальных компонент.
-
-
Вот только проблемы, указанные в [1] всё одно объезжать придётся, с болью Хотя в плане логичности пользовательского использования - проблем не вижу, идея интересная
-
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, clipbrd;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
type TMyHint = class(THintWindow) private public procedure Show(text: string); procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; procedure WMLBTNDOWN(var Message: TMessage); message WM_LBUTTONDOWN; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var HintWindow: TMyHint; begin HintWindow := TMyHint.Create(Self); HintWindow.Show('long text'); end;
{ TMyHint }
//говорим окну что-бы сам обрабатывал сообщения procedure TMyHint.WMNCHitTest(var Message: TWMNCHitTest); begin Message.Result := HTCLIENT; end;
//мышь уходит за пределы окна //закрываем хинт procedure TMyHint.CMMouseLeave(var Message: TMessage); begin ReleaseHandle; end;
//нажатие левой кнопки мыши procedure TMyHint.WMLBTNDOWN(var Message: TMessage); begin //копируем в буфер обмена Clipboard.SetTextBuf(PChar(Caption)); ReleaseHandle; end;
//отображаем хинт procedure TMyHint.Show(text: string); var HintPosition: TRect; begin HintPosition.Left := Mouse.CursorPos.X - 10; HintPosition.Top := Mouse.CursorPos.Y - 10; HintPosition.Right := Mouse.CursorPos.X + 200; HintPosition.Bottom := Mouse.CursorPos.Y + 70; ActivateHint(HintPosition, text); end;
end.
-
Спасибо, буду пробовать.
-
> //нажатие левой кнопки мыши > procedure TMyHint.WMLBTNDOWN(var Message: TMessage); > begin > //копируем в буфер обмена > Clipboard.SetTextBuf(PChar(Caption)); > ReleaseHandle; > end; >
Я правильно понимаю, что при клике мышью текст скопируется - и окно исчезнет? Или ReleaseHandle - это не про исчезновение, а про другое?
-
> Я правильно понимаю, что при клике мышью текст скопируется > - и окно исчезнет? > Или ReleaseHandle - это не про исчезновение, а про другое? >
исчезновение иначе хинт не закроется
-
В редакторе кода Делфи как раз такая... %)
-
А этот хинт подлежит "извращениям"? В общем нужно следующее:
1) хинт всегда фиксированной ширины, пусть 300пх 2) происходит авто перенос длинного текста на новую строку. 3) AutoSize по высоте.
-
> Саня © (28.09.18 19:28) [9] > > А этот хинт
А самому попробовать этот "хинт" влом? А после пробы сказать что не устраивает, и если не устраивает.
|