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

Вниз

Тест по Delphi при приеме на работу   Найти похожие ветки 

 
KSergey ©   (2005-01-26 14:24) [80]

> [74] Юрий Зотов ©   (26.01.05 14:18)
> Конструктор и OnCreate - вещи, принципиально разные.

Я вижу только 2 разницы:

1.OldCreateOrder
2.Давятся все исключения, возникшие в OnCreate...

Впрочем, опять же на вопрос "почему нет" это как-то не отвечает...
Есть еще что-то?

> [73] default ©   (26.01.05 14:14)
> ведь OnCreate всплывает на WM_CREATE

Что-то не правда ваша... или я что-то пропустил?


 
begin...end ©   (2005-01-26 14:26) [81]

> [79] Юрий Зотов ©   (26.01.05 14:24)

Перестановка байт внутри слова?


 
jack128 ©   (2005-01-26 14:26) [82]

Да нафиг не нужен OnCreate ни форме, ни датамодулю.. Всегда можно AfterConstruction или Create перекрыть ;-)

default ©   (26.01.05 14:14) [73]
ведь OnCreate всплывает на WM_CREATE

нет, это не так.  исходники VCL рулят безбожно..


 
KSergey ©   (2005-01-26 14:27) [83]

> [79] Юрий Зотов ©   (26.01.05 14:24)
> Физического расположения в памяти.

Вот нифига себе... Ладно, буду думать...


 
Юрий Зотов ©   (2005-01-26 14:27) [84]

> KSergey ©   (26.01.05 13:59) [69]

> TCustomForm - это можно считать компонентом?
Не можно, а нужно!

> Или компонент - то, что на палитре?
Компонент - это TComponent и ВСЕ его наследники. Никакая палитра тут ни при чем.


 
KSergey ©   (2005-01-26 14:29) [85]

> [84] Юрий Зотов ©   (26.01.05 14:27)
> > TCustomForm - это можно считать компонентом?
> Не можно, а нужно!

О, спасибо
Это я и хотел услышать.

