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

Вниз

Как обычный компонент показать поверх созданного динамически?   Найти похожие ветки 

 
Lebedev   (2007-11-15 08:34) [0]

У меня такая проблема. Мне необходимо отобразить компонент, который уже существует, поверх компонента, который создаётся динамически. То есть после того, как я создаю компонент динамически, он закрывает собой уже существующий. Как этого избежать?
Подскажите пожалуйста!


 
MBo ©   (2007-11-15 08:39) [1]

BringToFront


 
Однокамушкин   (2007-11-15 08:40) [2]

См. методы SendToBack и BringToFront, только учтите, что неоконный компонент (это тот, у которого в предках нет TWinControl), никогда и ни при каких обстоятельствах не может перекрыть оконный, расположенный на том же родителе


 
Lebedev   (2007-11-15 09:48) [3]

А как использовать метод BringToFront?

Мне необходимо компонент Label (точнее RTFLabel) поместить по верх нидамиески создающегося RadioGroup. RadioGroup находится на Panel. Ну и это всё на Форме, конечно.

В моём случае это возможно?


 
Reindeer Moss Eater ©   (2007-11-15 09:50) [4]

А зачем вообще label на радиогруппе?


 
Lebedev   (2007-11-15 09:54) [5]

Кстати, пробую и не получается. (((
Пишу
RTFlabel1.BringToFront;
Но ничего не видно.
Как быть?

>А зачем вообще label на радиогруппе?
Так как Items радиогруппы сильно ограничены в шрифтах.


 
Reindeer Moss Eater ©   (2007-11-15 10:00) [6]

Так как Items радиогруппы сильно ограничены в шрифтах.

Уж если извращаться, то по полной.
Заменяем радиогруппу отдельно стоящими радиокнопками без подписей и ставим рядом свои красивые 3D лэйблы.


 
palva ©   (2007-11-15 10:08) [7]


> RTFlabel1.BringToFront;
> Но ничего не видно.

Попробовать вместо Label использовать StaticText


 
Reindeer Moss Eater ©   (2007-11-15 10:11) [8]

Статик текст тоже "сильно ограничен в шрифтах"
:)


 
palva ©   (2007-11-15 10:14) [9]


> Статик текст тоже "сильно ограничен в шрифтах"

Зато для него работает BringToFront


 
Reindeer Moss Eater ©   (2007-11-15 10:17) [10]

Зато для него работает BringToFront

Если его убрать, и пользоваться Items радиогруппы, то сам бринтуфронт не понадобится.
Автор - дизайнер красивого пользовательского интерфейса.


 
Юрий Зотов ©   (2007-11-15 10:18) [11]

> Lebedev   (15.11.07 09:48) [3]

> А как использовать метод BringToFront?

Это можно посмотреть в справке.

> Мне необходимо компонент Label (точнее RTFLabel) поместить по верх
> нидамиески создающегося RadioGroup.

Вы не прочитали [2], или не задумались над [2]. Если человек не читает ответов или не задумывается над ними, то непонятно, зачем он задает вопросы.

> В моём случае это возможно?

Возможно. Label.Parent := RadioGroup.


 
Reindeer Moss Eater ©   (2007-11-15 10:20) [12]

Возможно. Label.Parent := RadioGroup.

Это ж сколько программировать придется?!
У него лэйблы в дизайне на форме лежат, а радиогруппа на рантайме создается.

:)


 
Юрий Зотов ©   (2007-11-15 10:25) [13]

> Reindeer Moss Eater ©   (15.11.07 10:20) [12]

Я читал. Что ж...  зато человек поймет смысл рекомендации "не желай странного".


 
Lebedev   (2007-11-15 10:54) [14]

Ребят, вместо того, чтобы прикалывать, лучше бы просто помогали. Не все же такие крутые мегапрограммеры, как вы.

Если у меня такая проблема в задаче, то это следствие чего-то. И просто не имеет смысла пытаться мне советовать изменить узловия моей задачи. Так как это будет уже не моя задача (проблема).


> Возможно. Label.Parent := RadioGroup.


Можно это чуть подробнее объяснить, пожалуйста.


 
Johnmen ©   (2007-11-15 11:11) [15]


> Не все же такие крутые мегапрограммеры, как вы.

Это мы уже заметили. Что ты не крут. Что не мегапрограммер. А м.б. и не программер вовсе...
Но хоть один палец-то у тебя есть, чтобы нажать F1? И хоть один глаз, чтобы прочитать?

> Ребят, вместо того, чтобы прикалывать, лучше бы просто помогали.

А вот что нам лучше, мы сами как-нибудь решим.


 
Vice____   (2007-11-15 11:14) [16]


> Reindeer Moss Eater ©   (15.11.07 10:20) [12]
>  Label.Parent := RadioGroup


русским языком сказано)
Label.Parent := RadioGroup


 
Anatoly Podgoretsky ©   (2007-11-15 11:20) [17]

