Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.063 c
15-1154777427
Pazitron_Brain
2006-08-05 15:30
2006.09.03
Не определяется сетевая карта


15-1154692230
grisme
2006-08-04 15:50
2006.09.03
Базовые зниния C++


2-1155290985
GeLLeR
2006-08-11 14:09
2006.09.03
Label


2-1155529937
Yel
2006-08-14 08:32
2006.09.03
Создать новые объекты в рантайме


1-1153690420
Fantasy
2006-07-24 01:33
2006.09.03
многоязыковый интерфейс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский