Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окно "поверх всех", проблема 
:(
    Опции темы
Maykl
Дата 16.3.2005, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.3.2005
Где: г.Белгород

Репутация: нет
Всего: нет



Надо сделать сабж.

Обрабатываю выбор в меню. Пишу:

Код

with Sender as TMenuItem do
  begin
    Checked := not Checked;
    if Checked
      then FormStyle := fsStayOnTop
      else FormStyle := fsNormal;
  end;


Перерисовывается ВСЁ, smile т.е. программа запускается с начала.

Помогите smile

Заранее благодарен (как и за все предыдущие подсказки) smile

PM MAIL ICQ   Вверх
Snowy
Дата 16.3.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



При изменении FormStyle происходит полное пересоздание окна.
Окно создается заново, получает новый хэндл и т.п.
Естественно оно перерисовывается.
PM MAIL   Вверх
Zero
Дата 16.3.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(Maykl @ 16.3.2005, 11:48)
Надо сделать сабж.

Это делается с помощью API:
поверх всех:
Код

SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
обратно:
Код

SetWindowPos(Form1.Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE); 

PM MAIL ICQ   Вверх
Maykl
Дата 16.3.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.3.2005
Где: г.Белгород

Репутация: нет
Всего: нет



Объяснение понятно. НО! как этого избежать? А то у меня в начале запускается Заставка, форма ввода...

Опоздал...

Попробую API...

smile Ра-бо-та-ет!!! Спасибо!

Это сообщение отредактировал(а) Maykl - 16.3.2005, 12:02
PM MAIL ICQ   Вверх
Maykl
Дата 22.3.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.3.2005
Где: г.Белгород

Репутация: нет
Всего: нет



О-па! а вот и глюк!

Из меню - всё работает.
При нажатии кнопки (связанной с меню) в тулбаре выскакивает сообщение:

Проект XXX.exe вызвал исключение класса EInvalidCast с сообщениес 'Invalid class typecast'.
Процес остановлен. используйте Шаг или Запуск для продолжения.


тишина. ПО-МО-ГИ-ТЕЕЕЕЕЕЕЕЕЕЕЕ!!!!!!!!!!!! smile

Это сообщение отредактировал(а) Maykl - 22.3.2005, 15:00
PM MAIL ICQ   Вверх
Maykl
Дата 22.3.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.3.2005
Где: г.Белгород

Репутация: нет
Всего: нет



тишина. ПО-МО-ГИ-ТЕЕЕЕЕЕЕЕЕЕЕЕ!!!!!!!!!!!! smile
PM MAIL ICQ   Вверх
<Spawn>
Дата 22.3.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Maykl Ну дак ты сам же в своем коде приводишь указатель на экземпляр класса к TMenuItem, а кнопка не является таковой(но при этом связана с этим кодом и в Sender лежит указатель на экземплял кнопки), т.е. она TButton (Или какая то другая вариация, но суть в том что данное приведение типов не возможно) smile

Варианты решения проблемы:

1) Явно указывать экземпляр TMenuItem
2) Проверять принадлежность экземпляра класса(Sender) к TMenuItem или TButton RTTI операцией is.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
_hunter
Дата 22.3.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



ты код покажи ( на котором облом идет )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Maykl
Дата 22.3.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.3.2005
Где: г.Белгород

Репутация: нет
Всего: нет



При чём тут TMenuItem ?

Я же код взял тот, что Zero подсказал. в API. (писал ЗАРАБОТАЛО!!!)

Это код для меню. А у кнопки событие OnClick стоит в Nmenu2_1Click

Код

{поверх всех}
procedure TForm1.Nmenu2_1Click(Sender: TObject);
begin
  with Sender as TMenuItem do
  begin
  Checked := not Checked;
  if Checked
    then SetWindowPos(Form1.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE)
    else SetWindowPos(Form1.Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
  end;
end;

PM MAIL ICQ   Вверх
_hunter
Дата 22.3.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



есть подозрение что Sender -- это меню а не его итем.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
<Spawn>
Дата 22.3.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Maykl А при том что код обработки клика на TMenuItem или на TButton передает в событие указатель на себя - это есть Sender. При клике на меню все будет так как и должно быть!!! А при клике на кнопке передастся указатель на TButton, а он ни как не может быть приведен к TMenuItem откуда и получаем Invalid Type Cast


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Maykl
Дата 23.3.2005, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.3.2005
Где: г.Белгород

Репутация: нет
Всего: нет



Понял. Короче, надо аналогичный код написать для кнопки!
PM MAIL ICQ   Вверх
_hunter
Дата 23.3.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



не обязательно. как тебе уже выше писалиЖ проверяй какого типа Sender и если он TMenuItem -- чекай его, если кнопка -- ничего не делай...
+ совет по организации кода:
если одни и те же действия выполняются в разных местах программы -- вынеси эти действия в отдельную функцию


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4003 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.