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

Вниз

OnCreate   Найти похожие ветки 

 
DimonNew   (2004-02-11 11:04) [0]

Привет! Подскажите, плз. Как можно отказаться от создания формы в обработчике создания формы OnCreate.


 
alex_***   (2004-02-11 11:07) [1]

попробуй Abort, не прокатит - Application.Terminate - эффективность 100%


 
Sandman25   (2004-02-11 11:08) [2]

Проверить условия ДО создания формы.


 
DimonNew   (2004-02-11 11:11) [3]

Спасибо!


 
Юрий Федоров   (2004-02-11 11:16) [4]

либо [2], либо переопределить constructor формы, и поднять в нем исключение (например, вызвать Abort)


 
Тимохов   (2004-02-11 11:16) [5]


> alex_*** © (11.02.04 11:07) [1]

Abort не прокатит - форма все равно создастся, т.к. TCustomForm по умолчанию гасит исключения в OnCreate.
В Д6 надо перекрыть либо TCustomForm.HandleCreateException, либо TCustomForm.DoCreate.


 
Verg   (2004-02-11 11:21) [6]

Может быть Release?


 
alex_***   (2004-02-11 11:28) [7]


Проверить условия ДО создания формы.

лучший вариант, ИМХО. Остальное уже кривой код с заплатками и за такой код можно бабки снимать с з/п.


 
ssk   (2004-02-11 11:34) [8]

Halt


 
Тимохов   (2004-02-11 11:36) [9]


> лучший вариант, ИМХО. Остальное уже кривой код с заплатками
> и за такой код можно бабки снимать с з/п.

Спорное мнение, т.к. имхо если бы метод с перекрыванием DoCreate был кривой с постановкой на бабки, то его был дельфисты не сделали Virtual. ^)))))))

Вот кусочек хелпа про HandleCreateException

Handles exceptions that are raised by the OnCreate event handler.
function HandleCreateException: Boolean; dynamic;
Description
The form calls HandleCreateException internally if the OnCreate event handler raisesthrows an exception. HandleCreateException forwards the exception on to the application object, which generates an OnException event. If there is no OnException event handler, the application displays an exception message box.
HandleCreateException returns True if it handles the exception, False otherwise.


 
hexone   (2004-02-11 11:37) [10]


> лучший вариант, ИМХО. Остальное уже кривой код с заплатками
> и за такой код можно бабки снимать с з/п.

Если условие выхода зависит от созданных в RunTime элементов этой же формы. Тоже бабки снимать станешь?


 
Sandman25   (2004-02-11 11:39) [11]

[10] hexone © (11.02.04 11:37)

Это как? Типа до OnCreate еще не ясно, какими будут эти компоненты? В OnCreate происходит чтение из регистра или показ модальной формы с вводом пароля?


 
hexone   (2004-02-11 11:44) [12]


> [10] hexone © (11.02.04 11:37)
>
> Это как? Типа до OnCreate еще не ясно, какими будут эти
> компоненты? В OnCreate происходит чтение из регистра или
> показ модальной формы с вводом пароля?

Ну либо табличка на формочке лежит. Пока она не создастся нельзя сделать Open, если Open прошел неудачно нет смысла показывать форму.


 
Sandman25   (2004-02-11 11:46) [13]

[12] hexone © (11.02.04 11:44)

Согласен. Хороший пример.


 
Юрий Федоров   (2004-02-11 11:49) [14]

>>Sandman25 © (11.02.04 11:39) [11]
Какими будут компоненты (параметры) может стать ясно уже в конструкторе, например если его переопределили с reintroduce и передали туда параметры формы. Логика программы может быть такая, что не удобно проверять условия до созданя - тут уже надо решать по конкретной ситуации

>>Halt
>>Application.Terminate

Кстати, нигде не сказано, что речь идет о главной форме

>>Тимохов © (11.02.04 11:16) [5]
Зачем же так усложнять ? Не проще исключение в конструкторе ?


 
alex_***   (2004-02-11 11:51) [15]

открывать табличку после Create. Как вариант сделать public метод function "Проверить условие":Boolean; и не идти в показ формы. Просто и наглядно. А так останавливать конструктор - нештатная ситуация.


 
Тимохов   (2004-02-11 11:52) [16]


> Юрий Федоров © (11.02.04 11:49) [14]
> >>Тимохов © (11.02.04 11:16) [5]
> Зачем же так усложнять ? Не проще исключение в конструкторе
> ?

Конечно, не надо усложнять, но речь в вопросе шла именно про OnCreate.


 
Sandman25   (2004-02-11 11:53) [17]

[14] Юрий Федоров © (11.02.04 11:49)

