![]() |
|
|
#1
|
|||
|
|||
|
Всем привет! Народ подскажите как можно реализовать окно подобное окну с подсказками в делфи. Как привязать его к курсору? Спасибо
|
|
#2
|
||||
|
||||
|
Наверно ты имеешь в виду хинты? Это подсказки, которые всплывают если навести курсор на какой-либо компонент.
|
|
#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; Последний раз редактировалось 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
|
||||
|
||||
|
Цитата:
|
|
#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
|
|||
|
|||
|
Цитата:
. За ссылку отдельное спасибо. |