Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.13;
Скачать: CL | DM;

Вниз

Странно... (создание контролов в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
3-36975
Fuinadan
2002-12-18 18:11
2003.01.13
PostGluk


3-36989
Fishka
2002-12-18 16:11
2003.01.13
Заполнение Мемо-поля через DBMemo


1-37015
dim-
2002-12-31 13:48
2003.01.13
Как работать с OLE Compound Storage


6-37255
Борис
2002-11-13 12:48
2003.01.13
Не могу получить список всех компьютеров сети!


14-37355
Свой
2002-12-20 11:44
2003.01.13
Создание ОС