![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание формы
faiwer © (2010-09-25 11:28:00)Доброго времени суток. В моей программе, при редактировании или создании новой записи в БД, динамически создаются формы соответствующего типу записи класса. ~ таким образом:
procedure NewAExecute(Sender: TObject);
var
form: TForm;
begin
...
case a of
item_0: form:=TSome0F.NewRecord(..); // имена классов, разумеется
item_1: form:=TSome1F.NewRecord(..); // более адекватные, это для примера
end;
end;
...
TEditFormF = class(TForm);
...
public
constructor NewRecord(...);
...
end;
TSome0F = class(TEditFormF);
constructor TEditFormF.NewRecord(...);
begin
// MainF - главная форма, пробовал и от Application, не помогло
inherited Create(MainF);
...
end;
procedure TEditFormF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...
Destroy;
end;
И всё бы ничего, всё работает как часы, но созданные формы, даже будучи не активными отображаются поверх главного окна программы. Вот так: http://s57.radikal.ru/i155/1009/9b/2f1444faec5a.jpg
В своих прошлых проектах я не создавал формы "на лету", и они вели себя как нормальные окна, не затмевая главную форму, будучи не активными.
P.S. D2010, W7
Плохиш (2010-09-25 17:57:00) [1]Выкинь в файле проекта строчку
Application.MainFormOnTaskbar := True;
и можно баг в ембаргадеро отправлять.
faiwer (2010-09-25 17:37:00) [2]Нашёл решение здесь - http://www.programmersforum.ru/showthread.php?t=65809
Забавно, но там у человека получилась диаметрально-противоположная ситуация :) Не понимаю в чём дело. В общем сделал так, и помогло:
> TEditForm = class(TForm)
> ...
> protected
> procedure CreateParams(var Params: TCreateParams); override;
>
> ...
> end;
>
> procedure TEditFormF.CreateParams;
> begin
> inherited;
> Params.WndParent:=Application.Handle;
> end;
faiwer (2010-09-25 15:58:00) [3]Специально для вас, о мудрый учитель, склепал новый проект, который состоит только из описанного выше говнокода (без сторонних не сертифицированных примесей). Весит всего 9 Кб, если вы соизволите его открыть и нажать F9 в 10-ой RAD-студии, то убедитесь что проблема присутствует
Сам файл - http://www.sendspace.com/file/g8rubs
Плохиш (2010-09-25 15:40:00) [4]
> faiwer © (25.09.10 15:24) [4]
>
> Плохиш, Евгений Ваганович аплодирует стоя, но всё же, что
> по существу вопроса?)
Надо убрать из программы подобный уже озвученному дерьмокод.
PS. У меня 99% форм создаётся "на лету" и они никогда себя как описано в [0] не ведут, т.ч. делаю вывод - проблемы надо искать в вашем коде.
faiwer (2010-09-25 15:24:00) [5]Плохиш, Евгений Ваганович аплодирует стоя, но всё же, что по существу вопроса?)
Плохиш (2010-09-25 15:19:00) [6]
> Спасибо, не знал про такую возможность
Интересно, в какой дерьмокнижке рекомендуют выполнять Destroy в OnClose формы?
faiwer (2010-09-25 13:14:00) [7]
> Обычно это делается по-другому:
> procedure TEditFormF.FormClose(Sender: TObject; var Action:
> TCloseAction);
> begin
> ...
> Action := caFree;
> end;
Спасибо, не знал про такую возможность
> Возможно, при рисовании формы был установлен FormStyle =
> fsStayOnTop.
По умолчанию стоит fsNormal, в коде нигде это свойство не меняется, после загрузки так и остаётся fsNormal (только что проверил). Похоже дело не в этом. Самое обидное - фантазии не хватает, чтобы хотя бы нагуглить а эту тему, какой запрос написать )
RWolf (2010-09-25 12:49:00) [8]Возможно, при рисовании формы был установлен FormStyle = fsStayOnTop.
> procedure TEditFormF.FormClose(Sender: TObject; var Action: TCloseAction);
> begin ... Destroy;end;
Обычно это делается по-другому:
procedure TEditFormF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...
Action := caFree;
end;