Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.07.2011, 19:40
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию Как закрыть форму?

Задача очень простая. При активизации формы проверяется некое условие. Если оно выполняется, то корректная работа формы невозможна, и её надо закрыть до устпанения причин.
Имеем текст программы
Код:
procedure TF_AddValueParam.FormActivate(Sender: TObject);
begin
  .... 
  ....
  if n =0 then Close;
  ....
  ....
end;
В данном случае, Close работает как Exit.
Наверно все правильно. Только вот мне то что делать?
Ответить с цитированием
  #2  
Старый 09.07.2011, 19:45
Аватар для Gravitas
Gravitas Gravitas вне форума
Новичок
 
Регистрация: 12.06.2011
Сообщения: 61
Версия Delphi: 7
Репутация: 38
По умолчанию

Application.Terminate
__________________
Gravitas
Ответить с цитированием
  #3  
Старый 09.07.2011, 20:52
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

Способ кардинальный. Закрывается программа, а не форма.
Дело в том, что вызываю и уничтожаю эту форму так:
Код:
  F_AddValueParam := TF_AddValueParam.Create(Self);
  F_AddValueParam.User := User;
  F_ValueList.Visible := False;
  F_AddValueParam.ShowModal;
  F_AddValueParam.Free;
  F_ValueList.Visible := True;
Мне надо просто выйти из формы. Остальное уже сделано. Может я что-то не понимаю или не то делаю? Подскажите пожалуйста.
Ответить с цитированием
  #4  
Старый 09.07.2011, 22:54
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,238
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от VANNIK002
Close работает как Exit
Всмысле, выход из процедуры? Или как Exit из программы? Во втором случае - у тебя эта форма является главной? Если да, то всё логично. В первом случае - вроде так и должно быть.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 09.07.2011, 23:14
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

Мне надо выйти из формы, а выходит только из процедуры. В любой другой процедуре Close закрывает форму где бы он ни стоял. Exit завершает работу процедуры. В обработчике события OnActivate Close не хочет закрывать форму, просто выходит из процедуры. Форма, из которой надо выйти, создаётся динамически см. #3

Последний раз редактировалось VANNIK002, 09.07.2011 в 23:18.
Ответить с цитированием
  #6  
Старый 09.07.2011, 23:34
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

1. Обязательно закрыть, спрятать недостаточно?
2. В каком контексте используется Close? Как привёл в примере, или имеется что то ещё?
3. Зачем вообще активизировать форму? Сделай проверку раньше.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 10.07.2011, 22:34
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
1. Обязательно закрыть, спрятать недостаточно?
2. В каком контексте используется Close? Как привёл в примере, или имеется что то ещё?
3. Зачем вообще активизировать форму? Сделай проверку раньше.


1. Спрятал, а дальше что, Вернуться то в вызывающую форому всёравно надо. Мало того, хотелось бы через выход, а не через другое место.
2. В этом Unit два Close. Один почти один в один как в примере. Другой в обработчике события кнопки Выход. К кнопке Выход вопросов нет.
3. Зачем активизировать форму? Я не знаю как работать с не активизированной формой. Сделать проверку раньше конечно можно, но это повлечёт серьёзное усложнение и увеличение кода.

Более - менее "нормальный" выход я нашел. Сделал на форме неактивным всё, кроме кнопки Выход. Работает, но смотреть противно.
Проблема закрыта, вопрос остался. Почему с помощью функции Close не закрывается форма, и не происходит возврат в вызывающую форму. Неужели я первый, кто столкнулся с этой проблемой???
Ответить с цитированием
  #8  
Старый 10.07.2011, 22:43
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Выйти из формы?

Код:
 Form2.close;

Серьёзное усложнение и увеличение кода?

Код:
 ...
 if твоя_переменная = нужному_значению then
  Form2.show;
 ...
Ответить с цитированием
  #9  
Старый 10.07.2011, 23:01
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

Я ЧАЙНИК но прежде, чем беспокоить занятых людей, читаю книги. У меня их много. Ваш вариант в одной из них описан и мной опробован....

Чтобы определить, можно ли работать с этой формой, делается запрос к базе данных. Прежде, чем сделать запрос, надо определиться с параметрами запроса. Если в запросе нет ни одной записи, то тогда не стоит открывать форму.
Ответить с цитированием
  #10  
Старый 10.07.2011, 23:04
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от VANNIK002
... Если в запросе нет ни одной записи, то тогда не стоит открывать форму.
Сам себе и ответил на поставленный вопрос.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 10.07.2011, 23:37
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

Конечно, только из под одной кнопки пока открывается одна из трёх форм, в зависимости от положения курсора в наборе данных SQL запрса. Дальше будет больше.

Еще раз.... Как обойти возникшую проблему, я для себя решил. ОСТАЛСЯ ВОПРОС. ПОЧЕМУ НЕ РАБОТАЕТ CLOSE? Вот на какой вопрос я хочу получить ответ.
Ответить с цитированием
  #12  
Старый 10.07.2011, 23:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от VANNIK002
... ОСТАЛСЯ ВОПРОС. ПОЧЕМУ НЕ РАБОТАЕТ CLOSE? ...
Это уже из области телепатии. Нужно видеть РЕАЛЬНЫЙ проект, чтобы понять ПОЧЕМУ.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 10.07.2011, 23:53
VANNIK002 VANNIK002 вне форума
Прохожий
 
Регистрация: 01.06.2011
Сообщения: 28
Репутация: 10
По умолчанию

Могу сбросить исходники вместе с базой данных любому, кто готов помочь разобраться в причинах такого поведения Close.Только скажите куда.
Ответить с цитированием
  #14  
Старый 11.07.2011, 04:00
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,238
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

http://dump.ru/
http://narod.ru/
Продолжать список?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #15  
Старый 11.07.2011, 09:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

Цитата:
Сообщение от VANNIK002
ОСТАЛСЯ ВОПРОС. ПОЧЕМУ НЕ РАБОТАЕТ CLOSE? Вот на какой вопрос я хочу получить ответ.
все очень просто если заглянуть в реализацию Close в модуле Forms:
Код:
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;
форма вызывается через ShowModal, соотв. будет выполняться красный код. а он только ModalResult присвоит значение mrCancel и все. если дальше покопать модуль Forms, то можно найти:
Код:
function TCustomForm.ShowModal: Integer;
var
  WindowList: Pointer;
  SaveFocusCount: Integer;
  SaveCursor: TCursor;
  SaveCount: Integer;
  ActiveWindow: HWnd;
begin
  CancelDrag;
  ...
    Show;
    try
      SendMessage(Handle, CM_ACTIVATE, 0, 0);
      ModalResult := 0;
      repeat
        Application.HandleMessage;
        if Application.FTerminate then ModalResult := mrCancel else
          if ModalResult <> 0 then CloseModal;
      until ModalResult <> 0;
      Result := ModalResult;
      SendMessage(Handle, CM_DEACTIVATE, 0, 0);
      if GetActiveWindow <> Handle then ActiveWindow := 0;
    finally
      Hide;
    end;
уже чувствуешь?)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ



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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter