|
#1
|
|||
|
|||
Всплывающее окно
Всем привет! Народ подскажите как можно реализовать окно подобное окну с подсказками в делфи. Как привязать его к курсору? Спасибо
|
#2
|
||||
|
||||
Наверно ты имеешь в виду хинты? Это подсказки, которые всплывают если навести курсор на какой-либо компонент.
Google в помощь |
#3
|
|||
|
|||
Нет. Если пишешь например button1ставишь точку и появляется окно в котором описаны свойства, функции и т.д.
|
#4
|
|||
|
|||
Нужно написать свой класс, наследник tcustomcontrol. вставить в него tlistbox. определиться откуда будут браться данные (то, что дописывается после точки). Позиция нового окна рассчитывается от позиции каретки.
как-то так. |
#5
|
|||
|
|||
А как рассчитать позицию каретки?
|
#6
|
||||
|
||||
Цитата:
Код:
var p: TPoint; begin p:= Memo1.CaretPos; end; Код:
StdCtrls: property CaretPos: TPoint read GetCaretPos write SetCaretPos; function GetCaretPos: TPoint; virtual; procedure SetCaretPos(const Value: TPoint); virtual; Google в помощь Последний раз редактировалось Ildar-tsr, 22.05.2012 в 07:42. |
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение: | ||
bambooshoot (24.05.2012)
|
#7
|
|||
|
|||
рассчитываю позицию каретки так:
Код:
procedure TForm1.Memo1Change(Sender: TObject); begin Memo2.Left:= Memo1.Left+Memo1.CaretPos.X*2+12; Memo2.Top:=Memo1.Top+Memo1.CaretPos.Y*3+Memo1.Font.Size+Memo1.Lines.Count*10; end; |
#8
|
||||
|
||||
Цитата:
Google в помощь |
#9
|
|||
|
|||
Должны же быть еще какие-то варианты решения проблемы. Или все так безнадежно?
|
#10
|
|||
|
|||
Цитата:
вот такой вариант, будет работать, если form.font = memo.font PHP код:
|
Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
bambooshoot (24.05.2012)
|
#11
|
|||
|
|||
Спасибо, Pyro за участие. Достойный код, хотя мой, несмотря на его странность - тоже работает , но только как я говорил выше - для y. Насчет х у меня вообще ахинея полная. Я чуть-чуть подправил твой код:
Код:
function LineWidth(s: string; symbols: integer): integer; begin s := copy(s, 1, symbols); result := form1.canvas.TextWidth(s); end; procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var p: tpoint; begin p := Memo1.CaretPos; p.x := LineWidth(Memo1.Lines[p.y]+'X', p.x+1); p.y := p.y * Canvas.TextHeight('X')+18; Memo2.left := memo1.left + p.x; Memo2.Top := memo1.top + p.y; end; Спасибо всем огромное за участие. Хорошо поговорили Может быть еще кто-нибудь выскажется? |
#12
|
|||
|
|||
Цитата:
Цитата:
хорошая практика, когда одно изменение вносится в одном месте ещё есть антипаттерн если сделать так, то от размера шрифта не будет зависеть: PHP код:
Код:
LineWidth(Memo1.Lines[p.y]+'X', p.x+1) |
Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
bambooshoot (24.05.2012)
|
#13
|
|||
|
|||
Цитата:
|