Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2008, 20:48   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию Окошко подсказки в редакторе, как в Delphi

ListBox выскакивает не около каретки в тексте, как правильно его спозиционировать?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Memo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ListBox1.Parent := Memo1;
 ListBox1.Visible := False;
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if (key = Ord('J')) and (ssCtrl in Shift) then
 begin
  ListBox1.Left := Memo1.CaretPos.x;
  ListBox1.Top := Memo1.CaretPos.y + ListBox1.height;
  ListBox1.Visible := True;
  ListBox1.SetFocus;
 end;
end;

end.
Alter вне форума Ответить с цитированием
Старый 24.12.2008, 00:18   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

=))
CaretPos.X - это не координата, а номер символа;
тоже с Y (номер строки)
если у шрифта фиксированный размер (Lucida Console, напр.) то просто умножай на размеры шрифта (откуда брать их - не ко мне)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 24.12.2008, 00:29   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

зЫ
если у тя и шрифт неизменный то
размер шрифта эт вродь высота буквы
а ширину подбором))))

если кто знает как это делается красивее скажите плз.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 24.12.2008, 01:43   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Если рассуждать логически, то Винда знает где каретка, она же ее рисует. А в Борланде решили что нам это знать не надо и в Мемо такого нет. Я думаю тут поможет знаток API.
Или хотя бы приблизительно умножать на ширину букв, с высотой проблем быть не должно, Font.Height * CaretPos.Y, разве может еще интервал междустроковый добавить к высоте шрифта.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 24.12.2008, 02:07   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Не совсем так...
Alter, вот я вам рабочий вариант кода подготовил (на все случаи жизни):
Код:
var
  num: integer;
  numpt: TPoint;
begin
num:=SendMessage(Memo1.handle, EM_POSFROMCHAR, Memo1.SelStart + Memo1.SelLength, 0);
numpt.X:=LoWord(num);
numpt.Y:=HiWord(num);
if key=VK_CONTROL	then
begin
ListBox1.Left:=numpt.X+Memo1.Left;
ListBox1.Top:=numpt.Y+Memo1.Top;
end;
end;
Тут ваш хэлп вызывается, как вы понимаете, по клавише CTRL.
mihali4 вне форума Ответить с цитированием
Старый 24.12.2008, 07:59   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

кхех
код не работает.
листбокс улетает куда то вправо вниз от формы
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 24.12.2008, 13:59   #7
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Все работает. Только если каретка не после последнего символа
MSDN говорит:
Цитата:
If the specified index is greater than the index of the last character in the control, the control returns -1.
Код:
SendMessage(Memo1.handle, EM_POSFROMCHAR, Memo1.SelStart + Memo1.SelLength, 0);
Если передаваемый индекс символа за последним то возвращается -1.
Соответственно лучше предпринять меры чтобы этого не происходило
s.Creator вне форума Ответить с цитированием
Старый 31.12.2008, 16:30   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

ну незнаю
у меня всегда numpt.X и numpt.Y = 65535
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 31.12.2008, 19:58   #9
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Могу ещё посоветовать, listBox в форму воткнуть, а вот форму уже использовать, как вы listBox используете. Это для того, что-бы при поткрк фокуса окно само закрывалось. Да и вообще, как всплывающую подсказку...
----
А вот вопрос по теме: Как вставить текст в позицию каретки?

Последний раз редактировалось Altera; 31.12.2008 в 20:02.
Altera вне форума Ответить с цитированием
Старый 31.12.2008, 22:57   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

В результате опытов было полученно:
Код:
procedure TForm1.N45Click(Sender: TObject);
var
  OldF :TFont;
  w_, h_ :Integer; 
  Poz :TPoint;
begin 
 OldF := TFont.Create;
  Try
 OldF.Assign(Memo1.Font);
 Canvas.Font.Assign(OldF);
  // размеры букв в Memo
  w_ := Canvas.TextWidth('w');
  h_ := Canvas.TextHeight('w');
  // положение списка в Memo
 Poz.X := Memo1.CaretX * w_ - 2;
 Poz.Y := Memo1.CaretY * h_ - 2;
   // возврат в лево при перекрытии
  If Poz.X>=(Memo1.Width - LBox1.Width) then
   Poz.X := Poz.X - LBox1.Width;
   // возврат в верх при перекрытии
  If Poz.Y>=(Memo1.Height - LBox1.Height) then
   Poz.Y := Poz.Y - LBox1.Height;
 LBox1.Left := Poz.X;
 LBox1.Top := Poz.Y;
  // отображение
 LBox1.Visible := True;
 LBox1.SetFocus;
  Finally
 Memo1.Font.Assign(OldF);
 OldF.Free;
  End;
end;
работает примерно так как надо...

Цитата:
А вот вопрос по теме: Как вставить текст в позицию каретки?
Код:
Memo1.SelText := 'Текст';

Последний раз редактировалось Alter; 31.12.2008 в 23:00.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить окошко? DANIЯR Общие вопросы Delphi 4 02.12.2008 01:00
Замена слова в текстовом редакторе Славный Общие вопросы Delphi 6 06.06.2008 14:19
Автоматический скролинг в редакторе кода Altera Общие вопросы Delphi 0 05.06.2008 16:23
Всплывающее окошко Micha Помощь студентам 3 30.03.2008 13:58
Плавающее окошко Маркъ Общие вопросы Delphi 2 02.04.2007 18:42