Тогда, считаю, верный ответ ("в каком компоненте впервые появляется OnCreate) все же TCustomForm, а не TForm. Это если формально придираться.

Но выяснил это только по справке. никогда не задумывался почему и отчего....


 
Игорь Шевченко ©   (2005-01-26 14:31) [86]

jack128 ©   (26.01.05 14:26) [82]

А вот и нифига


 
default ©   (2005-01-26 14:32) [87]

Юрий Зотов ©   (26.01.05 14:22) [77]
согласен, не обязательно
KSergey ©   (26.01.05 14:18) [75]
наверно потому что форма - контейнер видимых и не видимых контролов
и при её создании может потреб-ся какие-то действия с ними или другие ведь создание формы это начало работы приложения(в большинстве случаев) мало ли чего может потребоваться
а OnCreate для едитов и прочей фигни смысла нет делать - они могут "восполниться" в OnCreate формы всё


 
KSergey ©   (2005-01-26 14:43) [88]

> [87] default ©   (26.01.05 14:32)
> а OnCreate для едитов и прочей фигни смысла нет делать -
> они могут "восполниться" в OnCreate формы всё

Я тоже только это мог предположить именно с той же мотивацией, однако ответ "нафиг-зафиг" уже был
И он никак не согласуется с "подсказками"..


 
default ©   (2005-01-26 14:45) [89]

"constructor TCustomForm.Create(AOwner: TComponent);
begin
 GlobalNameSpace.BeginWrite;
 try
   CreateNew(AOwner);
   if (ClassType <> TForm) and not (csDesigning in ComponentState) then
   begin
     Include(FFormState, fsCreating);
     try
       if not InitInheritedComponent(Self, TForm) then
         raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
     finally
       Exclude(FFormState, fsCreating);
     end;
     if OldCreateOrder then DoCreate;
   end;
 finally
   GlobalNameSpace.EndWrite;
 end;
end;

procedure TCustomForm.DoCreate;
begin
 if Assigned(FOnCreate) then
 try
   FOnCreate(Self);
 except
   if not HandleCreateException then
     raise;
 end;
 if fsVisible in FFormState then Visible := True;
end;

procedure TCustomForm.AfterConstruction;
begin
 if not OldCreateOrder then DoCreate;
 if fsActivated in FFormState then
 begin
   Activate;
   Exclude(FFormState, fsActivated);
 end;
end;
"
"Specifies when OnCreate and OnDestroy events occur.

property OldCreateOrder: Boolean;

Description

When OldCreateOrder is False (the default) the OnCreate event occurs after all constructors are finished (from the AfterConstruction method) and the OnDestroy event occurs before any destructors are called (from the BeforeDestruction method).

This timing differs from Delphi version 3 and previous, where the OnCreate event occurred when the TCustomForm constructor executed and the OnDestroy event occurred when the TCustomForm destructor executed. Applications that require the OnCreate event and OnDestroy events to occur from the constructor and destructor of the form can set OldCreateOrder to True.
"


 
default ©   (2005-01-26 14:59) [90]

KSergey ©   (26.01.05 14:43) [88]
то есть флагом OldCreateOrder управляется место всплытия OnCreate
или в конструкторе или после него в AfterConstruction
ну и чего это даёт...по-моему всё-таки дело в том что форма - контейнер
для других контролов функциональность OnCreate можно получить перекрыв конструктор или AfterConstruction
а выделено событие OnCreate только для формы...


 
Юрий Зотов ©   (2005-01-26 15:04) [91]

> begin...end ©   (26.01.05 14:26) [81]

Там даже двойная перестановка.

> jack128
> default
> KSergey
> Fay

Подсказка.

Button1.Caption := "OK";
Пишем эту строку в конструкторе формы - получаем AV.
Пишем ее же в OnCreate той же формы - все работает.
В чем фокус - понять легко.

Теперь думаем - почему OnCreate не ввели еще в TComponent? Ведь, казалось бы, просто напрашивается там такое событие.


 
Юрий Зотов ©   (2005-01-26 15:05) [92]

> default ©   (26.01.05 14:59) [90]

> для других контролов функциональность OnCreate можно получить
> перекрыв конструктор

Нельзя.


 
jack128 ©   (2005-01-26 15:11) [93]

Юрий Зотов ©   (26.01.05 15:04) [91]
Button1.Caption := "OK";
Пишем эту строку в конструкторе формы - получаем AV.


Да? С чего бы это?

type
 TForm1 = class(TForm)
   Button1: TButton;
 private
   { Private declarations }
 public
   { Public declarations }
   constructor Create(AOwner: TComponent); override;
 end;

constructor TForm1.Create(AOwner: TComponent);
begin
 inherited;
 Button1.Caption := "Test";
end;


 
jack128 ©   (2005-01-26 15:16) [94]

Игорь Шевченко ©   (26.01.05 14:31) [86]
Отличия в между OnCreate и перекрытием конструктора будет в цепочке наследования, но цель - получить событие, возникающее после создания и инициализации всех компонентов, положенных на форму в дезин тайм, будет достигнута в любом случае.


 
Kerk ©   (2005-01-26 15:19) [95]

Developerr   (25.01.05 19:03) [22]
Согласен, сразу пугает, ну и ничего страшного, есть и более серьезные коды, например, исходники Linux, но это же не значит, что там писали люди из дурки.


Ты не понял. Не важно какая стоит там задача (я и код не должен был публиковать.. нервы блин). Фишка в том, что можно было закодить в РАЗЫ проще, понятней и правильнее.. Приведенный в той ветке код неадекватен!!!


 
begin...end ©   (2005-01-26 15:20) [96]

> [91] Юрий Зотов ©   (26.01.05 15:04)

> Там даже двойная перестановка.

Да в курсе я про всё это, просто написал так, чтобы понятнее было. Я же писал это в ответ на [65] MetalFan ©   (26.01.05 13:40), он ведь попросил "на пальцах"...


 
Юрий Зотов ©   (2005-01-26 15:27) [97]

> jack128 ©   (26.01.05 15:11) [93]

Поменяйте местами 2 строчки. :о)
Ведь RAD IDE рассчитаны не только на голубые значки. :о)

> jack128 ©   (26.01.05 15:16) [94]
> Отличия между OnCreate и перекрытием конструктора ...
> ... но цель - получить событие...
> ... будет достигнута в любом случае.

Не в любом. А только в случае тех компонентов, которые как раз и имеют OnCreate. Именно потому остальные его и не имеют.


 
GuAV ©   (2005-01-26 15:29) [98]

Юрий Зотов ©   (26.01.05 15:04) [91]
Фишка OnCreate в том, что оно происходит после создания компонента из ресурса. Соотвественно оно нужно для инициализации компонента после прочтения из ресурса. В ресурс помещаются наследники TForm, TDataModule, TFrame, но не наследники TButton, TEdit...

Это на тройку, т.к. тут нет почему нет OnCreate для TFrame :)


 
Юрий Зотов ©   (2005-01-26 15:33) [99]

> begin...end ©   (26.01.05 15:20) [96]

> Да в курсе я про всё это, просто написал так, чтобы понятнее
> было.

Тогда в [68] - ошибка:

> PWord(Integer(@I) + 2)^ - получаем слово, расположенное по
> этому адресу. Вот оно (выделено):
> 00000000 01111111 11111111 11111111

При таком размещении по смещению [+2] будет расположено как раз НЕвыделенное слово.


 
KSergey ©   (2005-01-26 15:37) [100]

