Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2008, 15:32   #1
daunito
Пользователь
 
Регистрация: 01.03.2008
Сообщений: 25
По умолчанию Заморочка с дочерними окнами

Всем привет! У меня приложение MDI. Динамически создается куча дочерних окон. Глюк: если развернуть дочернее окно, то при открытии нового дочернего окна (с неизменяемыми размерами типа single) все окна восстанавливаются до нормального размера... А если сингловое окно сделать не дочерним, а обычным, то при потере фокуса оно вообще пропадает. Как можно от этого избавиться?
daunito вне форума Ответить с цитированием
Старый 03.12.2008, 17:05   #2
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

Код напиши пожалуйста ....
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 05.12.2008, 14:38   #3
daunito
Пользователь
 
Регистрация: 01.03.2008
Сообщений: 25
По умолчанию

Ворма создается так:

Код:
procedure TEditClientForm.DBLookupListBox3DblClick(Sender: TObject);
begin
 if EditContmanForm=nil then
  begin
   EditContmanForm:=TEditContmanForm.Create(self.GetParentComponent,
                                            ZReadOnlyQuery6id.Value);
   EditContmanForm.Visible:=true
  end
end;
Закрывается форма так:

Код:
procedure TEditContmanForm.Button2Click(Sender: TObject);
begin
if(MessageBox(self.Handle,'Сохранить внесенные изменения?','Подтвердите',MB_OKCANCEL)=IDOK) then
begin
 ZQuery1.ParamByName('ln').Value:=Edit1.Text;
 ZQuery1.ParamByName('fn').Value:=Edit2.Text;
 ZQuery1.ParamByName('mn').Value:=Edit3.Text;
 if DBLookupComboBox1.KeyValue<>0 then
    ZQuery1.ParamByName('d').Value:=DBLookupComboBox1.KeyValue
 else
    ZQuery1.ParamByName('d').Value:=Null;
 ZQuery1.ParamByName('mg_id').Value:=ContmanId;
 ZQuery1.ExecSQL;
 if EditClientForm<>nil then EditClientForm.ZReadOnlyQuery6.Refresh
end;
 EditContmanForm.Close;
end;
Если форма дочерняя то почему-то она не закрывается вообще! Если нормальная, то закрывается

13:46

И еще такой вопрос. При создании формы проверяется указатель, если он равен nil то форма создается, чтобы 2 такие формы одновременно не были открыты. Но почему-то при close указатель не обнуляется, зараза, а если прописать EditContmanForm:=nil в OnDestroy то вываливается ошибка Access violation

Намек насчет кнопки "Правка" понятен?
Читаем правила...

Последний раз редактировалось mihali4; 16.03.2009 в 22:41.
daunito вне форума Ответить с цитированием
Старый 05.12.2008, 14:53   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Кажется нужно обрабатывать у дочерней формы событие OnClose и там устанавливать значение Action. По-умолчанию они не то скрываются, не то сворачиваются. Я не помню уже, давно это было...
pu4koff вне форума Ответить с цитированием
Старый 05.12.2008, 14:57   #5
daunito
Пользователь
 
Регистрация: 01.03.2008
Сообщений: 25
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Кажется нужно обрабатывать у дочерней формы событие OnClose и там устанавливать значение Action. По-умолчанию они не то скрываются, не то сворачиваются. Я не помню уже, давно это было...
Да в том-то и дело, если форма sizable то она при close сворачивается, но у меня она singl. Я думаю из-за этого глюк. Вот как его обойти...
daunito вне форума Ответить с цитированием
Старый 05.12.2008, 15:14   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

попробовал создать single дочернюю MDI форму:
Код:
with tform2.Create(self) do
begin
  Show;
end;
Проблем никаких не заметил.

ЗЫ. у формы дочерней при создании размеры не пересчитываются? А то ведь в MDI либо всё развёрнуто на всю форму главную, либо все формы "нормального" размера

Последний раз редактировалось pu4koff; 05.12.2008 в 15:17.
pu4koff вне форума Ответить с цитированием
Старый 06.12.2008, 23:54   #7
daunito
Пользователь
 
Регистрация: 01.03.2008
Сообщений: 25
По умолчанию

Вообще писец. Докопался дальше. Даже если оставить в обработчике нажатия на кнопку ок только close, ошибка доступа. Если закрывать крестиком, то все в порядке. Может глюк делфи?
daunito вне форума Ответить с цитированием
Старый 07.12.2008, 01:18   #8
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

Вобщем тебе нужно в OnClose написать
Action:=caFree;
И формы дочерние формы будут уничажаться
slips вне форума Ответить с цитированием
Старый 16.03.2009, 22:12   #9
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию

Цитата:
Сообщение от slips Посмотреть сообщение
Вобщем тебе нужно в OnClose написать
Action:=caFree;
И формы дочерние формы будут уничажаться
не факт что они уничтожаются!!!!
я возился тут с этим вопросом
цитирую справку "caFree The form is closed and all allocated memory for the form is freed. " что в переводе "Форма закрыта и вся размещенная память для формы освобождена." е если проверить существование таким кодом:

Код:
if not assigned(form4) then
showmessage('Формы еще нет')
else
showmessage('Форма есть');
то узнаем что форма на самом деле существует.
вот и у меня вопрос. - Как уничтожить форму чтобы вновь создавалось одно окно
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 17.03.2009, 01:42   #10
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Цитата:
Сообщение от Paul Hindenburg Посмотреть сообщение

Код:
if not assigned(form4) then
showmessage('Формы еще нет')
else
showmessage('Форма есть');
Такая проверка чистейшей воды рэндом. После вызова метода Free память объекта помечается как свободная и будет затерта при последующих операциях выделения памяти. Ну не может объект своим же методом очистить занимаемую собой память!
Баламут вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с дочерними окнами artem779 БД в Delphi 3 17.03.2009 13:55
Вопрос: работа с окнами Акашаев Нурлан Общие вопросы Delphi 1 26.06.2008 10:12
глюк с окнами Delphi Andrei Win Api 4 06.02.2008 22:51
интерестная заморочка!;) АС Плюшкин Помощь студентам 3 29.10.2007 12:09
работа с окнами Briz Общие вопросы Delphi 5 07.10.2007 22:20