Delphi 7: PopUp menu
1. Как реализовать всплытие Popup menu
по левому щелчку мыши?
2. Как реализовать всплытие Popup menu
над определенным пунктом ListBox и нигде
больше (в ListBox) с одновременным
выделением этого пункта по правому щелчку?
3. Как связать выполнение пунктов Popup menu
с пунктами ListBox, над которым оно всплыло,
а не с самим ListBox? :search:
|
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;
|
2. Насчет пункта "2" - пункт ListBox автоматически почемуто не выделяется (попробовал).
3. Насчет пункта "3" уточняю - нужно чтобы Popup menu всплывало ТОЛЬКО над пунктами ListBox, а не над самим ListBox. :search:
|
Цитата:
2. Насчет пункта "2" - пункт ListBox автоматически почемуто не выделяется (попробовал).
|
Проверю ещё раз.
Цитата:
3. Насчет пункта "3" уточняю - нужно чтобы Popup menu всплывало ТОЛЬКО над пунктами ListBox, а не над самим ListBox.
|
Вы уверены в удобстве данного интерфейса? Если Popup menu> высоты пунктов то как это выводить, чтобы меню было видно? Можно поподробнее об этом - почему такие требования? Надо размерами Popup menu управлять? поподробнее
|
Да не нужно, чтобы Popup укладывалось в размеры пункта ListBox, нужно, чтобы правый клик (Popup) срабатывал только если мыша находится на пунктами, а не в пустой области ListBox, и автоматически их выделял. Затем получал информацию, над каким пунктом Popup всплыл и выполнялся именно для него, а не для какого либо другого пункта ListBox.
|
Код:
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 Вам возможно придется подкорректировать.
|
Цитата:
Для каждого пункта списка свое меню ? Интересно, как Вы собираетесь работать с переменным списком и динамическим (по составу) всплывающим меню
|
Можно создавать 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 |
Цитата:
у Вас есть небольшие ошибки
|
А куда ж без них ? Я строчки тасовал раз пять, вот че-то там вылезло...
Ну например:
Код:
var
a: array of Integer;
....
SetLength(a, 2);
a[0] := 2;
a[1] := 4;
После этого меню будет выводиться только над третьим и пятым пунктами
Цитата:
2. Как реализовать всплытие Popup menu над определенным пунктом ListBox и нигде больше
|
|
Блин, пока еще не проверял, но все равно ОГРОМНОЕ СПАСИБО за старания и что откликнулись! :) :) :)
|
Момент номер "следующий"...
А если у меня 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.
© OSzone.net 2001-