Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Form.Close   Найти похожие ветки 

 
ZX48 ©   (2006-08-14 17:39) [0]

GjПомите плиз. Не могу закрыть форму. В коде Form4.close, но не выполняется. В чем может быть проблема?


 
tesseract ©   (2006-08-14 17:39) [1]


>  Form.Close


код приведи.


 
StriderMan ©   (2006-08-14 17:39) [2]

код в студию


 
ZX48 ©   (2006-08-14 17:41) [3]

procedure TForm4.IniConnect(Sender: TObject);
var FileHandle : integer;
begin

if (FileExists(fn + "\base_cfg.cfg") = false) then
begin
if (MessageDlg(Файл недоступен",mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
FileHandle := FileCreate(fn + "\config.cfg");
FileClose(FileHandle);
form4.N10Click(form4);
form4.NFClick(Form4);
//iniconnect(Form4);
end else
begin
showmessage ("Программа будет закрыта!") ;
 form4.close;
end;
end;
end;


 
Джо ©   (2006-08-14 17:43) [4]

Убрать .form4, о результатах доложить :)


 
ZX48 ©   (2006-08-14 17:46) [5]

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


 
StriderMan ©   (2006-08-14 17:48) [6]


> showmessage ("Программа будет закрыта!") ;

а до сюда программа вообще доходит?


 
begin...end ©   (2006-08-14 17:50) [7]

В обработчике OnClose формы что-нибудь есть?


 
ZX48 ©   (2006-08-14 17:50) [8]

да. мессага то вылезает. и по выходу из процедуры я тоже тестовую месагу ставил - тоже показывается. не могу понять почему это? хотя тут же в меню по кнопке закрывается...


 
ZX48 ©   (2006-08-14 17:50) [9]

2 begin...end:
нет ничего


 
StriderMan ©   (2006-08-14 17:52) [10]

давай весь модуль формы


 
ANB ©   (2006-08-14 17:54) [11]

Есть у меня подозрение, что все это в OnCreate вызывается. Потому и не кусает :)


 
ZX48 ©   (2006-08-14 17:56) [12]

Извините, то что выше из более раннего pas. Приведу то что сейчас есть.Вот более полный код, что бы понятнее было:

procedure TForm4.FormCreate(Sender: TObject);
var  ini:tinifile;
begin
fn:= GetCurrentDir;
form4.iniconnect(form4) ;
ini:=tinifile.Create(fn+"\config.cfg");
try
akt:= strtoint (ini.readstring("print","akt",""));
otchet:= strtoint (ini.readstring("print","otchet",""));
base:= ini.readstring("main","base","");//ini.Free;
except
iniconnect(form4) ;
end;
BaseConnect(Form4);
showmessage (inttostr(exit));
 ini.Free;
if exit=1 then form4.Close;....(там ничего информативного далее нет)

procedure TForm4.BaseConnect(Sender:TObject);
begin
try
if data.ADOConnection1.Connected then data.ADOConnection1.Connected := false;
data.ADOConnection1.ConnectionString:= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ base +";Persist Security Info=False";
data.Action(form4);
//MessageDlg("Подключение к базе данных "+base+" выполненно успешно!", mtInformation,[mbOk], 0);
except
 if MessageDlg("База данных "+base+" недоступна или поврежден файл конфигурации! Выберите базу данных и сохраните настройки.",mtConfirmation, [mbYes, mbNo], 0) = mrYes then
 begin
 form4.N10Click(form4);
 //BaseConnect(Form4);
 end else
 begin
showmessage ("Программа будет закрыта!") ;
 close;
end;
end;
end;

procedure TForm4.IniConnect(Sender: TObject);
var FileHandle : integer;
begin