> Johnmen  (15.11.2007 11:11:15)  [15]

Да он не указывает, а на слабо берет, только какой толк отвечать, если ответы он не читает.


 
Юрий Зотов ©   (2007-11-15 11:26) [18]

> Lebedev   (15.11.07 10:54) [14]

Визуальные компоненты (контролы) бывают оконными (потомки TWinControl) и графическими (потомки TGraphicControl).  Чтобы контрол стал видимым, он должен иметь родительский констрол (Parent). Родительским контролом (парентом) может быть только оконный контрол.

Контролы всегда прорисовываются поверх своего парента, в его пределах и в его координатах (отсчитываются от левого верхнего угла парента). Чтобы контрол мог прорисоваться, ему нужна некая канва (точнее, не канва, а контекст устройства DC, но пока что не берите это в голову, а то крыша съедет). Оконные контролы имеют свою собственную канву и рисуются на ней, а графические контролы своей канвы не имеют и рисуются прямо на канве парента. Поэтому, если оконный и графический контролы имеют общего парента и прекрывают друг друга, то оконный контрол ВСЕГДА окажется выше графического (то есть, закроет его).

Это можно сравнить с крышкой стола (парент), на которой нарисованы рисунки (графические контролы) и лежат предметы (оконные контролы). Ясно, что предмет всегда будет поверх рисунка и никакие магические заклинания (BringToFront или SendToBack) тут не помогут.

А что нужно сделать, чтобы рисунок все же оказался поверх предмета? Нужно нарисовать его на самом предмете, а не на крышке стола. То есть, сделать парентом не форму, а тот контрол, поверх которого надо оказаться.

Теперь по сабжу. Label - это графический контрол. Форма, панель и RadioGroup - оконные контролы (причем если панель лежит на форме, то парентом панели эта форма и будет). Когда Вы кладете на форму (или на панель) Label, то форма (или панель) становится парентом этой Label. Далеее, в rin-time Вы создаете RadioGroup и ее парентом тоже делаете панель. И тогда Label НИКАК не может прорисоваться поверх RadioGroup.

А чтобы смог, надо парентом Label сделать эту самую RadioGroup. И не забыть назначить Label новые координаты.


 
Reindeer Moss Eater ©   (2007-11-15 11:29) [19]

Вот теперь самое время сказать "спасибо! а примерчик кода можно?"
:)


 
Юрий Зотов ©   (2007-11-15 11:34) [20]

> Reindeer Moss Eater ©   (15.11.07 11:29) [19]

Можно.

RG := TRadioGroup.Create(...);
...
Label1.Parent := RG;
Label1.SetBounds(...);


 
Johnmen ©   (2007-11-15 11:43) [21]

Ну и для полноты удовлетворения:
А поцеловать? (с)


 
Юрий Зотов ©   (2007-11-15 11:57) [22]

