Текущий архив: 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.53 MB
Время: 0.027 c