Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 367

/ вопрос открыт /

ДДоброго времени суток.

Есть проблема:

Имеется dxTreeList, к которому прикручено PopupMenu.
У PopupMenu есть событие OnPopup, в котором в зависимости от того, какой узел
текущий (Focused), некоторые пункты меню становятся видимыми, некоторые невидимыми.
Становлюсь я на узел, вызываю это меню и выполняю какой-его пункт,
скажем, N5. Потом выбираю другой узел, опять вызываю меню и при попытке
выполнить тот же пункт N5 оказывается, что N5=nil.
Все пункты меню определены в designe time, их происшествия OnClick тоже.
Подскажете, пожалуйста, что может быть.

Booster Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Booster (статус: Посетитель)
Вопрос отправлен: 5 ноября 2009, 12:50
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

О, да, я знаком с такой проблемой и я её решил. Правда, криво, но работает.
У меня было несколько проектов с обычным TTreeView и его PopupMenu.
Все действия по активации/деактивации/видимости и пр. для меню/кнопок/TAction у меня были прописаны в Application.OnIdle. Но TTreeView - коварная штука, даже при RightClickSelect:= True меню вылезало с недоступными, но нужными пунктами. Чтобы они стали активными, надо было тыкнуть ЛЕВОЙ нопкой мыши на дереве и только потом - ПРАВОЙ для вызова меню. Поэтому я сделал свойство своего Treeview.PopupMenu = nil и:

procedure TProjectTreeView.SelfOnMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Node: TTreeNode;
begin
  if Button = mbRight
    then begin
           Node:= Self.GetNodeAt(X, Y);
 
           if Assigned(Node)
             then begin
                    Node.Focused:= True;
                    Node.Selected:= True;
                    Application.ProcessMessages();
                  end;
 
           if Assigned(Node)
             then Self.ProjectPopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
         end;
end;


Если это не поможет, можно вызвать вручную Application.OnIdle.
З.Ы. Не стреляйте в пианиста: он играет, как может.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 5 ноября 2009, 15:54


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:43
Выполнено за 0.03 сек.