Понятно.


 
Юрий Федоров   (2004-02-11 11:57) [18]

>>Тимохов © (11.02.04 11:52) [16]
Думаю, это условие не столь принципиально :-)


 
hexone   (2004-02-11 12:04) [19]


> открывать табличку после Create. Как вариант сделать public
> метод function "Проверить условие":Boolean; и не идти в
> показ формы. Просто и наглядно. А так останавливать конструктор
> - нештатная ситуация.

Резюмируя:
1. Делать что-то до создания
2. OnCreate - ничего не делать
3. OnShow - делать что-то дальше.
вообщем исключить обработчик события OnCreate в принципе.


 
Юрий Федоров   (2004-02-11 12:16) [20]

> открывать табличку после Create. Как вариант сделать public
> метод function "Проверить условие":Boolean; и не идти в
> показ формы. Просто и наглядно. А так останавливать конструктор
> - нештатная ситуация.

Останавливать конструктор - ситуация вполне штатная.


 
Sandman25   (2004-02-11 12:19) [21]

[20] Юрий Федоров © (11.02.04 12:16)

Ну, для кого-то и писать свой аналог VCL - ситуация штатная :)


 
Тимохов   (2004-02-11 12:21) [22]


> Ну, для кого-то и писать свой аналог VCL - ситуация штатная
> :)

Не ясна Ваша ирония - в любом конструкторе теоретически может быть ошибка (например, памяти не хватило на создание объекта). Чем данный случай отличается от намеренного прерывания конструктора?


 
Sandman25   (2004-02-11 12:26) [23]

[22] Тимохов © (11.02.04 12:21)

Только не говорите мне, что Вы все Create ставите в try-except.
Если произошла ошибка памяти, нормальная работа все равно будет невозможна - форма покажется, но одновременно выскочит и "страшное сообщение". Хотя, возможно, даже сообщение об ошибке не покажете и в log файл не запишете. По причине все той же нехватки памяти или сбоя Windows.
Кстати, Вы with Txxx.Create do используете? А как же перехват ошибок? :)


 
alex_***   (2004-02-11 12:27) [24]


Останавливать конструктор - ситуация вполне штатная.

ну скажем ситуация, связанная с непредвиденными ошибками (сродни ситуации с assert). Но здесь логическая ошибка и обработать её лучше на лог. уровне, ИМХО. Да и придется исключение обрабатывать или проверять создался ли объект.

p.s. У меня никогда не доходило до необходимости вручную гасить объект на создании в таких случаях типа "нет записей" и т.д.


 
Тимохов   (2004-02-11 12:28) [25]


> with Txxx.Create do

Не использую.

> Только не говорите мне, что Вы все Create ставите в try-except.

Не очень ясно - к чему это.


 
Sandman25   (2004-02-11 12:37) [26]

[25] Тимохов © (11.02.04 12:28)

К тому, что если использовать Ваш подход, то например при нехватки памяти для создания TComboBox нужно обходиться без него.
Например, так

OnCreate:

try
ComboBox1 := TComboBox.Create(Self);
except
ComboBox1 := nil;
ShwoMessage("Ну что ж поработаем без Combobox1...");
end;

if Assigned(ComboBox) then
begin
ComboBox1.Items.Add(..);
...
end;

OnbtSaveClick:
if Assigned(Combobox1) then
// проверка на правильность ввода ComboBox

Ну и так далее...


 
Юрий Федоров   (2004-02-11 12:39) [27]

никаких try - except в конструкторе обычно не нужно.
Более того, такую ошибку чаще всего и не нужно перехватывать - она попадет в обработчик на уровне приложения и высветится осмысленным MessageBox"ом
Все просто и прозрачно.
Проверять - создан ли объект опять же не нужно, потому что мы просто не попадет на след. после конструктора строку, где идет работа с этим объектом

>>Но здесь логическая ошибка и обработать её лучше на лог. уровне

Это и есть логический уровень - логика управлением последовательностью вызовов


 
Игорь Шевченко   (2004-02-11 12:44) [28]


> Более того, такую ошибку чаще всего и не нужно перехватывать
> - она попадет в обработчик на уровне приложения и высветится
> осмысленным MessageBox"ом


А если мне не хочется MessageBox ?


 
Юрий Федоров   (2004-02-11 13:03) [29]

>>Игорь Шевченко © (11.02.04 12:44) [28]

Это же не наш метод :-))
Впрочем, я так и сказал - "чаще всего" :-)


 
Barbarian five   (2004-02-11 13:28) [30]

Не могу понять, почему нельзя проверить все до вызова TForm.Create? Вынесите функцию проверки нужности создания формы в классовую функцию класса TForm и все ок! Или классовыми функциями никто пользоваться не умеет?


 
alex_***   (2004-02-11 13:37) [31]

