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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2009, 15:27   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию Хочу менюшку как в Дельфи :)

У Дельфи есть приколюшка, она в листбоксе выводит список методов класса. Я хочу в своем редакторе замутить почти такое же. Я нажимаю на определенную комбинацию кнопок и в редакторе всплывает мой ЛистБокс с моим содержимым, хинт дает более развернутую подсказку. Но я никак не могу заставить его появляться в углу около курсора в тексте (чем больше текста тем больше ошибка). Я получаю координаты через CaretPos (это Мемо), но не могу правильно преобразовать их в координаты для отображения ЛистБокса .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.12.2009, 15:35   #2
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Попробуйте через Mouse.Pos
k1r1ch вне форума Ответить с цитированием
Старый 28.12.2009, 15:52   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от k1r1ch Посмотреть сообщение
Попробуйте через Mouse.Pos
Подробней, я сегодня туго соображаю .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.12.2009, 15:58   #4
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Button1.Top := Mouse.CursorPos.Y;
  Button1.Left := Mouse.CursorPos.X;
end;
Вот пример
k1r1ch вне форума Ответить с цитированием
Старый 28.12.2009, 16:01   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я имею ввиду курсор Memo, палка такая знаете?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.12.2009, 16:35   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Я имею ввиду курсор Memo, палка такая знаете?
Знаем
Код:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  CaretPos: TPoint;
begin
  if (ssCtrl in Shift) and (Key = VK_SPACE) then
  begin
    GetCaretPos(CaretPos);
    Button1.Top := Memo1.Top + CaretPos.Y + Memo1.Font.Size * 2;
    Button1.Left := Memo1.Left + CaretPos.X;
  end;
end;
Чуток подправил

Последний раз редактировалось psycho-coder; 28.12.2009 в 17:44.
psycho-coder вне форума Ответить с цитированием
Старый 28.12.2009, 16:51   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

что-то типа такого...
Код:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var p: tpoint;
    Rect: TRect;
begin
 if (ssctrl in shift)and(key= ord('S')) then begin
  getcaretpos(p);
  //getWindowRect(memo1.Handle,Rect);
  caption:= inttostr(p.x)+ '-'+inttostr(p.y);

  lb.Left:= p.X + 11 + memo1.Left;//+ rect.Left;
  lb.Top:= p.Y +11 + memo1.Top;//+ rect.Top;
  lb.Visible:= true;
 end
end; 

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
 key:= #0
end;
Изображения
Тип файла: jpg Копировать из новый-3.jpg (52.0 Кб, 94 просмотров)
Вложения
Тип файла: zip meny.zip (2.1 Кб, 14 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 28.12.2009 в 16:55.
raxp вне форума Ответить с цитированием
Старый 29.12.2009, 08:23   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
Чуток подправил
Ваш метод тоже дает искажения, как и мой. Кстати, я пробовал таким образом:
Код:
    
    // Текущее положение курсора
    x:=Memo1.CaretPos.X;
    y:=Memo1.CaretPos.Y;

    // Преобразование координат
    ListBox1.Left:=x*Memo1.Font.Size+Memo1.Left+Memo1.Font.Size;
    ListBox1.Top:=y*Memo1.Font.Size+Memo1.Top+Memo1.Font.Size;
Код:
  lb.Left:= p.X + 11 + memo1.Left;//+ rect.Left;
  lb.Top:= p.Y +11 + memo1.Top;//+ rect.Top;
Я так понимаю 11 это размер шрифта? Все равно не работает как положено. Чем больше текст, тем дальше распологается листбокс.

Я думаю проблема в том, что я получаю координаты курсора в рамках Мемо, в тоже время как вывод ЛистБокса осуществляется в рамках формы. Никак не могу правильно провести преобразование из одной системы отсчета в другую.

---------------------------------------- Добавлено --------------------------------------------------

Сделал такой финт:
1. Установил шрифт одинаковый по ширине и длине (Courier New).
2. Сделал Мемо родителем для Листбокса.

Теперь корректно показывается только по длине, но никак не по высоте . С чем это связано?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 29.12.2009 в 09:14.
Utkin вне форума Ответить с цитированием
Старый 29.12.2009, 09:27   #9
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

А так?
Код:
var
  p: TPoint;
begin
  GetCaretPos(p);
  p := Memo1.ClientToScreen(p);
  p := Form1.ScreenToClient(p);
  p.Y := p.Y - Memo1.Font.Height;
  ListBox1.Left := p.X;
...
end;

Последний раз редактировалось Баламут; 29.12.2009 в 09:34.
Баламут вне форума Ответить с цитированием
Старый 29.12.2009, 09:31   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
А так?
Код:
var
  p: TPoint;
begin
  GetCaretPos(p);
  p := Memo1.ClientToScreen(p);
  p := Form1.ScreenToClient(p);
end;
те же артефакты - чем больше длина строки и чем она ниже расположена тем дальше Листбокс от курсора .

Код:
// Вызов в текст списка методов
procedure TForm1.MetodSpsExecute(Sender: TObject);
var
   x, y: Integer;
   p: TPoint;
begin


  // Работаем только если фокус на поле ввода
  if (Memo1.Focused=false) and (ListBox1.Focused=false) then Exit;

  // Посмотрим надо ли отображать список встроенных методов
  if MetVisio=false then
  begin

    // Найдем положение курсора
    x:=Memo1.CaretPos.X+1;
    y:=Memo1.CaretPos.Y+1;

    // Изменим положение Списка встроенных методов
    getcaretpos(p);
    ListBox1.Left:= p.X + 11 + memo1.Left;//+ rect.Left;
    ListBox1.Top:= p.Y +11 + memo1.Top;//+ rect.Top;

    // Покажем Список втсроенных методов
    ListBox1.Show;
    ListBox1.SetFocus;

    // Установим флаг отображения списка встроенных методов
    MetVisio:=true;
  end
Решил, адаптацией решения от raxp под свои нужды .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 29.12.2009 в 09:36.
Utkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочу диалог открытия файлы как в WinRar-е Altera Компоненты Delphi 11 27.06.2009 19:52
хочу стать программистом - как самому написать сайт? Egorr HTML и CSS 9 06.06.2009 18:39
Как написать Firewall на Дельфи Norden Работа с сетью в Delphi 4 20.02.2009 14:35
хочу стереть линию с канвы.КАК? harmager Общие вопросы Delphi 1 24.11.2008 10:28
Я хочу быть как вы, пожалуйста помогите ProgCreater Win Api 6 30.03.2007 20:07