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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание форм в рантайме, глючит что-то:( 
:(
    Опции темы
z-END
Дата 22.10.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



в приложении имеется куча вспомогательных модальных форм, которые создаются приблизительно так:
Код

{...}
var
  DemoForm: TDemoForm;
function DemoStart (Sender: TForm): boolean;

implementation

function DemoStart (Sender: TForm): boolean;
begin
 DemoForm := TDemoForm.Create (sender);
 DemoForm.Position := poOwnerFormCenter;
 result := DemoForm.ShowModal = mrOk;
 freeandnil(DemoForm);
end;

и часто бывает когда одна вспомогательная форма вызывает похожую функцию по созданию другой вспомогательной формы.
И тут выплыл один очень-очень неприятный глюк в операционных системах ниже Win2K - некотроые формы созданные по такому принципу почему-то создаются на "заднем плане" т.е. не перед той формой которая вызвала данную ф-цию а за ней.

Я чесно говоря даж незнаю в какую сторону копать, есть у кого какие мысли?


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

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


Эксперт
****


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

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



Код

function DemoStart: boolean;
begin
  DemoForm:= TDemoForm.Create(Application);
  with DemoForm do try
    result := DemoForm.ShowModal = mrOk;
  finally
    Release;
  end;
end;

И все у тебя будет нормально и работать как нужно


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
z-END
Дата 22.10.2005, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



Alex
в таком варианте я немогу позиционировать модальное окно по центру родителяsmile


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Самурай
Дата 22.10.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 20.10.2005
Где: Воронежская облас ть > Семилуки

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



Это почему же нельзя? Разве кто-то отменял формулу, по которой мы можем найти позицию крайнего верхнего правого угла окна?
Left новой формы равен Left родителя (предполагаемого) плюс Width div 2 родителя минус Width div 2 новой формы. По аналогии работа осуществляется и с Top.
Две строчки добавить перед вызовом формы и все готово: новая форма стоит по центру предполагаемого родителя. smile
PM MAIL ICQ   Вверх
YURIC
Дата 22.10.2005, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 5.8.2003

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



z-END

случайно не сработает такая команда:

DemoForm.Activate;

или

DemoForm.SetFocus;

smile
PM MAIL   Вверх
Quadr0
Дата 22.10.2005, 19:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 02:23
  Вверх
Самурай
Дата 22.10.2005, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 20.10.2005
Где: Воронежская облас ть > Семилуки

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



Цитата(Quadr0 @ 22.10.2005, 20:37)
Position := poDesktopCenter;

Это же не по центру "родителя" smile
PM MAIL ICQ   Вверх
Zero
Дата 22.10.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(z @ 22.10.2005, 17:56)
почему-то создаются на "заднем плане"

А как насчёт, сделать форму поверх всех, на долю секунды, а потом вернуть к прежнему состоянию:
Код

SetWindowPos(DemoForm.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE); //поверх
SetWindowPos(DemoForm.Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE); //обратно

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


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 02:24
  Вверх
Alex
Дата 22.10.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(z @ 22.10.2005, 19:00)
Alex
в таком варианте я немогу позиционировать модальное окно по центру родителя

smile а это в принцыпе и не желательно делать, т.к. родителя вашего могли сдвинуть куда угодно и если окно, которое вы вызываете маленькое, то оно просто может выйти за пределы экрана...


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
z-END
Дата 23.10.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



Цитата(Quadr0 @ 22.10.2005, 20:37)
Постой, а как ты вообще таким способом несколько одинаковых форм создаёшь?

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

Цитата
Это же не по центру "родителя"

очепятка =) имелось в виду OwnerForm
Цитата(Quadr0 @ 22.10.2005, 21:28)
А вообще то в таком случае будет AV, т.к. родителя-формы нет

нет и быть неможет т.к. для создания формы используется такая конструкция:
Код

procedure TMainForm.Click;
begin
if not DemoStart (Self) then exit;
{...}
end;

Цитата(Alex @ 22.10.2005, 22:45)
а это в принцыпе и не желательно делать, т.к. родителя вашего могли сдвинуть куда угодно и если окно, которое вы вызываете маленькое, то оно просто может выйти за пределы экрана...

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

а впринципе такой вариант создания формы неправильный?


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Alex
Дата 23.10.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(z @ 23.10.2005, 13:09)
а впринципе такой вариант создания формы неправильный?

У меня в приложении окола 100 форм и около 50 форм создается вот таким методом:
Код

procedure InputBank(...);
begin
  with TfrmInpBank.Create(Application) do try
      ...   
      ShowModal;
    end;
  finally
    Release;
  end;
end;


Скажу честно такой метод отображения форм используется практически во всех моих приложениях и никаких сбоев небыло. Да их в принципе не может быть, т.к. сделано с точки зрения создания и разрушения объектов все правильно.
Добавлено @ 13:03
z-END, не так давно я описывал некоторые методы работы при динамическом создании форм, почитайте я думаю много станет ясно.
http://forum.vingrad.ru/index.php?showtopi...hl=release&st=0
http://forum.vingrad.ru/index.php?act=ST&f=84&t=63068&st=0


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Guest
Дата 26.10.2005, 14:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Хотел попробовать создать форму в runtime, по этим примерам, но вылазит сообщение с ошибкой: 'Resource TDemoForm not found' smile Почему так?
  Вверх
z-END
Дата 26.10.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



Цитата(Guest @ 26.10.2005, 15:28)
TDemoForm

а у тебя она в проекте-то есть? smile
Добавлено @ 14:53
Alex, кстати подправил код на такой:
Код

function DemoStart : boolean;
begin
 DemoForm := TDemoForm.Create (Application);
 result := DemoForm.ShowModal = mrOk;
 freeandnil(DemoForm);
end;

но положительных результатов это не принесло...
проблема была в таб-контроле от BergSoft (надо было RAdmin'a слушать smile )... пришолсь заменить на стандартный и после этого все заработало...


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Guest
Дата 26.10.2005, 16:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(z @ 26.10.2005, 14:49)
а у тебя она в проекте-то есть?

Э..э..э... нету %) Я думал создаётся в runtime - это типа CreateWindowEx, т.е. без использования ресурсов. smile
Сейчас попробовал, если добавить форму, всё работает (Application.CreateForm из проекта убрал). =)
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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