Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2016, 15:42   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Один PopupMenu на два ListView

Хочу привязать один PopupMenu к двум ListView
Код:
procedure TForm4.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  OpenPopupMenu(ListView1, Button, X, Y);
end;

procedure TForm4.ListView2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  OpenPopupMenu(ListView2, Button, X, Y);
end;

procedure TForm4.OpenPopupMenu(LV: TListView; Button: TMouseButton; X, Y: Integer);
var
  I: Integer;
  P: TPoint;
begin
  if mbLeft = Button then Exit;
  if LV.GetItemAt(X, Y) = nil then Exit;

  I := LV.GetItemAt(X, Y).Index;
  // Если курсор на одной из строк
  if I >= 0 then
  begin
    LV.ItemIndex := I;
    // И ручной вызов меню
    P := LV.ClientToScreen(Point(X, Y));
    PopupMenu1.Popup(P.X, P.Y);
  end;
end;

procedure TForm4.NCopyClick(Sender: TObject);
begin
  {if ListView1.Items[ListView1.ItemIndex].SubItems[0] = '' then Exit;
  Clipboard.AsText := ListView1.Selected.SubItems[0];}
  // За что тут зацепиться?
end;
Проблема в том, что не за что зацепиться в NCopyClick. Как указать, что именно нужно копировать?
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 15:43   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы имеете в виду как отличить к кому был доступ?
при открытии сохраните последний листвью в переменную, а в обработчике применяйте ее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2016, 15:53   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Типа того. Скопировать данные из того ListView, на строке которого было вызвано меню.
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 16:29   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в вашем методе OpenPopupMenu сохраните какой LV открылся в поле формы и потом его и применяйте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2016, 17:44   #5
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Что-то мудрите вы тут, по-моему...
Во-первых, я не поняла извращений ТС.
Достаточно в свойствах ListView1 и ListView2 указать один и тот же параметр PopupMenu и они оба будут вызывать одно и то же PopupMenu...
Далее - событие PopupMenuImagePopup(Sender: TObject) имеет параметр Sender - это и есть вызвавший меню объект.
И в этом обработчике достаточно определить
Код:
if (Sender as TListView).Name='ListView1' then
begin
//список операторов для ListView1
end else
begin
//список операторов для ListView2
end;
Или проблема у ТС имеет некий глубинный смысл, которого я не уловила?
kropotkina-alice вне форума Ответить с цитированием
Старый 11.09.2016, 18:09   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

По условию PopupMenu должен быть вызван, если был произведён клик по записи. Событие PopupMenu у ListView не трогаем.

Последний раз редактировалось Shouldercannon; 11.09.2016 в 18:23.
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 18:14   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я вам уже написал что сделать надо.
или мне код нужно накидать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2016, 20:41   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я вам уже написал что сделать надо.
или мне код нужно накидать?
Если можно
Shouldercannon вне форума Ответить с цитированием
Старый 13.09.2016, 12:28   #9
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
procedure TForm4.NCopyClick(Sender: TObject);
var
  LV: TListView;
begin
  LV := TListView(PopupMenu1.Tag);
  if LV.Items[LV.ItemIndex].SubItems[0] = '' then Exit;
  Self.Caption := LV.Selected.SubItems[0];
end;

procedure TForm4.OpenPopupMenu(LV: TListView; Button: TMouseButton; X, Y: Integer);
var
  I: Integer;
  P: TPoint;
begin
  PopupMenu1.Tag := Integer(LV);

  if mbLeft = Button then Exit;
  if LV.GetItemAt(X, Y) = nil then Exit;

  I := LV.GetItemAt(X, Y).Index;
  // Если курсор на одной из строк
  if I >= 0 then
  begin
    LV.ItemIndex := I;
    // И ручной вызов меню
    P := LV.ClientToScreen(Point(X, Y));
    PopupMenu1.Popup(P.X, P.Y);
  end;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 13.09.2016, 13:29   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

PopupMenu.PopupComponent
Delphi Help Example
Цитата:
This example uses two edit boxes and one pop-up menu on a form. The pop-up menu contains Cut, Copy, and Paste commands. This code makes the pop-up menu available to both edit boxes:

Код:
procedure TForm1.FormCreate(Sender: TObject);

begin
  PopupMenu1.AutoPopup := True;
  Edit1.PopupMenu := PopupMenu1;
  Edit2.PopupMenu := PopupMenu1;

end;
These are the cut, copy, and paste OnClick events for the commands on the pop-up menu.

Код:
procedure TForm1.Copy1Click(Sender: TObject);

begin
  if PopupMenu1.PopupComponent = Edit1 then
   Edit1.CopyToClipboard
  else if PopupMenu1.PopupComponent = Edit2 then
    Edit2.CopyToClipboard
  else
    Beep;

end;

procedure TForm1.Cut1Click(Sender: TObject);

begin
  if PopupMenu1.PopupComponent = Edit1 then
    Edit1.CutToClipboard
  else if PopupMenu1.PopupComponent = Edit2 then
    Edit2.CutToClipboard;
  else
    Beep;

end;

procedure TForm1.Paste1Click(Sender: TObject);

begin
  if PopupMenu1.PopupComponent = Edit1 then
    Edit1.PasteFromClipboard
  else if PopupMenu1.PopupComponent = Edit2 then
    Edit2.PasteFromClipboard;
  else
    Beep;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать ListView в один столбец Oleg_SS Компоненты Delphi 5 17.05.2014 15:31
Вызов PopupMenu в ListView tsar_ Помощь студентам 0 19.01.2012 14:02
Объединить два кода в один c++\noob Общие вопросы C/C++ 3 08.03.2011 11:21
Два ListView как в TotalComander casper0094 Компоненты Delphi 6 24.07.2010 11:50
как в PhotoShop два файла скеить в один pdf файл? Допустим я нарисовал 2 страницы книги и мне их нужно объединить в один pdf N!ckeL Моделирование, изометрия, photoshop, 3d редакторы 2 15.05.2008 19:34