Delphi - Delphi 7: PopUp menu

Аватара пользователя
Tromb

Delphi - Delphi 7: PopUp menu

Сообщение Tromb »

1. Как реализовать всплытие Popup menu

по левому щелчку мыши?



2. Как реализовать всплытие Popup menu

над определенным пунктом ListBox и нигде

больше (в ListBox) с одновременным

выделением этого пункта по правому щелчку?



3. Как связать выполнение пунктов Popup menu

с пунктами ListBox, над которым оно всплыло,

а не с самим ListBox? Изображение
Аватара пользователя
Tromb

Re: Delphi - Delphi 7: PopUp menu

Сообщение Tromb »

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

Re: Delphi - Delphi 7: PopUp menu

Сообщение Tromb »

Момент номер "следующий"...

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





SetLength(a, 2);

a[0] := 2;

a[1] := 4;
Аватара пользователя
Tromb

Re: Delphi - Delphi 7: PopUp menu

Сообщение Tromb »

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



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

Re: Delphi - Delphi 7: PopUp menu

Сообщение Tromb »

Цитата:



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



Проверю ещё раз.




Цитата:



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



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

Re: Delphi - Delphi 7: PopUp menu

Сообщение Tromb »

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

Re: Delphi - Delphi 7: PopUp menu

Сообщение Tromb »

Код:

Код: Выделить всё

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

Re: Delphi - Delphi 7: PopUp menu

Сообщение Savant »

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 Вам возможно придется подкорректировать.
Аватара пользователя
Savant

Re: Delphi - Delphi 7: PopUp menu

Сообщение Savant »

Цитата:



Для каждого пункта списка свое меню ? Интересно, как Вы собираетесь работать с переменным списком и динамическим (по составу) всплывающим меню



Можно создавать PopupMenu при исполнении программы, тогда проблема собственно говоря вообще себя исчерпает Изображение



Savant , у Вас есть небольшие ошибки и недочёты


Цитата:



// Выделяем пункт ListBox1.ItemIndex := ListBox1.ItemAtPos(Point(x, y), true);



Надо же по щелчку именно правой кнопки, так что это лучше написать после обработки значения кнопки.



что такое a


Цитата:



if a[ i ] = ListBox1.ItemIndex then begin



P.S. Давайте будем проверять свой код на Delphi 7 Изображение Свой первый пост - каюсь - я проверил на 5-й версии, что и привело к ошибкам Изображение
Аватара пользователя
Savant

Re: Delphi - Delphi 7: PopUp menu

Сообщение Savant »

Цитата:



у Вас есть небольшие ошибки



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




Цитата:



что такое a[ i ]



Ну например:



Код:

Код: Выделить всё

var
  a: array of Integer;
....
  SetLength(a, 2);
  a[0] := 2;
  a[1] := 4;

После этого меню будет выводиться только над третьим и пятым пунктами


Цитата:



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

Вернуться в «Программирование и базы данных»