Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизСтранно... (создание контролов в run-time) Найти похожие ветки
← →
BlackTiger (2002-12-28 14:07) [0]Где-то что-то я пропускаю... Подскажите plz!
Есть форма. В ней есть контрол TRxCheckListBox (он служит шаблоном), у него (ну или просто на форме) есть TPopupMenu (Menu1). Далее, уже в процессе работы, мне нужно создать n-ное количество подобных CheckListBox", содержащих разные данные, зависящие от конкретных условий. И каждому новому контролу я цепляю
Сами компоненты создаются, заполняются и работают - не в этом дело.
Проблема вот какая: почему-то эти "новые" контролы НИКОГДА на фигурируют в Self.ActiveControl! Т.е я вызываю popup-менюшку и пытаюсь получить имя контрола,- из которого ее вызвали (через Self.ActiveControl.Name). Так эта рперация сообщает, что ActiveControl в данный момент - это некий ControlX. На форме есть еще несколько листбоксов, не имеющих к проблеме отношения, но созданных в дизайне - так вот это один из них.
Т.е. фокус-то на эти контролы наводится, но они почему-то как-то странно "прописываются" в форме. Функции вроде "Self.Components.Refresh" я не нашел.
Решение-то нашел, но очень уж извращенческое. Хочется узнать, почему не срабатывает мой подход?
Может есть другой медот определения "хозяина" менюшки
ЗЫ: Parent"ы всякие пробовал, тоже галиматья какая-то. При приведении типа объекта к TRxCheckListBox вываливается нафиг без сообщения конкретной ошибки.
ЗЗЫ: Делал тест, создавая такие же контролы в дизайне и использовал их в том же назначении (но менюшку привязывал тоже в run-time) - все работает. В ActiveControl фигурировало то, что и должно фигурировать.
ЗЗЗЫ: Ну и где грабли порылись? Ж-)
← →
gsu (2002-12-28 14:14) [1]>> Может есть другой медот определения "хозяина" менюшки
Owner разве не хозяин ?
← →
BlackTiger (2002-12-28 14:52) [2]Хе-хе... забыл сказать про Owner. В качестве Owner"a выступает ФОРМА, а не контрол, которому принадлежит менюшка, что есть правильно, ибо ОДНА менюшка может быть вызвана из НЕСКОЛЬКИХ мест.
Да, еще, если надо - все "новые" контролы запихиваются в TStringList.
← →
han_malign (2002-12-28 15:00) [3]TPopupMenu.PopupComponent
← →
BlackTiger (2002-12-28 15:07) [4]Опаньки!
Нашел, моё косяк!
Нужно делать Self.InsertControl().
Пардон, господа, вопрос снимается...
← →
han_malign (2002-12-28 15:13) [5]насколько я помню грабли в том что смена фокуса происходит после WM_CONTEXTPOPUP - в котором сразу вызывется onPopup
PopupComponent - 100%
procedure TControl.WMContextMenu(var Message: TWMContextMenu);
var
Pt, Temp: TPoint;
Handled: Boolean;
PopupMenu: TPopupMenu;
begin
if Message.Result <> 0 then Exit;
if csDesigning in ComponentState then Exit;
Pt := SmallPointToPoint(Message.Pos);
if Pt.X < 0 then
Temp := Pt
else
begin
Temp := ScreenToClient(Pt);
if not PtInRect(ClientRect, Temp) then
begin
inherited;
Exit;
end;
end;
Handled := False;
DoContextPopup(Temp, Handled);
Message.Result := Ord(Handled);
if Handled then Exit;
PopupMenu := GetPopupMenu;
if (PopupMenu <> nil) and PopupMenu.AutoPopup then
begin
SendCancelMode(nil);
PopupMenu.PopupComponent := Self;
if Pt.X < 0 then
Pt := ClientToScreen(Point(0,0));
PopupMenu.Popup(Pt.X, Pt.Y);
Message.Result := 1;
end;
if Message.Result = 0 then
inherited;
end;
- inherited - после...
- а непосредственно WM_SETFOCUS - генрится только по левой кнопке.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c