if (FileExists(fn + "\config.cfg") = false) then
begin
if (MessageDlg("Файл недоступен",
   mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
FileHandle := FileCreate(fn + "\config.cfg");
FileClose(FileHandle);
form4.N10Click(form4);
form4.NFClick(Form4);
//iniconnect(Form4);
end else
begin
showmessage ("Программа будет закрыта!") ;
 close;
end;
end;
end;


 
tesseract ©   (2006-08-14 17:58) [13]


> if (FileExists(fn + "\base_cfg.cfg") = false) then


if not FileExists(fn + "\base_cfg.cfg")  then


> if (MessageDlg(Файл недоступен",mtConfirmation, [mbYes,
> mbNo], 0) = mrYes) then

>

А если так

if (MessageDlg(Файл недоступен",mtConfirmation, [mbYes, mbNo], 0) <> mrNo) then


?


 
ZX48 ©   (2006-08-14 18:00) [14]

2 tesseract:Это все отрабатывается. Закрытие не работает...


 
tesseract ©   (2006-08-14 18:02) [15]


> if exit=1 then form4.Close;....(там ничего информативного
> далее нет)


так делать нельзя, и р,и в OnShow тоже.


> form4.iniconnect(form4) ;

а работать с создающимся объектом не вежливо, у тебя MessageDlg вообще показывается?

И это тоже в сторону. Вынеси работу с ini в отдельный файл, грузи его ДО создания формы.


 
ZX48 ©   (2006-08-14 18:05) [16]

>>И это тоже в сторону. Вынеси работу с ini в отдельный файл, грузи его ДО создания формы.

Т.е. создать отдельный модуль и потом из него вызывать основную форму?


 
ZX48 ©   (2006-08-14 18:06) [17]

>>MessageDlg вообще показывается?

Да. Все отрабатывается. Я так понял что не работает закрытие потому что объект Form4 еще не создан?


 
Loginov Dmitry ©   (2006-08-14 18:07) [18]

> Я так понял что не работает закрытие потому что объект Form4
> еще не создан?


Если бы это было так, то ты бы ловил AV каждые надцать секунд.


 
tesseract ©   (2006-08-14 18:07) [19]


> ZX48 ©   (14.08.06 18:06) [17]


Создан-то он создан, но вызывать close или hide из OnCreate и OnShow категорически запрещается в справке.


> Т.е. создать отдельный модуль и потом из него вызывать основную
> форму?


да это можно сделать в *.dpr  project -> View Source


 
Плохиш ©   (2006-08-14 18:08) [20]


> объект Form4 еще не создан

Form4 - это не объект.


 
ZX48 ©   (2006-08-14 18:08) [21]

Что тогда предлагаете? Отдельный модуль и не морочиться?


 
Loginov Dmitry ©   (2006-08-14 18:08) [22]

Попробуй вместо Close
Application.Terminate


 
ZX48 ©   (2006-08-14 18:11) [23]

Loginov Dmitry ©   (14.08.06 18:08) [22]
Попробуй вместо Close
Application.Terminate

Да уж...Как-то некрасиво получается...


 
Loginov Dmitry ©   (2006-08-14 18:14) [24]

> Да уж...Как-то некрасиво получается...


Что получается некрасиво?


 
StriderMan ©   (2006-08-14 18:14) [25]

1. убери везде внутри методов класса TForm4 обращение к переменной form4. Класс и так сам о себе все знает.
2. дело в том что у тебя действительно:

> ANB ©   (14.08.06 17:54) [11]
> Есть у меня подозрение, что все это в OnCreate вызывается.
>  Потому и не кусает :)


сделай вместо close Application.Terminate. (Мастера просьба не ругаться :))

если ты уверен что закрытие будет производится из обработчика OnCreate или процедур, вызванных этим обработчиком, достаточно вызвать Abort, и форма не создастся.

3. Делай все проверки до создания формы, а форму создавай вручную
form4 = TForm4.Create(nil);


 
Loginov Dmitry ©   (2006-08-14 18:15) [26]

> если ты уверен что закрытие будет производится из обработчика
> OnCreate или процедур, вызванных этим обработчиком, достаточно
> вызвать Abort, и форма не создастся.


Создастся


 
Loginov Dmitry ©   (2006-08-14 18:16) [27]

> 3. Делай все проверки до создания формы, а форму создавай
> вручную
> form4 = TForm4.Create(nil);


Лучше Application.CreateForm(),
иначе автор просто умрет отлавливать глюки с вездесущим form4.


 
StriderMan ©   (2006-08-14 18:16) [28]


> Loginov Dmitry ©   (14.08.06 18:15) [26]

да, пардон, с Abort это я махнул не глядя


 
ZX48 ©   (2006-08-14 18:17) [29]

3. Делай все проверки до создания формы, а форму создавай вручную
form4 = TForm4.Create(nil);

Поподробнее можно? Как это будет работать. Я думал form4:=tform4.Create(form0) должно быть?


 
StriderMan ©   (2006-08-14 18:20) [30]


> ZX48 ©   (14.08.06 18:17) [29]

в скобках указывается т.н. Owner. Чтоб понять для чего это нужно, лучше почитать книжки. в данном случае если создавать так, то можно не беспокоиться о разрушении объекта формы, Owner разрушит все сам когда разрушится. если ты указываешь nil, то сам должен побеспокоиться о разрушении созданного тобой объекта формы.


 
ZX48 ©   (2006-08-14 18:22) [31]

Хорошо! Всем спасибо! Буду выносить проверку в отдельный модуль.


 
Loginov Dmitry ©   (2006-08-14 18:22) [32]

> Поподробнее можно? Как это будет работать.


В файле проекта *.dpr перед Application.Initialize выполняешь все необходимые проверки. И тама можешь выходить из программы как хочешь, хоть с помощью Halt.


 
Loginov Dmitry ©   (2006-08-14 18:24) [33]

> хоть с помощью Halt.


А лучше так:

if ВсеНормально then
begin
 Application.Initialize;
 ...
 Application.Run;
end;


 
StriderMan ©   (2006-08-14 18:26) [34]

сделай так:

procedure ShowForm4;
begin

 //тут сделай все проверки

 with TForm4.Create(nil) do
 try
   ShowModal;
 finally
   Free;
 end;
end;


при таком подходе не забудь убрать эту форму из списка Auto-Create
(Project-Options-Forms)


 
ZX48 ©   (2006-08-14 19:10) [35]

Спасибо. Все получилось


 
Anatoly Podgoretsky ©   (2006-08-14 19:28) [36]

при таком подходе не забудь убрать эту форму из списка Auto-Create

Этого недостаточно, надо еще убрать переменную формы, с этого и начать.



Страницы: 1 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.073 c
2-1155562900
Слон
2006-08-14 17:41
2006.09.03
Нужна помощь с заданием.


1-1153458662
Lokk
2006-07-21 09:11
2006.09.03
строка состояния броузера


15-1155237754
GanibalLector
2006-08-10 23:22
2006.09.03
Сайт(редактирование данных MySQL)


2-1155562490
Tema
2006-08-14 17:34
2006.09.03
Помогите с условием!


2-1155730366
AlexanderMS
2006-08-16 16:12
2006.09.03
Ошибка : Class TColorDialog not found .