Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Показывание PoupMenu над ListBox


Автор: MaXL 29.5.2007, 16:07
Всем привет.
Есть PopupMenu. есть ListBox в котором есть записи. Количество записей переменное. Мне нужно сделать так, чтобы при целканье правой кнопкой мышки над ListBox`ом показывался этот самый PopupMenu. Вариант просто указать в качестве свойства PopupMenu у ListBox не катит. Т.к. при щёлканьи мне нужно выделить запись в ListBox.
Так вот я делают это так(по событию MouseUp у ListBox):
Код

var
  pos: integer;
begin
TRY
  if Button = mbRight then
    begin
      pos:= StrToInt(FloatToStr(Int(Y / 13)));
      ListBox.Selected[pos]:= true;
    end;
EXCEPT
end;

Всё работает, но возникает проблема, когда количество записей больше чем Высота у ListBox'а(.т.к юзер прокрутил вниз и там жмёт) то получается что, выделятся не та строчка, т.к. юзер прокрутил, а координаты не изменились.
Так вот, кто поможет?  smile 

Автор: Yanis 29.5.2007, 16:43
MaXL
Что то ты придумал прикольное такое, но лучше воспользуйся стандартным методом: 
Код
ListBox1.ItemAtPos()

Автор: MaXL 29.5.2007, 17:06
Yanis, спасибо всё работает. А я там мудрил..а оказывается всё так просто=)
Вот если кому пригодиться получившийся код:
Код

var
  pos: TPoint;
begin
  if Button = mbRight then
    begin
      pos.X:= X;
      pos.Y:= Y;
      if (ListBox.ItemAtPos(pos, true)) = -1 then exit;
      ListBox.Selected[ListBox.ItemAtPos(pos, true)]:= true;
      UserListPopup.Popup(X + MainForm.Left + ListBox.Left,
                          Y + MainForm.Top + ListBox.Top + 25);
    end;
end;

Вопрос решён!

Автор: dumb 30.5.2007, 12:22
Цитата(MaXL @  29.5.2007,  17:06 Найти цитируемый пост)
X + MainForm.Left + ListBox.Left,

еще одна наводка: ClientToScreen

Автор: Sunvas 30.5.2007, 15:28
А может без мазохизма ребята? Функция getcursorpos решит все проблеммы!

Автор: MaXL 30.5.2007, 15:50
Sunvas, что даст функция getCursorPos?=)
Нехочу щас проверять, но она помойму даёт TPoint, в которой будут координаты позиции курсора..и что дальше? у меня и так эти координаты есть, они передаются в процедуру..X и Y. Или ты говорил про что-то другое?

dumb, спасибо за наводку=)

Автор: Sunvas 30.5.2007, 23:07
Цитата(MaXL @  30.5.2007,  15:50 Найти цитируемый пост)
Нехочу щас проверять, но она помойму даёт TPoint, в которой будут координаты позиции курсора..и что дальше?

Верно мыслишь: это процедура возвращает координаты курсора мыши. Это намного практичнее, чем узнавать координаты клика мыши по контролу, а потом к ним прибавлять позицию листбокса и формы по высоте и ширине. Нехорошо это.  smile 

Автор: dumb 31.5.2007, 00:33
Цитата(Sunvas @  30.5.2007,  23:07 Найти цитируемый пост)
Это намного практичнее, чем узнавать координаты клика мыши по контролу, а потом к ним прибавлять позицию листбокса и формы по высоте и ширине.

правильный и практичный функций упомянут аккурат перед твоим первым постом. smile

Автор: Sunvas 31.5.2007, 13:30
dumb, да это тоже вариант.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)