а как ты проверишь наличие записей в query без создания формы или DM?


 
Тимохов   (2004-02-11 13:39) [32]


> Barbarian five (11.02.04 13:28) [30]

Чем Вам все-таки не нравятся конструкторы, могущие генерить исключения. Номальный метод ИМХО - по крайней мере в дельфи.
А потом 31 - действительно как?


 
Sandman25   (2004-02-11 13:43) [33]

[31] alex_*** © (11.02.04 13:37)

procedure FormShowModal(xxx);
begin
if FMyForm = nil then
FMyForm := TMyForm.Create...
if FMyForm.LoadData(xxx) then
FMyForm.ShowModal;
...
end;


 
alex_***   (2004-02-11 13:55) [34]

[33] - > см. [15]


 
Barbarian five   (2004-02-11 14:05) [35]

[31] а что, query у нас теперь формо-зависимый класс?


 
Юрий Федоров   (2004-02-11 14:35) [36]

Начинающие программисты не знают, что такое Exception
продолжающие знают, и старательно их давят
и уже след. уровень - самому вызывать raise

По хоршему, если все проверять с помошью if - мы получим жуткий код. Проверить нужно будет кучу вещей, и в большинстве случаев уйти на один и тот же кусок кода в случае неудачи. Причем по хорошему, пользователю неплохо бы сообщить, почему операция, которую он запустил на выполнение, не выполняется. А вариантов масса - как ошибок прикладного уровня, так и системного
Когда я вижу код
try
....
except
\\глухое подавление
end;
Мне хочется рвать и метать (за редким исключением - например не удалось считать ширину и высоту формы из реестра). Потому что это приводит к тому, что пользователь не знает, почему он нажал кнопку и не увидел никакой формы на экране.
То ли нет данных в таблице, то ли вообще не удалось подключиться к серверу, а может быть - просто памяти не хватило ? При обработке всех ситуаций по отдельности мы получит как раз тот код, за который можно вычитать из зарплаты
Поднимая raise - мы направляем управление по тому же пути, как оно пойдет при исключении, поднятом не прикладным программистом, избежав таким образом кучи логических ошибок и разрастания кода


 
alex_***   (2004-02-11 14:35) [37]

а что нет? если кидается в design-time?


 
Игорь Шевченко   (2004-02-11 15:05) [38]


> (за редким исключением - например не удалось считать ширину
> и высоту формы из реестра).


if ValueExists(...) then
ReadInteger

Про Exceptions - все хорошо в меру. Когда Exceptions используются для обеспечения нормальной логики работы алгоритма, это неудачно.


 
KSergey   (2004-02-11 15:24) [39]

[23] Sandman25 © (11.02.04 12:26)
Только не говорите мне, что Вы все Create ставите в try-except.

Буду говорить.
Только в try-finally, а не в try-except.

Кстати, Вы with Txxx.Create do используете? А как же перехват ошибок? :)
А в чем проблема, я не пойму?

with Txxx.Create do
try
...
finally
Free;
end;


[24] alex_*** © (11.02.04 12:27)
Да и придется исключение обрабатывать или проверять создался ли объект.


Вы это не проверяете??? Вот за это точно можно бабки снимать, если уж на то пошл о!

[28] Игорь Шевченко © (11.02.04 12:44)
А если мне не хочется MessageBox ?


Использовать Abort ;)

Впрочем, [36] Юрий Федоров пожалуй уже все написал.


 
alex_***   (2004-02-11 15:41) [40]

to [39]

проверять создался ли объект.

если честно, то нет. если валится конструктор, то вылетает исключение и ,как правило, я ему позволяю обработаться по умолчанию, поскольку "выпадение" конструктора я считаю ситуацией, когда дальнейшее продолжение действия не имеет смысла. Бывают исключения, конечно, но основная схема у меня такова.
p.s. а ты предлагаешь что-то типа того?

obj := TSomeObj.Create();
Assert(obj<>nil,".....");

???


 
KSergey   (2004-02-11 15:52) [41]

> [40] alex_*** © (11.02.04 15:41)
> to [39]
> p.s. а ты предлагаешь что-то типа того?
>
> obj := TSomeObj.Create();
> Assert(obj<>nil,".....");

Не пойму о чем это.
Я считаю так: если конструктор выполнился без исключений - то очевидно, что объект создался, и в приведенной строке Assert(obj<>nil,".....") смысла просто нет.
Если внутри конструктора вылетело исключение - то на следующую строку просто не попадаем - т.е. смысла в ней опять нет.
Так зачем же в приведенном коде написана вторая строка??


 
Тимохов   (2004-02-11 15:54) [42]