> [91] Юрий Зотов ©   (26.01.05 15:04)
> Button1.Caption := "OK";
> Пишем эту строку в конструкторе формы - получаем AV.

Не правда. Я тоже проверил (D5)
Ну разве что если

constructor TForm1.Create(AOwner: TComponent);
begin
 Button1.Caption := "Test1";
 inherited;
end;

то caption "не изменится" (перепишется при загрузке контролов, ну дя это понятно)

Но принципиальных проблем я все же не вижу.
И пока и вправду не вижу причин

а) отчего OnCreate не эквивалентно перекрытию конструктора/AfterConstruction
б) почему не появиться бы раньше... Ну разве что то, что из dfm грузится уже вся форма целиком и все на ней контролы, отсюда TButton, например, просто не знает, когда же ее св-ства все будут прочитаны. Т.е. как бы нет момента (с точки зрения кнопки), когда кнопка создана и прогружено ее состояние, заданное в DesignTime.

Впрочем, пока писал - ЮЗ, похоже, ответил....
Хотя, если честно, ответ как-то меня не убедил. Вернее, вопрос изначально какой-то зауиный, а ответ слишком простенький... Как буд-то я все же что-то не понял... ;)


 
jack128 ©   (2005-01-26 15:41) [101]

Юрий Зотов ©   (26.01.05 15:27) [97]
Поменяйте местами 2 строчки. :о)

Ну смеёшся что ли?? (Хотя да. Вот он - смайлик)
Юрий Зотов ©   (26.01.05 15:27) [97]
Ведь RAD IDE рассчитаны не только на голубые значки. :о)

Ага, она на даунов расчитана? ;-)

Я серьезно не помню как в прошлой ветке этот момент разъяснялся, но там была какая то серьезная причина. В любом случае OnCreate не для того введено, чтоб избавить программистов от знания и понимания значения ключевого слова inherited. Лудше считать, что просто для удобства. Типа RAD, design time и тд

вот хороший пример:

GuAV ©   (26.01.05 15:29) [98]
тут нет почему нет OnCreate для TFrame :)


KSergey ©   (26.01.05 15:37) [100]
Т.е. как бы нет момента (с точки зрения кнопки), когда кнопка создана и прогружено ее состояние, заданное в DesignTime
есть такой момент. Метод Loaded


 
default ©   (2005-01-26 15:43) [102]

сам хелп пишет
"Either implement this event or override the constructor of the form; do not do both."
предлагая оба варианта как равносильные)


 
Юрий Зотов ©   (2005-01-26 15:43) [103]

> GuAV ©   (26.01.05 15:29) [98]

Это и правда на тройку :о)

Фишка OnCreate вовсе не обязана быть именно в том, что оно происходит после чтения компонента из ресурса. Разве кто-то мешает ввести OnCreate не только у контейнеров, но и у других компонентов - как событие, дублирующее AfterConstruction, но с удобным доступом для юзера через ObjectInspector? Так же, как они и сделано в контейнерах.

Никто не мешает. Ввести можно. Но бесполезно. Вот в чем фишка-то.


 
KSergey ©   (2005-01-26 15:44) [104]

> [101] jack128 ©   (26.01.05 15:41)
> есть такой момент. Метод Loaded

Честно говоря - так и подозревал, что вру..
Но тогда я уже вообще ничего не понимаю: AV - нет, в чем проблема??


 
KSergey ©   (2005-01-26 15:46) [105]

> [103] Юрий Зотов ©   (26.01.05 15:43)
> Никто не мешает. Ввести можно. Но бесполезно. Вот в чем
> фишка-то.

Вы окончательно меня запутали....


 
default ©   (2005-01-26 15:48) [106]

ну в OnCreate мы получаем доступ ко всем созданным компонентам, из, например, введённого OnCreate-та едита такой доступ может и не быть(если только едит не последним создаётся)
только опять же зачем OnCreate, почему недостаточно перекрытия конструктора формы


 
GuAV ©   (2005-01-26 15:53) [107]

Юрий Зотов ©   (26.01.05 15:43) [103]

Хорошо, я понял, нет OnCreate у других компонентов только потому что пользователь VCL "без голубого значка" пишет наследника только для TForm, TDataModule, TFrame (при этом в худшем случае не подозревает что пишет наследника :) ), но тогда
почему нет OnCreate для TFrame ?


 
KSergey ©   (2005-01-26 15:56) [108]

> [106] default ©   (26.01.05 15:48)
> ну в OnCreate мы получаем доступ ко всем созданным компонентам,
> из, например, введённого OnCreate-та едита такой доступ
> может и не быть

Точно! Обработчик же метод формы...
но про неэквивалентность замены - это да, это вопрос....


 
default ©   (2005-01-26 16:01) [109]

KSergey ©   (26.01.05 15:56) [108]
а второе (как говорил косвенно GuAV в [107]+равносильность из хелпа) для удобства


 
default ©   (2005-01-26 16:02) [110]