Злые вы. Уйду я от вас.
:о)


 
Anatoly Podgoretsky ©   (2007-11-15 12:07) [23]

> Юрий Зотов  (15.11.2007 11:57:22)  [22]

Не поцелуя?


 
Johnmen ©   (2007-11-15 12:09) [24]


> Юрий Зотов ©   (15.11.07 11:57) [22]

Не уйдешь! Ты ещё нужен!
:)


 
Lebedev   (2007-11-15 20:11) [25]

4 Юрий Зотов
Большое спасибо.

По-больше бы таких людей: тех, которые следуют назначению форумов.


 
Palladin ©   (2007-11-15 20:44) [26]

интересно... а что гласит это "назначение форумов"...


 
Lebedev   (2007-11-18 17:24) [27]

Есть проблема всё-таки.
Данный код работает только если я не добавляю  Items в динамически создающейся RadioGroup. Если же я добавляю Items, то метку не видно. Как мне добиться того, чтобы метка одображалась напротив Items?

Такой код не работает
RG := TRadioGroup.Create(...);
 RG.Items.Clear;
 RG.Items.Add("");
 RG.Items.Add("");
 RG.Items.Add("");
 RG.Items.Add("");
...
Label1.Parent := RG;
Label1.SetBounds(...);


Если же убрать
 RG.Items.Clear;
 RG.Items.Add("");
 RG.Items.Add("");
 RG.Items.Add("");
 RG.Items.Add("");

то метка отображается.

Но мне пункты выбора естественно необходимы. Как решить эту проблему?


 
ANTPro ©   (2007-11-18 19:15) [28]

> [27] Lebedev   (18.11.07 17:24)

Сами Itemы так же являются оконными контролами(TRadioButton).


 
Lebedev   (2007-11-19 03:42) [29]

И как тогда быть? Имён ведь у них нет...


 
Юрий Зотов ©   (2007-11-19 04:05) [30]

Label1.Parent := RG.Items[0];


 
Юрий Зотов ©   (2007-11-19 04:10) [31]

В [30] ерунду сказал. Чур, не читать.
:о)

Label1.Parent := TWinControl(RG.Controls[0]);
Label2.Parent := TWinControl(RG.Controls[1]);
...

А самое простое - положите Ваши Label"ы на панель, и тогда все разом:
Panel1.Parent := RG;
Panel1.BringToFront;
Panel1.SetBounds(...);


 
Lebedev   (2007-11-19 04:35) [32]

Спасибо!


Label1.Parent := TWinControl(RG.Controls[0]);
Label2.Parent := TWinControl(RG.Controls[1]);

Это не работает почему то. Хотя я пытался разместить ровно над items метки.

А вот идея с панелью здоровская! Сразу сработала. Только можно ли сделать, чтобы саму панель было незаметно? То есть её края не было видно.


 
Юрий Зотов ©   (2007-11-19 05:15) [33]

> Lebedev   (19.11.07 04:35) [32]

Внимательно посмотрите в Object Inspector"е какие свойства есть у панели. Переведите с английского их названия. Подумайте, что бы эти названия могли означать. Нет ли там чего подходящего? А если щелкнуть на свойстве и нажать F1, то получите его описание. Нередко и с примерами.

PS
Программизьм - это такая странная вешшчь, что ежели хочешь ему научиться, то нужно научиться добывать информацию самому. Иначе бесполезно.



Страницы: 1 вся ветка

Текущий архив: 2007.12.16;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.017 c
15-1194809006
vasIZmax
2007-11-11 22:23
2007.12.16
О мэйле


2-1195350978
.dn+
2007-11-18 04:56
2007.12.16
Динамическое PopupMenu


15-1195174258
Германн
2007-11-16 03:50
2007.12.16
И про футбол, но и не только :)


15-1195116215
lehich
2007-11-15 11:43
2007.12.16
резервная копия nokia 6230


2-1195232737
Nightmare
2007-11-16 20:05
2007.12.16
UpdateLayerWindow