> obj := TSomeObj.Create();
> Assert(obj<>nil,".....");

И вы думаете, что assert когда нить может выдать сообщение?


 
Sandman25   (2004-02-11 15:57) [43]

[39] KSergey © (11.02.04 15:24)

with Txxx.Create do
...

На выполнении Create происходит Exception. Чтобы его перехватить, нужно заключить Txxx.Create в try часть try-except. fianlly тут вообще не причем.


 
alex_***   (2004-02-11 16:20) [44]

to KSergey ©

Да и придется исключение обрабатывать или проверять создался ли объект.

Вы это не проверяете??? Вот за это точно можно бабки снимать, если уж на то пошло!

я вот насчет проверки и подивился. Зачем это проверять объект сразу после создания.


И вы думаете, что assert когда нить может выдать сообщение?

а зачем мне от него нужно сообщение? пусть сгенерит исключение и пустит дальше по цепочке.


 
KSergey   (2004-02-12 08:06) [45]

> Sandman25 © (11.02.04 15:57) [43]
> [39] KSergey © (11.02.04 15:24)
>
> with Txxx.Create do
> ...
>
> На выполнении Create происходит Exception. Чтобы его перехватить,
> нужно заключить Txxx.Create в try часть try-except. fianlly
> тут вообще не причем.

Ничего не надо перехватывать.
Видимо, вы не в курсе, что дельфи сама неявно все вызовы конструкторов объектов заключает в try/except, при этом если в конструкторе происходит исключение - то автоматически (без какого-либо моего кода!) произойдет вызов деструктора. (Большое спасибо местным мастерам за эти мои знания.)
А потому я пишу именно

with Txxx.Create do
try
...
finally
Free;
end;

т.к. если в конструкторе произойдет исключение - то дестпуктор вызовется и так. А вот если уж объект успешно создался - то меня интересует лишь гарантированный вызов деструктора (через Free), а не проблема гашения возникших исключений.


 
Runner   (2004-02-12 09:15) [46]

Вот еще одно подтверждение того, что люди в этом форуме, если и соизволят ответить, то не для того чтобы помочь, а для того чтобы выпендриться. Чо вы грызетесь-то? Чел уже давно сказал "спасибо" и срулил. Эх вы... "мастера"...


 
Anatoly Podgoretsky   (2004-02-12 09:38) [47]

В данной ситуации типовой и удачной конструкцией является такая

with TformX.Create do
try
...
if Check then ShowModal;
...
finally
Free;
end;


 
Юрий Федоров   (2004-02-12 10:26) [48]

>>Runner (12.02.04 09:15) [46]
А вы что-то говорите только для того, чтобы выпендриться или погрызться ? Не допускаете мысли, что это была обычная дискуссия с целью выяснить истину? Причем совершенно без "грызни" ?


 
KSergey   (2004-02-12 10:42) [49]

> [46] Runner (12.02.04 09:15)

За внешнюю резковатость формулировки "Видимо, вы не в курсе" - прошу прощения.
Однако, на мой взгляд, если автор и сказал "я доволен", тема, возможно, кому-то еще покажется так же интересной - а потому отвечать шире поставленного вопроса - ничего в том странного нет. Как мне кажется.


 
Sandman25   (2004-02-12 10:44) [50]

[45] KSergey © (12.02.04 08:06)

см. [25]


 
Sandman25   (2004-02-12 10:47) [51]

Точнее, [26].


 
KSergey   (2004-02-12 11:22) [52]

> [51] Sandman25 © (12.02.04 10:47)
> см. [25]
> Точнее, [26].

Перечитал 25, 26, 45.
Связи не понял. Нельзя ли пространнее изъясняться, если это еще актуально, конечно? ;)


 
Sandman25   (2004-02-12 11:36) [53]

[52] KSergey © (12.02.04 11:22)

Я бы предпочел сдаться, если Вы не против :)
Всему свое время и место. Это я о приемах программирования.


 
KSergey   (2004-02-12 12:28) [54]

Предлагаю просто считать, что консенсус достигнут ;)


 
Sandman25   (2004-02-12 12:33) [55]

:)



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

Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.031 c
3-79663
lic_
2004-01-30 14:12
2004.02.25
Кодировка


9-79520
AQUALITY
2003-08-16 18:59
2004.02.25
Вопрос о коллизии


3-79589
ulyanitsky
2004-01-25 22:09
2004.02.25
Создание структуры БД. Что лучше?


14-80299
MBo
2004-01-30 08:37
2004.02.25
Пятница... Задачка ;)


7-80307
--= Eagle =--
2003-12-06 09:16
2004.02.25
Как читать байты из памяти запущенной проги?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский