Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.05.2012, 06:50
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию Всплывающее окно

Всем привет! Народ подскажите как можно реализовать окно подобное окну с подсказками в делфи. Как привязать его к курсору? Спасибо
Ответить с цитированием
  #2  
Старый 21.05.2012, 07:01
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Наверно ты имеешь в виду хинты? Это подсказки, которые всплывают если навести курсор на какой-либо компонент.
__________________
Google в помощь
Ответить с цитированием
  #3  
Старый 21.05.2012, 07:18
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Нет. Если пишешь например button1ставишь точку и появляется окно в котором описаны свойства, функции и т.д.
Ответить с цитированием
  #4  
Старый 21.05.2012, 16:43
Cooper72 Cooper72 вне форума
Прохожий
 
Регистрация: 21.05.2012
Сообщения: 8
Репутация: 10
По умолчанию

Нужно написать свой класс, наследник tcustomcontrol. вставить в него tlistbox. определиться откуда будут браться данные (то, что дописывается после точки). Позиция нового окна рассчитывается от позиции каретки.
как-то так.
Ответить с цитированием
  #5  
Старый 22.05.2012, 07:19
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

А как рассчитать позицию каретки?
Ответить с цитированием
  #6  
Старый 22.05.2012, 07:35
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от bambooshoot
А как рассчитать позицию каретки?
Ну например для компонента Memo:
Код:
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  
Старый 22.05.2012, 11:42
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

рассчитываю позицию каретки так:
Код:
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;
Для y получается все нормально, а для х идет запаздывание. Что-то я не учитываю, а что понять не могу. А есть ли какие-то другие варианты решения этой задачи? Подскажите пожалуйста.
Ответить с цитированием
  #8  
Старый 22.05.2012, 11:56
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от bambooshoot
Что-то я не учитываю, а что понять не могу.
Да уж, точно. Все дело в том, что Х возвращает расположение по пикселям, а символ содержать несколько пикселей в ширину. Засада, скорее всего caretPos не получиться использовать.
__________________
Google в помощь
Ответить с цитированием
  #9  
Старый 23.05.2012, 10:25
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Должны же быть еще какие-то варианты решения проблемы. Или все так безнадежно?
Ответить с цитированием
  #10  
Старый 23.05.2012, 14:19
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Сообщение от bambooshoot
рассчитываю позицию каретки так:
Код:
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;
Для y получается все нормально, а для х идет запаздывание. Что-то я не учитываю, а что понять не могу. А есть ли какие-то другие варианты решения этой задачи? Подскажите пожалуйста.
для y тоже не нормально, т.к. y не должна зависеть от количества строк в memo, ещё и умноженном на 10


вот такой вариант, будет работать, если form.font = memo.font
PHP код:
procedure TForm1.Memo1KeyUp(SenderTObject; var KeyWord;
  
ShiftTShiftState);

  function 
LineWidth(sstringsymbolsinteger): integer;
  
begin
    s 
:= copy(s1symbols);
    
result := canvas.TextWidth(s);
  
end;

var 
ptpoint;
begin
  p 
:= Memo1.CaretPos;
  
p.:= LineWidth(Memo1.Lines[p.y]+'X'p.x+1);
  
p.:= p.Canvas.TextHeight('X');
  
Memo2.left := memo1.left p.xMemo2.Top := memo1.top p.y;
end
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
bambooshoot (24.05.2012)
  #11  
Старый 24.05.2012, 06:28
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Спасибо, 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;
Число в р.y может быть любым, в зависимости от предпочтений
Спасибо всем огромное за участие. Хорошо поговорили Может быть еще кто-нибудь выскажется?
Ответить с цитированием
  #12  
Старый 24.05.2012, 07:30
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Сообщение от bambooshoot
хотя мой, несмотря на его странность - тоже работает
работает, если не возвращаться вверх по тексту

Цитата:
Сообщение от bambooshoot
Число в р.y может быть любым, в зависимости от предпочтений
и при другом размере шрифта, число придётся тоже менять
хорошая практика, когда одно изменение вносится в одном месте
ещё есть антипаттерн

если сделать так, то от размера шрифта не будет зависеть:
PHP код:
p.:= (p.1) * Canvas.TextHeight('X') + 5

Код:
LineWidth(Memo1.Lines[p.y]+'X', p.x+1)
а это место мне самому не совсем понятно, но работает и ладно
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
bambooshoot (24.05.2012)
  #13  
Старый 24.05.2012, 08:13
bambooshoot bambooshoot вне форума
Прохожий
 
Регистрация: 20.03.2011
Сообщения: 30
Репутация: 10
По умолчанию

Цитата:
работает, если не возвращаться вверх по тексту
Да, ты прав. Сдаюсь . За ссылку отдельное спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter