Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Delphi 7: PopUp menu (http://forum.oszone.net/showthread.php?t=55083)

Tromb 12-10-2005 17:05 363666

Delphi 7: PopUp menu
 
1. Как реализовать всплытие Popup menu
по левому щелчку мыши?

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

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

SlS 12-10-2005 19:41 363707

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 363774

2. Насчет пункта "2" - пункт ListBox автоматически почемуто не выделяется (попробовал).

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

SlS 13-10-2005 20:01 364029

Цитата:

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

Цитата:

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

Tromb 14-10-2005 01:27 364111

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

SlS 15-10-2005 01:52 364437

Код:

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 364439

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 364514

Цитата:

Для каждого пункта списка свое меню ? Интересно, как Вы собираетесь работать с переменным списком и динамическим (по составу) всплывающим меню
Можно создавать 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 364528

Цитата:

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

Цитата:

что такое 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 364638

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

Tromb 19-10-2005 01:22 365500

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


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

Savant 19-10-2005 01:25 365502

Цитата:

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


Время: 15:11.

Время: 15:11.
© OSzone.net 2001-