Войти

Показать полную графическую версию : Delphi 7: PopUp menu


Tromb
12-10-2005, 17:05
1. Как реализовать всплытие Popup menu
по левому щелчку мыши?

2. Как реализовать всплытие Popup menu
над определенным пунктом ListBox и нигде
больше (в ListBox) с одновременным
выделением этого пункта по правому щелчку?

3. Как связать выполнение пунктов Popup menu
с пунктами ListBox, над которым оно всплыло,
а не с самим ListBox? :search:

SlS
12-10-2005, 19:41
1.

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin //если левая кнопка мыши
PopupMenu1.Popup(ListBox1.Left+x+left,ListBox1.Top+y+top); //открыть Popup menu в координатах
// можно взять также координаты мыши
end;
end;

2.

Опять же как и в первом. Пункт выделяется сам.

3.

Тут уже делаем либо If, либо Case

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin //если левая кнопка мыши
if ListBox1.ItemIndex=X then begin
PopupMenuX.Popup(ListBox1.Left+x+left,ListBox1.Top+y+top); //открыть Popup menu X в координатах
end;
end;

Tromb
13-10-2005, 00:33
2. Насчет пункта "2" - пункт ListBox автоматически почемуто не выделяется (попробовал).

3. Насчет пункта "3" уточняю - нужно чтобы Popup menu всплывало ТОЛЬКО над пунктами ListBox, а не над самим ListBox. :search:

SlS
13-10-2005, 20:01
2. Насчет пункта "2" - пункт ListBox автоматически почемуто не выделяется (попробовал).
Проверю ещё раз.

3. Насчет пункта "3" уточняю - нужно чтобы Popup menu всплывало ТОЛЬКО над пунктами ListBox, а не над самим ListBox.

Вы уверены в удобстве данного интерфейса? Если Popup menu> высоты пунктов то как это выводить, чтобы меню было видно? Можно поподробнее об этом - почему такие требования? Надо размерами Popup menu управлять? поподробнее

Tromb
14-10-2005, 01:27
Да не нужно, чтобы Popup укладывалось в размеры пункта ListBox, нужно, чтобы правый клик (Popup) срабатывал только если мыша находится на пунктами, а не в пустой области ListBox, и автоматически их выделял. Затем получал информацию, над каким пунктом Popup всплыл и выполнялся именно для него, а не для какого либо другого пункта ListBox.

SlS
15-10-2005, 01:52
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

var
APoint: TPoint;
Index: integer;

begin
{Первый вопрос}
{как и в ответе № 2, только вместо mbRight, указываете mbLeft}

{Второй вопрос}
if Button = mbRight then
begin
APoint.X := X;
APoint.Y := Y;
Index := ListBox1.ItemAtPos(APoint, True);
//index- номер пункта
if index=-1 then
begin
//код,если клик не в пункт, а непонятно куда
end
else
Begin
//Е! Наконец то чайник смог тыкнуть в пункт
// Выделяем пункт
ListBox1.ItemIndex:=index;
// Отображаем для каждого своё меню - ответ на Третий вопрос
if ListBox1.ItemIndex=0 then PopupMenu1.Popup(ListBox1.Left+x+left,ListBox1.Top+y+top); //открыть Popup menu
if ListBox1.ItemIndex=1 then PopupMenu2.Popup(ListBox1.Left+x+left,ListBox1.Top+y+top);
if ListBox1.ItemIndex=2 then PopupMenu3.Popup(ListBox1.Left+x+left,ListBox1.Top+y+top);
{P.S. Стоит поиграться с координатами вывода меню для удобства интерфейса}
end;
end;
end;



Если что не так - поясните. Могу выслать так же пример - пишите в личку.

Savant
15-10-2005, 02:13
SlS
Для каждого пункта списка свое меню ? Интересно, как Вы собираетесь работать с переменным списком и динамическим (по составу) всплывающим меню :)

Tromb
а можно и так...

2+3. Пусть задан массив a: array of Integer , в котором указаны номера пунктов списка ListBox1 на форме Form1, над которыми должно появляться меню PopupMenu1 :

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i: Integer;
const
left_tab = 6;
top_tab = 26;
begin
// Выделяем пункт
ListBox1.ItemIndex := ListBox1.ItemAtPos(Point(x, y), true);
// Выводим меню (коли надо)
if Button = mbRight then
for i := 0 to Length(a) - 1 do
if a[ i ] = ListBox1.ItemIndex then begin
PopupMenu1.Popup(x + ListBox1.Left + Form1.Left + left_tab, y + ListBox1.Top + Form1.Top + top_tab);
Break;
end;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
if ListBox1.ItemIndex > -1 then
MessageBox(0, PChar(ListBox1.Items[ListBox1.ItemIndex]), nil, 0)
// вообще-то это только заглушка, здесь надо реализовать что-то типо этого:
// case ListBox1.ItemIndex of
// 0: реакция на первый пункт
// ...
// ListBox1.Items.Count-1: реакция на последний пункт списка (что-то может объединить и т.п.)
// else /error, impossible value/ ;
// end;
end;




left_tab и top_tab Вам возможно придется подкорректировать.

SlS
15-10-2005, 14:14
Для каждого пункта списка свое меню ? Интересно, как Вы собираетесь работать с переменным списком и динамическим (по составу) всплывающим меню
Можно создавать PopupMenu при исполнении программы, тогда проблема собственно говоря вообще себя исчерпает =)

Savant , у Вас есть небольшие ошибки и недочёты
// Выделяем пункт ListBox1.ItemIndex := ListBox1.ItemAtPos(Point(x, y), true);
Надо же по щелчку именно правой кнопки, так что это лучше написать после обработки значения кнопки.

что такое a[i]
if a[ i ] = ListBox1.ItemIndex then begin

P.S. Давайте будем проверять свой код на Delphi 7 =) Свой первый пост - каюсь - я проверил на 5-й версии, что и привело к ошибкам :sorry:

Savant
15-10-2005, 14:52
у Вас есть небольшие ошибки
А куда ж без них ? Я строчки тасовал раз пять, вот че-то там вылезло...

что такое a[ i ]
Ну например:

var
a: array of Integer;

....

SetLength(a, 2);
a[0] := 2;
a[1] := 4;


После этого меню будет выводиться только над третьим и пятым пунктами
2. Как реализовать всплытие Popup menu над определенным пунктом ListBox и нигде больше

Tromb
16-10-2005, 01:20
Блин, пока еще не проверял, но все равно ОГРОМНОЕ СПАСИБО за старания и что откликнулись! :) :) :)

Tromb
19-10-2005, 01:22
Момент номер "следующий"...
А если у меня ListBox формируется динамически (используя определенные условия) и я понятия не имею сколько он будет содержать пунктов, тогда как?, че мне делать с:


SetLength(a, 2);
a[0] := 2;
a[1] := 4;

Savant
19-10-2005, 01:25
если у меня ListBox формируется динамически
Когда будет ясно кол-во пунктов (а лучше всегда в обработчике OnChange) делаем SetLength(a, Listbox1.Lines.Count или нужное кол-во строк) и далее заполняем a[nnn] := Номер_строки_в_которой_отобразится_меню




© OSzone.net 2001-2012