KSergey ©   (26.01.05 15:56) [108]
но давно говоря про то что форма - главный контейнер мы это и имели ввиду что оттуда можно сделать нужные настройки...


 
jack128 ©   (2005-01-26 16:09) [111]

GuAV ©   (26.01.05 15:53) [107]
Кажись дошло. Фрейм создается в двух случаях. Либо он создается сам по себе, типа
MyFrame := TMyFrame.Create(nil); // но тут мы можем написать наш код сразу после создания фрейма
Либо фрейм создается в рамках создания формы, на которой этот фрейм лежит. Но тогда нужный нам код можно пометить в OnCreate формы.

Если код должен выполнятся в любом случае - перекрываем конструктор


 
GuAV ©   (2005-01-26 16:14) [112]


> только опять же зачем OnCreate, почему недостаточно
> перекрытия конструктора формы

Ага, а ещё есть компонент TXPMainfest.

Вот и думай сделали это для максимального удобства или чтоб не напрягать программиста ньюансами :)


> Либо фрейм создается в рамках создания формы, на
> которой этот фрейм лежит.

Так вот почему бы не проинициализировать такой фрейм перед его инициализацией в OnCreate формы, тем более что фрейм предназначен для того чтобы кидать несколько одинаковых "кусков" на разные формы/места формы, так можно было бы сделать общую для них инициализацию.


 
default ©   (2005-01-26 16:19) [113]

GuAV ©   (26.01.05 16:14) [112]
если бы у этого была какая-то сверхглубокая мысль то её бы описали в хелпе, значит ответ примитивен - для удобства


 
Юрий Зотов ©   (2005-01-26 16:33) [114]

Ладно, еще подсказка. Пишу свой супер-пупер-компонент.

type
 TMyComp = class(TComponent)]
 private
   FOnCreate: TNotifyEvent;
 protected
   procedure DoCreate; dynamic;
 public
   procedure AfterConstruction; override;
 published
   property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
 end;

procedure TMyComp.AfterConstruction;
begin
 inherited;
 DoCreate
end;

procedure TMyComp.DoCreate;
begin
 if Assigned(FOnCreate) then
   FOnCreate(Self)
end;

Все строго по канонам, не так ли? Но не сработает. Юзерский обработчик вызываться не будет.

Вот в этом и есть главная фишка.


 
Derevyanniy kak Rels   (2005-01-26 16:36) [115]

Кто тут спорит насчет форматирования , вы бы попробовали на
С++ программить :)

в принципе в основном я на нем програмлю .


 
KSergey ©   (2005-01-26 16:38) [116]

> [114] Юрий Зотов ©   (26.01.05 16:33)

Понял!!!
Балин, да уж...


 
KSergey ©   (2005-01-26 16:39) [117]

> [115] Derevyanniy kak Rels   (26.01.05 16:36)
> Кто тут спорит насчет форматирования , вы бы попробовали
> на  С++ программить :)

И что? не понял


 
jack128 ©   (2005-01-26 16:41) [118]

Юрий Зотов ©   (26.01.05 16:33) [114]
Но не сработает. Юзерский обработчик вызываться не будет.

Естествено не будет. Нужно перекрывать Loaded..


 
Юрий Зотов ©   (2005-01-26 16:52) [119]

> jack128 ©   (26.01.05 16:41) [118]

Вот именно. А тогда пропадает всякий смысл, потому что такая точка уже есть - OnCreate контейнера.

И получается, что OnCreate можно, в принципе, ввести в любой класс, но только это будет иметь смысл лишь для контейнеров.

Вот потому OnCreate только в контейнерах и реализовано. Это и есть ответ на вопрос.

Вот теперь и скажите - позволяет ли этот с виду простенький вопросик выяснить степень знания и понимания VCL?
:о)


 
jack128 ©   (2005-01-26 17:39) [120]

Юрий Зотов ©   (26.01.05 16:52) [119]
Мдя.

Ну если человек ответил на этот вопрос, то можно сказать многое об этом человеке..А сли нет, то и сказать ничего нельзя, вопрос, всё таки не тривиальный.



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

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

Наверх





Память: 0.7 MB
Время: 0.065 c
14-1106337070
olookin
2005-01-21 22:51
2005.02.13
Есть у кого склонность сыграть в шахматы на netcenter.pogo.com?


1-1106828822
Looly
2005-01-27 15:27
2005.02.13
DBGrid и узнать только те колонки которые


3-1105699018
Del
2005-01-14 13:36
2005.02.13
Соединение баз


1-1107202771
foont
2005-01-31 23:19
2005.02.13
из *.pdf в *.doc


9-1100257007
Wish
2004-11-12 13:56
2005.02.13
Можно ли рисовать красиво?





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