Главная страница
    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,".....");

???



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

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

Наверх





Память: 0.54 MB
Время: 0.031 c
3-79678
Polevi
2004-01-30 10:31
2004.02.25
Запрос


1-79761
Igor G
2004-02-14 12:01
2004.02.25
Как уменьшить изображение


6-80049
Buffoon
2003-12-22 14:35
2004.02.25
Ссылки


14-80257
VEG
2004-02-04 00:12
2004.02.25
Вопрос об STL в C++Builder 6 и Visual C++ 6


1-79719
alextov
2004-02-12 16:25
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский