Конференция "Прочее" » Тесты на знание Delphi
 
  • Григорьев Антон © (23.11.08 16:48) [0]
    Тут народ несколько раз интересовался, есть ли где в интернете тесты, по которым можно оценить своё знание Delphi. Теперь есть :) В честь случившегося недавно 10-летнего юбилея Королевства Delphi открылся раздел "Квинтана", содержащий такие тесты. Кому интересно, заходите.

    http://www.delphikingdom.com/quintana/
  • DVM © (23.11.08 17:42) [1]
    Надеюсь, там в вопросах нет двусмысленности из-за которой люди даже отлично знающие предмет иногда тесты не проходят.
  • Григорьев Антон © (23.11.08 19:23) [2]

    > DVM ©   (23.11.08 17:42) [1]

    Мы старались без двусмысенностей. Судя по тому, что пока была только одна жалоба такого рода на один вопрос, да и та спорная, в целом это удалось. По крайней мере, специально подлавливать на неточных формулировках мы не стремились.

    Цель этих тестов несколько другая. Там к каждому вопросу прилагается комментарий, который становится виден только после прохождения теста. Если человек ответил неправильно, он сразу поймёт, в чём именно он ошибся, а в такой ситуации это объяснение запоминается гораздо лучше, чем если просто дать человеку прочитать теорию. Так что главная цель этого теста - чтобы если не с первого, то со второго раза человек не только правильно ответил на все вопросы, но и мог обосновать каждый ответ.

    Ну, а если где-то найдёте двусмысленность, неточность, ошибку и т.п., пишите, поправим.
  • DVM © (23.11.08 19:35) [3]

    > Григорьев Антон ©   (23.11.08 19:23) [2]

    там есть вопрос в классах такой, на котором я задумался:

    Есть переменная Obj: TSomeClass. Каким условием можно проверить, ссылается ли Obj на какой-то объект или нет?
    Варианты ответов:
    1) if Obj <> nil then ...
    2) if Assigned(Obj) then ...
    3) if obj <> Null then ...
    4) Это невозможно проверить

    Ответ я конечно знал заранее (к тому же 1) и 2) почти одно и тоже, а выбран может быть только один, так что они отпадают оба), но задумался все же, а так ли однозначно можно сказать, что 4) правильный ответ.

    Ведь можно определить, что переменная НЕ ссылается на какой либо объект.
  • Сергей М. © (23.11.08 19:42) [4]

    > если где-то найдёте двусмысленность, неточность, ошибку
    > и т.п.


    "Использование DLL"
    Вопрос №1

    Нет безусловно верного ответа.

    Ответы "Ошибок нет" и "В списке импортируемых модулей отсутствует ShareMem" верны (равно как и не верны) лишь условно.
  • asail (23.11.08 19:46) [5]

    > DVM ©   (23.11.08 19:35) [3]


    > Ведь можно определить, что переменная НЕ ссылается на какой
    > либо объект.

    Можно определить, что переменная ссылается на какое-то место в памяти, п объект-ли это и уж тем более того-же конкретного класса, в общем случае, не возможно...

    По сабжу: прошел пока только первый тест - 9 из 13... Расстроился... :-(
  • DVM © (23.11.08 19:51) [6]

    > в общем случае, не возможно...

    Ну да, именно в общем случае. В частном же возможно.
    Наверное так стоит написать:

    4) Это в общем случае невозможно проверить.
  • Григорьев Антон © (23.11.08 20:00) [7]

    > DVM ©   (23.11.08 19:51) [6]
    > Наверное так стоит написать:
    >
    > 4) Это в общем случае невозможно проверить.

    Принято, сейчас исправлю.

    > Сергей М. ©   (23.11.08 19:42) [4]
    > Ответы "Ошибок нет" и "В списке импортируемых модулей отсутствует
    > ShareMem" верны (равно как и не верны) лишь условно.

    Что-то не понял, в чём условность. Если в параметрах есть string'и, в uses должен быть ShareMem или его аналог. Вы имели ввиду добавку про аналог? Или то, что string - это может быть ShortString?
  • blackman © (23.11.08 20:08) [8]
    Неплохо бы явно указать кодировку страницы UTF-8. Иначе IE при автомате неверно отображает
  • DVM © (23.11.08 20:19) [9]
    Хех. На 7 вопросе в разделе классы я попался. Хороший вопрос.

    Вопрос №7
    Что произойдёт при выполнении следующего кода?

    type
     TSomeClass = class
     public
       procedure ShowMsg;
     end;

    procedure TSomeClass.ShowMsg;
    begin
     ShowMessage('Это метод TSomeClass.ShowMsg');
    end;

    ...
    var
     Obj: TSomeClass;
    begin
     Obj.ShowMsg;
     ...
    end;

  • Григорьев Антон © (23.11.08 20:21) [10]

    > blackman ©   (23.11.08 20:08) [8]
    > Неплохо бы явно указать кодировку страницы UTF-8. Иначе
    > IE при автомате неверно отображает

    Странно... Заходил с разных машин, везде IE, и нигде проблем с кодировкой не видел. Правда, IE везде 6-ой, 7-ой я не тестировал. У вас какая версия?
  • DVM © (23.11.08 20:36) [11]

    > Григорьев Антон ©  

    На мой взгляд спорный верный ответ в 6 вопросе в разделе Потоки.

    Вопрос №6
    Метод Execute класса TSomeThread, унаследованного от TThread, содержит не имеющий параметров метод DoSomething, а метод Execute у него реализован следующим образом

    procedure TSomeThread.Execute;
    begin
     while not Terminated do
       Synchronize(DoSomething);
    end;

    Содержит ли этот код ошибки, и если да, то какие?
    Варианты ответов:
    1) Код не содержит ошибок
    2) Код не содержит формальных ошибок, но смысла не имеет
    3) Прототип метода DoSomething не подходит для передачи в Synchronize
    4) В методе Execute отсутствует вызов метода Execute предка

    Вообще говоря, код ошибок не содержит. А имеет ли он смысл или не имеет - об этом можно сказать, если знать что внутри метода DoSomething. Может там как раз обновление интерфейса? В вопросе же не указано что там! Надо либо привести реализацию DoSomething, либо верный ответ - 1)
  • blackman © (23.11.08 20:39) [12]
    Григорьев Антон ©   (23.11.08 20:21) [10]
    7. Но думаю, что не в этом дело. Не могу посмотреть код вашей страницы
    http://www.delphikingdom.com/quintana/quintana.asp
    Есть ли там строка
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    Если нет и в IE установлено Кодировка=Автовыбор, отбражаться будет крякозябрами
  • antonn © (23.11.08 20:40) [13]

    > DVM ©   (23.11.08 20:19) [9]

    тест не читал, но на первый взгляд AV :)
  • antonn © (23.11.08 20:45) [14]

    > Но думаю, что не в этом дело. Не могу посмотреть код вашей
    > страницы
    > http://www.delphikingdom.com/quintana/quintana.asp
    > Есть ли там строка
    > <meta http-equiv="Content-Type" content="text/html; charset=utf-
    > 8">
    > Если нет и в IE установлено Кодировка=Автовыбор, отбражаться
    > будет крякозябрами
    >

    ИЕ очень нервничает из-за хедеров - либо их неправильного составления, либо несоответствия кодировки хедера и в тегах. В данном случае в хедерах неверный формат (указан только тип документа, без CP)
  • DVM © (23.11.08 20:47) [15]

    > antonn ©   (23.11.08 20:40) [13]


    > тест не читал, но на первый взгляд AV :)

    Я тоже так решил, не подумав. Потом проверил. Все будет работать. О как.
  • Григорьев Антон © (23.11.08 20:48) [16]

    > DVM ©   (23.11.08 20:36) [11]
    > Вообще говоря, код ошибок не содержит. А имеет ли он смысл
    > или не имеет - об этом можно сказать, если знать что внутри
    > метода DoSomething. Может там как раз обновление интерфейса?
    >  В вопросе же не указано что там! Надо либо привести реализацию
    > DoSomething, либо верный ответ - 1)

    По этому поводу категорически не согласен. Такая реализация Execute не имеет смысла независимо от того, что содержится в DoSomething. В комментарии к вопросу я это специально написал:

    Таким образом, при данной реализации нить TSomeThread не делает никаких действий, кроме подачи сигналов главной нити и ожидания выполнения ею метода DoSomthing, т.е. никакого распараллеливания не происходит, и всю работу выполняет главная нить. Поэтому приведённый здесь код формально правильный, но смысла не имеет.

    Я утверждаю, что такая реализация Execute только нагружает процессор бесполезной работой по переключению нитей и не даёт никакого выигрыша. Если вы с этим не согласны, прошу привести такой пример реализации DoSomething, когда это имеет смысл.
  • DVM © (23.11.08 21:00) [17]

    > Григорьев Антон ©   (23.11.08 20:48) [16]

    Хотя, вы правы. Такую странную конструкцию никому в голову использовать не придет. Я почему то думая над вопросом, представлял себе что-то вроде такого:

    procedure TSomeThread.Execute;
    begin
    while not Terminated do
      begin
        ....
        Synchronize(DoSomething);
        ....
      end;
    end;
  • DVM © (23.11.08 21:05) [18]

    > Григорьев Антон ©   (23.11.08 20:48) [16]

    Но все же вот такая конструкция работоспособна и смысл иметь может:

    unit Unit2;

    interface

    uses
     Windows, Classes, SysUtils;

    type
     TSomeThread = class(TThread)
     private
       { Private declarations }
     protected
       procedure Execute; override;
       procedure DoSomething;
       procedure Synchronize(Method: TThreadMethod); overload;
     end;

    implementation

    uses
      Unit1;

    //------------------------------------------------------------------------------

    procedure TSomeThread.Synchronize(Method: TThreadMethod);
    begin
     sleep(10);
     // тут что-то делаем
     inherited Synchronize(Method);
    end;

    //------------------------------------------------------------------------------

    procedure TSomeThread.DoSomething;
    begin
     Form1.Label1.Caption := inttostr(GetCurrentThreadID)//TimeToStr(Now);
    end;

    //------------------------------------------------------------------------------

    procedure TSomeThread.Execute;
    begin
    while not Terminated do
      begin
        Synchronize(DoSomething);
      end;
    end;

    //------------------------------------------------------------------------------

    end.

  • Григорьев Антон © (23.11.08 21:07) [19]

    > DVM ©   (23.11.08 21:00) [17]
    > Такую странную конструкцию никому в голову
    > использовать не придет.

    Тут вы, к сожалению, опять не правы. Придёт в голову не только использовать, но и другим советовать. В книге Архангельского "Программирование в Delphi 6" такой совет приводится. Вот, Игорь Шевченко об этой книге писал здесь: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1082

    Так что этот код не с потолка взят, он реально в вопросах на форумах встречается.
  • antonn © (23.11.08 21:10) [20]
    потому что Архангельский забыл точечки (aka дополнительный код) поставить? :)
  • Григорьев Антон © (23.11.08 21:19) [21]

    > antonn ©   (23.11.08 21:10) [20]
    > потому что Архангельский забыл точечки (aka дополнительный
    > код) поставить? :)

    Забыл или не забыл - это уже не суть важно. Главное, что по этой схеме уже не один человек пытался нити реализовывать, и надо что-то делать, чтобы таких людей было меньше :) К тому же, если я правильно понял Игоря, там речь идёт именно о готовых примерах программ, в которых написан точно такой код без всяких добавлений.
  • antonn © (23.11.08 21:21) [22]
    хотел много чего написать по поводу примеров Архангельского и "статьи" Игоря, но не буду, уже высказывался, да и оффтопик :)
  • Дмитрий С (23.11.08 22:05) [23]
    Хорошие тесты
    +1 в карму :)
  • TUser © (23.11.08 22:45) [24]
    Тесты хорошие, правда код из вопросов первой части (другие не смотрел) из серии нарочно не придумаешь. Так не только никто не будет писать, так писать прямо противопоказано для клеток головного мозга. Хотя для проверки знаний основ языка оно может и норально.
  • Loginov Dmitry © (23.11.08 23:14) [25]
    Спасибо за тест! Хоть нашелся повод размяться под конец выходный :)

    Оказалось, 13 из 13 не так-то просто набрать. В связи с этим замечания )))

    - по 4-му вопросу (базовые св-ва Delphi):

    Если необходимо передать несколько флагов, как это можно сделать?



    можно 2-мя способами. А разрешается выбрать только один.

    - по 6-му вопросу.


    -Динамические массивы не могут быть параметрами-переменными
    -Здесь A – не динамический массив, а открытый, поэтому использовать SetLength нельзя



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

    - по 9-му вопросу. Пришлось открыть справку, чтобы убедиться, что
    {$WRITEABLECONST ON}

    является синонимом
    {$J+}

    . Может стоит все-таки заменить на
    {$J+}

    , либо в коментарии указать оба варианта?
  • Loginov Dmitry © (23.11.08 23:36) [26]
    Вопросы в разделе "Классы" попроще. Мне кажется, в п. 4 перед строкой
    Obj.IntProp := ...

    не помешал бы намек в виде
    Edit1.Text := 1.5;

    (при этом придется правильный ответ также скорректировать)))
  • Anatoly Podgoretsky © (23.11.08 23:47) [27]
    > Loginov Dmitry  (23.11.2008 23:14:25)  [25]

    > можно 2-мя способами. А разрешается выбрать только один.

    Приведи второй.
  • Дмитрий С (24.11.08 00:05) [28]

    > Anatoly Podgoretsky ©   (23.11.08 23:47) [27]

    Можно ORами, можно +ами.


    > -Динамические массивы не могут быть параметрами-переменными
    > -Здесь A – не динамический массив, а открытый, поэтому использовать
    > SetLength нельзя
    >
    >
    > из-за очивидности ответа на этот вопрос, может показаться,
    >  что оба варианта правильны. На мой взгляд, формулировку
    > можно бы как-то и упростить, иначе, все поголовно тут из-
    > за подобной формулировки начнут спотыкаться :)
    >

    Так динамический массив можно определить в качестве var параметра, поэтому "-Динамические массивы не могут быть параметрами-переменными" уже неверно
  • Anatoly Podgoretsky © (24.11.08 00:12) [29]
    > Дмитрий С  (24.11.2008 0:05:28)  [28]

    Ошибаешься, видимо из-за нечеткого понимания двоичных операций, это не одно и тоже, результаты могут как отличаться, так и совпадать. Просто пример, пусть есть две константы A=1 и B=3

    A or B = 3
    A + B = 4

    Второй вариант неверный, для битовых операций.
  • Loginov Dmitry © (24.11.08 00:13) [30]
    По разделу VCL. Обратил внимание на следующее описания (не стану говорить, почему оно привлекло внимание:)


    В некоторых случаях всё не так очевидно. Если бы мы попытались аналогичным образом присвоить значение свойству Label1.Caption, программа запустилась бы, хотя присвоенное в конструкторе значение было бы проигнорировано. Это происходит потому, что в некоторых случаях код VCL проверяет Self на равенство nil, и если ссылка оказывается нулевой, просто ничего не делает.



    на самом деле, многое чего делает, а проверка "Self <> nil" происходит после множества вызовов функций, и в данном случае принимается решение о возможности вызова
    WindowProc(Message)

    .
    Что-то не туда понесло на ночь глядя ))))
  • Loginov Dmitry © (24.11.08 00:15) [31]
    >
    > это не одно и тоже, результаты могут как отличаться, так
    > и совпадать


    Там конкретный случай дан с MessageBox(). Вроде каких-либо проблем с "+" замечено не было ))
  • Дмитрий С (24.11.08 00:17) [32]

    > Anatoly Podgoretsky ©   (24.11.08 00:12) [29]

    Да понимаю я:) В некоторых случаях "+"ы  дадут нужный эффект, например, когда все константы - степени двойки и повторов нет.
  • Loginov Dmitry © (24.11.08 00:33) [33]
    Раздел "Использование DLL".

    Все внимание уделяется модулю ShareMem (SimpleShareMem), хотя есть прекрасная и взаимоисключающая альтернатива - галочка "build with runtime packages", которая пока еще вполне доступна при сборке DLL :)
  • тимохов (24.11.08 00:52) [34]
    прошел первый тест.
    в последнем ошибся - не использовался за последние 12 лет ни разу вещественные числа - терпеть их не могу :) использую свой любимый Decimal, vartype 14.

    тест хорош, честно.
    на мой взгляд без двусмысленностей.

    молодцы!
  • Loginov Dmitry © (24.11.08 01:10) [35]
    Раздел "Нити (threads)"

    Как работает метод TThread.Synchronize?
     > Решает проблемы с синхронизацией неизвестным науке способом

    Супер! =)

    По вопросу 5, касающегося использование TTimer в дополнительном потоке.

    В описании сказано, что
    Сказанное выше не означает, что TTimer нельзя использовать в неглавной нити.



    Скажу по секрету: TTimer нельзя использовать в неглавной нити!!!!

    Это опасно!

    Если мы заглянет в TTimer.Create, то увидем вызов
    FWindowHandle := Classes.AllocateHWnd(WndProc);



    В функции Classes.AllocateHWnd последней строкой мы видим вызов:

     if Assigned(Method) then
       SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));



    Теперь посмотрим на реализацию функции MakeObjectInstance(). В ней используются глобальные объекты, которые никакой синхронизацией не защищены. Что получится, если теже TTimer одновременно будут созданы в 2х потоках? Убъем всю VCL! На 1-ядерных процессорах это очень большая редкость, зато на многоядерных - запросто. Кстати, библиотека IBx, идущая по умолчанию с Delphi 7, обладала той же болезнью. Ее просто опасно (!) было эксплуатировать в многопоточных приложениях. Возможно, что для кого-то это новость.
  • тимохов (24.11.08 01:20) [36]
    а вот про нитки не согласен.

    вопрос 9. createthread пользовался, пользуюсь и буду пользоваться. думаю, что нужно "правильно" заменить на "наименее трудозатратно". или вообще перефразировать - чем createthread хуже beginthread? ну и там, варианты ответов.

    вопрос 8. облажался с waitfor - забыл, что он гад умный...

    вопрос 4. Очень не согласен с тем, что terminatethread является некорректным способом закрытия потока. он является опасным и крайней мерой, но это способ, закрывающий поток. опять же - найдите мне способ прервать ADO запрос в доп. потоке? возможно, что когда я искал этот способ 3 года назад я был слаб, чтобы его найти, но ничего кроме закрытия потока я не нашел. я так и не воспользовался terminatethread для решения данной задачи (пусть висит запрос в фоне, фиг с ним), но иного способа я не вижу.

    Опять же утвержение "данная нить не может быть остановлена корректно". А если в DoSomthing есть возможность возбудить исключение, тогда что? Исключения перестали быть корректными?

    В общем хватит критики. Совет. Перепишите вопрос таким образом, чтобы не было двусмысленностей. Например, "Какие из перечисленных способов закрывают поток и какие из них являются предпочтительными в *большинстве* случаев":
    1. waitfor
    2. terminate
    3. waitfor и terminatethread.
    4. terminatethread как крайняя мера.
    5. terminatethread как общепринятый способ завершения потоков.
    6. никак.

    я не автор вопросов, потому может не сильно правильно говорю, но вопрос 4 двусмысленный. это плохо.
  • Германн © (24.11.08 01:25) [37]
    Даже без очков прекрасно видно откуда у этой Квинтаны растут ноги :)
    Очевидно ЮЗ решил, что несправедливо будет если "тесты Юрия Зотова" будут доступны только Riply. (Кстати, а фотку-то она ЮЗ выслала, как обещала? :).
    Ну а то что в этом благородном проекте возможно приняли участие и некоторые другие уважаемые рыцари и маги королевства, так и им спасибо огромное!
  • Loginov Dmitry © (24.11.08 01:25) [38]
    > чем createthread хуже beginthread? ну и там, варианты ответов.


    IsMultiThread? :)
  • Loginov Dmitry © (24.11.08 01:29) [39]
    > Очень не согласен с тем, что terminatethread является некорректным
    > способом закрытия потока. он является опасным и крайней
    > мерой, но это способ, закрывающий поток


    Некорректный, поскольку варварски прерывает выполнение потока, после этого в отдельных случаях возможны любые глюки в программе. Кроме того, при использовании terminatethread стэк потока остается, а это целый мегабайт утекшей памяти (а то и больше, если были какие-либо динамические массивы или строки)!
  • Skyle © (24.11.08 07:36) [40]
    Вроде посмотрел ветку, об этом вопросе не нашёл. Итак.

    VCL, вопрос №1

    На некоторой неглавной форме Form2 встречается такой код:

    procedure TForm2.Button1Click(Sender: TObject);
    begin
     Form2.Label1.Caption := 'Кнопка нажата';
    end;



    Всё ли правильно в этом коде (при условии что компонент Label1: TLabel действительно существует на форме)? Если нет, то что именно?

    Первым делом хочется ответить, что переменная Form2, автоматом объявленная средой, может и не использоваться, поэтому такой вызов неверен. Но именно такого ответа я не нахожу. Далее читаю вопрос ещё раз, и вижу, что в вопросе есть указание на Form2. То есть не какой-нибудь TForm2, а именно Form2. После этого успокаиваюсь, решив, что переменная Form2 и есть та самая форма. Отвечаю "Все правильно" и получаю по шапке.

    Где справедливость? :)
  • Сергей М. © (24.11.08 08:21) [41]

    > Григорьев Антон ©   (23.11.08 20:00) [7]
    > не понял, в чём условность.


    Если взаимодействующие проекты используют один и тот же экз-р RTL, то верен ответ "Ошибок нет", иначе верен ""В списке импортируемых модулей отсутствует ShareMem""
  • Leonid Troyanovsky © (24.11.08 10:43) [42]

    > Loginov Dmitry ©   (24.11.08 01:10) [35]

    >  > Решает проблемы с синхронизацией неизвестным науке способом

    > Супер! =)

    Вот-вот.

    Если уж надо расширить пространство ответов до четырех,
    то лучше, IMHO, такой вариант:

    4. Посылает SendMessage окну Application.

    --
    Regards, LVT.
  • KSergey © (24.11.08 11:35) [43]
    По русскому помнится 3 ошибки - двойка? ну тогда больше не заработал на классах, о как.

    По тесту: мне очень понравилось оформление, во всех частях: и вопросов, и послеответные комментарии. Супер!
  • Riply © (24.11.08 11:51) [44]
    > [0] Григорьев Антон ©   (23.11.08 16:48)
    > Кому интересно, заходите.

    Здорово ! Молодцы !
    Мне очень понравилось, хотя и попалась на нескольких вещах :)
    Но с одной ошибкой не согласна:

    9.  "Как правильно создавать нить без использования класса TThread?"

    Неужели Вы хотите сказать, что функция BeginThread неправильно создает нить,
    ибо использует для этого CreateThread, а не BeginThread ? :))
  • Loginov Dmitry © (24.11.08 12:12) [45]

    > BeginThread неправильно создает нить,
    > ибо использует для этого CreateThread, а не BeginThread


    Класс!
    Как это понимать? ))
  • DVM © (24.11.08 12:40) [46]

    > Riply ©   (24.11.08 11:51) [44]

    Тоже не согласен с тем, что BeginThread правильный способ, а CreateThread неправильный. Флаг мультипоточности можно и ручками выставить.
  • Riply © (24.11.08 12:47) [47]
    > [45] Loginov Dmitry ©   (24.11.08 12:12)
    > Как это понимать? ))

    Ну... как написано...
    Интересуюсь: если при помощи CreateThread нельзя правильно создать нить,
    то как же тогда BeginThread ( бедненькая :) ) ее созает ?
    Что-то не так ?

    > [46] DVM © (24.11.08 12:40)
    > Тоже не согласен с тем, что BeginThread правильный способ, а CreateThread неправильный.
    > Флаг мультипоточности можно и ручками выставить.

    Ну там не только "Флаг мультипоточности", а и еще всякая вячина :)
  • Riply © (24.11.08 12:50) [48]
    >  [47] Riply ©   (24.11.08 12:47)
    > "созает ?"
    Очепятка и смайлик передвинулся :)
  • DVM © (24.11.08 12:54) [49]

    > Riply ©   (24.11.08 12:47) [47]


    > а и еще всякая вячина :)

    ну эта всячина лишь для удобства, но не критична для работы. Критично лишь IsMultiThread, да и то не всегда.
  • Rouse_ © (24.11.08 13:31) [50]
    на восьмом вопросе в базовых свойствах засыпался :)
    Не обратил внимание что I у нас Cardinal :)
  • Ins © (24.11.08 13:33) [51]

    > на восьмом вопросе в базовых свойствах засыпался :)
    > Не обратил внимание что I у нас Cardinal :)


    Да, я тоже :)
  • Германн © (24.11.08 14:56) [52]

    > Rouse_ ©   (24.11.08 13:31) [50]


    > Ins ©   (24.11.08 13:33) [51]

    Редко тут бываете. Вот и засыпались. :)
    Как раз эта тема на ДМ очень часто освещалась.
  • Rouse_ © (24.11.08 15:11) [53]

    > Редко тут бываете.

    Тут это где?
  • Германн © (24.11.08 15:22) [54]

    > Rouse_ ©   (24.11.08 15:11) [53]
    >
    >
    > > Редко тут бываете.
    >
    > Тут это где?
    >

    На ДМ :)
    P,S. Я вот начисто пролетел на вопросах об именах переменных и о положении "точки с запятой". Оба ответа были для меня полным откровением.
  • Rouse_ © (24.11.08 15:44) [55]

    > На ДМ :)

    Звучит для меня как откровение прямо :)
  • Dmitry S © (24.11.08 16:05) [56]
    А я на StrToInt(Edit1.Text); :-[
  • Григорьев Антон © (24.11.08 16:19) [57]
    Прочитал все ваши комментарии, но ответить по существу пока не готов, принимаю их для размышления. Отвечу только на это:

    > Германн ©   (24.11.08 01:25) [37]
    > Даже без очков прекрасно видно откуда у этой Квинтаны растут
    > ноги :)
    > Очевидно ЮЗ решил, что несправедливо будет если "тесты Юрия
    > Зотова" будут доступны только Riply.

    Не угадали, здесь нет никакой связи. Я не видел тесты Юрия Зотова и даже не представляю, что в них, а я - автор всех имеющихся на сегодняшний день вопросов Квинтаны. Если есть сходство, то это - случайное совпадение. Более того, если бы мне попали в руки тесты Юрия, я бы точно не стал их публиковать, потому что знаю, что он против их открытой публикации.
  • clickmaker © (24.11.08 16:22) [58]
    > тесты Юрия, я бы точно не стал их публиковать, потому что
    > знаю, что он против их открытой публикации.

    даже боюсь представить, что там за вопросы...
  • clickmaker © (24.11.08 16:23) [59]
    если по сабжу, то меня просто наповал убил этот вариант ответа :)
    "OnPaint вызывается во время обратного хода луча развёртки монитора, чтобы исключить мерцание"
  • Германн © (24.11.08 16:25) [60]

    > Не угадали, здесь нет никакой связи.

    Значит не угадал. Но "случайным" такое совпадение вряд ли можно назвать. Этому есть и объективные причины.
  • Ins © (24.11.08 16:31) [61]

    > Значит не угадал.


    А это потому, что там редко бываете :-Ь
  • Германн © (24.11.08 16:36) [62]

    > Ins ©   (24.11.08 16:31) [61]

    :)
  • Григорьев Антон © (24.11.08 16:40) [63]

    > clickmaker ©   (24.11.08 16:23) [59]
    > если по сабжу, то меня просто наповал убил этот вариант
    > ответа :)
    > "OnPaint вызывается во время обратного хода луча развёртки
    > монитора, чтобы исключить мерцание"

    Самое смешное, что это списано почти с натуры :) Задавал у нас один человек такой вопрос - как синхронизировать вывод графики с обратным ходом луча развёртки, а его анимация мерцает. Несколько дней его совместными усилиями убеждали, что мерцание не из-за этого - так и не поверил :)
  • Rouse_ © (24.11.08 16:44) [64]
    А надо было просто у него уточнить с какой частотой бегает лучик на не ЭЛТ мониторах :)
  • анонимъ (24.11.08 16:47) [65]
    > clickmaker ©   (24.11.08 16:23) [59]

    а меня убил ответ "Нарисованное в OnPaint не стирается после перекрытия формы другими окнами". особенно убило то, что он "правильный".
  • clickmaker © (24.11.08 16:48) [66]
    > Нарисованное в OnPaint не стирается после перекрытия формы
    > другими окнами

    ну да. Что написано пером, то не вырубишь топором )
  • Григорьев Антон © (24.11.08 16:56) [67]

    > анонимъ   (24.11.08 16:47) [65]
    > а меня убил ответ "Нарисованное в OnPaint не стирается после
    > перекрытия формы другими окнами". особенно убило то, что
    > он "правильный".

    На том понятийном уровне, который доступен людям, на которых ориентирован этот вопрос, он правильный. Потому что каждый видит: рисуем где хотим, перекрываем другим окном - рисунка нет. Рисуем в OnPaint - рисунок после перекрытия сохраняется. А то, что на самом деле он стёрся, но тут же перерисовался, объясняется в комментарии.

    Вы, наверное, в школе тоже считать учились, складывая яблоки с конфетками. И это несмотря на то, что в математике и понятие числа, и понятие операции сложения вводятся совсем по-другому. Просто начинать сразу со сложного тоже нельзя.
  • Григорьев Антон © (24.11.08 17:27) [68]
    Для начала отвечу на то, с чем сразу точно не согласен

    > Loginov Dmitry ©   (23.11.08 23:36) [26]
    > Вопросы в разделе "Классы" попроще. Мне кажется, в п. 4
    > перед строкой Obj.IntProp := ... не помешал бы намек в виде
    > Edit1.Text := 1.5;

    Зачем? У программиста должен быть рефлекс на уровне спинного мозга, что пользователь может ввести всё, что угодно. Если в коде есть StrToInt(Edit1.Text) без дополнительных проверок, это должно сразу действовать как стоп-сигнал без всяких дополнительных намёков.

    > Loginov Dmitry ©   (24.11.08 00:15) [31]
    > Там конкретный случай дан с MessageBox(). Вроде каких-либо
    > проблем с "+" замечено не было ))

    Там не конкретный пример, там MessageBox приведён только как один из возможных случаев. Опять-таки должен быть рефлекс: флаги объединяются or'ом и никак иначе, даже если в конкретном случае возможен другой вариант. А то потом замучаетесь блох искать при модификации кода через несколько месяцев.

    > тимохов   (24.11.08 01:20) [36]
    > вопрос 4. Очень не согласен с тем, что terminatethread является
    > некорректным способом закрытия потока. он является опасным
    > и крайней мерой, но это способ, закрывающий поток. опять
    > же - найдите мне способ прервать ADO запрос в доп. потоке?

    То, что другого способа можен не существовать, ещё не говорит, что TerminateThread корректен. Зависшую программу тоже приходится через диспетчер задач прибивать, но никто не называет это корректным завершением процесса.

    > Leonid Troyanovsky ©   (24.11.08 10:43) [42]
    > Если уж надо расширить пространство ответов до четырех,
    > то лучше, IMHO, такой вариант:
    >
    > 4. Посылает SendMessage окну Application.

    Нет, такой ответ туда точно не впишется. Там речь идёт об общей идеологии - кто кого ждёт и кто что делает, а не о конкретном механизме обеспечения этого ожидания.
  • blackman © (24.11.08 18:33) [69]
    На
    http://www.delphikingdom.com/quintana/quintana.asp
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    видимо есть.
    Но на страницах
    http://www.delphikingdom.com/quintana/quintana.asp?ItemID=...
    chaset отсутствует.
    как-то это не хорошо. Тестируем знания, а сами не тестируем то, что выкладываем
  • @!!ex © (24.11.08 18:50) [70]
    Классы, 7 вопрос.
    Ответил по опыту, что код такой без проблем скомпилится.
    ОТветил правильно, но это не правильно. :)
    Нет никакой гарантии что этот код будет правильно работать, в стандарте нигде не написано, что это корректно. Если бы метод был class procedure ShowMsg; - тогда нет вопросов, а так - это прроверка знаний "хаккерских" заморочек, а не знания дельфи.
    ИМХО

    VCL
    Вопрос номер 1. :)
    стоит дописать в вопросе наверху:
    var
     Form2:TForm2;
    Потому что иначе можно привести несколько примеров кода, где такое применение будет вполне приемлемым.

    Рисование в Кэнвасе.
    1 вопрос.
    Что за ерунда насчет того, что изображение "не стирается"?? Нарисуйте изображение в OnPaint, подвестьте прогу в вечном цикле, проведите сверху другим окном и у вас все сотрется. К томуже, перед вызовом OnPaint дельфя делает немаловажную работу, в частности по вызову BeginPaint, EndPaint.
    Ответил 2 на этот вопрос, так как вызов BeginPaint EndPaint - вполне можно считать подготовкой, позволяющей отрисовываться быстрее. Например в коде уже не нужно вызывать GetDC для получения DC.
    Правильный ответ считаю бредовым.

    Ну и остальные вопрос - половина вопросов, о смещении рамки квада на пиксель. Это так актуально? :)
  • @!!ex © (24.11.08 18:52) [71]
    > Зачем? У программиста должен быть рефлекс на уровне спинного
    > мозга, что пользователь может ввести всё, что угодно. Если
    > в коде есть StrToInt(Edit1.Text) без дополнительных проверок,
    > это должно сразу действовать как стоп-сигнал без всяких
    > дополнительных намёков.

    Так весь код не приведен. Логично проверку делать на OnChange. Соответственно мы можем только гадать, что может, а что не может лежать в TEdit. Кстати, если не ошибаюсь, у свежей дельфи, есть у TEdit свойство, которое позволяет запретить ввод чего угодно кроме чисел.
  • Тын-Дын © (24.11.08 19:07) [72]

    > Григорьев Антон ©   (23.11.08 16:48)  

    В первом разделе комментарий:

    открытыми массивами. Открытыми массивами являются параметры процедур и функций

    Нет такого понятия "открытый массив". Есть "открытый массив параметров".
  • Тын-Дын © (24.11.08 19:10) [73]
    хотя может и ошибаюсь...
  • Loginov Dmitry © (24.11.08 20:26) [74]
    > Классы, 7 вопрос.
    > Ответил по опыту, что код такой без проблем скомпилится.
    > ОТветил правильно, но это не правильно. :)
    > Нет никакой гарантии что этот код будет правильно работать,
    > в стандарте нигде не написано, что это корректно. Если
    > бы метод был class procedure ShowMsg; - тогда нет вопросов,
    > а так - это прроверка знаний "хаккерских" заморочек, а
    > не знания дельфи.


    Вопрос 7, на мой взгляд как раз полезный. Возможность вызова статических методов без создания экземпляра объекта - основа работы метода TObject.Free(). В пояснении вполне убедительно описано, что Знать об этой особенности языка нужно, хакерского здесь ничего нет. Со стороны все касаемое программирования можно считать хакерством.
  • Игорь Шевченко © (24.11.08 20:31) [75]

    > Возможность вызова статических методов без создания экземпляра
    > объекта - основа работы метода TObject.Free().


    procedure TObject.Free;
    begin
     if Self <> nil then
       Destroy;
    end;



    Какой же тут статический метод вызывается, позвольте узнать ?
  • antonn © (24.11.08 21:09) [76]

    > blackman ©   (24.11.08 18:33) [69]

    в хедере нету...
  • Григорьев Антон © (24.11.08 21:16) [77]

    > blackman ©   (24.11.08 18:33) [69]
    > На
    > http://www.delphikingdom.com/quintana/quintana.asp
    > <meta http-equiv="Content-Type" content="text/html; charset=utf-
    > 8">
    > видимо есть.
    > Но на страницах
    > http://www.delphikingdom.com/quintana/quintana.asp?ItemID=.
    > ..
    > chaset отсутствует.

    И там и там есть - только что проверил. Вообще, все страницы Королевства генерируются по одному шаблону, и то, что есть на одной странице, есть на всех.

    Конкретно там прописано следующее:

    <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML; CHARSET=UTF-8">

    И почему вы, кстати, не можете посмотреть HTML-код страницы? Мне IE через меню "Вид/Просмотр HTML-кода" всё исправно показывает.
  • ага (24.11.08 21:17) [78]

    > Какой же тут статический метод вызывается, позвольте узнать
    > ?

    TObject.Free
  • Григорьев Антон © (24.11.08 21:39) [79]

    > @!!ex ©   (24.11.08 18:50) [70]
    > Классы, 7 вопрос.
    > Ответил по опыту, что код такой без проблем скомпилится.
    >
    > ОТветил правильно, но это не правильно. :)

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

    > стоит дописать в вопросе наверху:
    > var
    >  Form2:TForm2;
    > Потому что иначе можно привести несколько примеров кода,
    >  где такое применение будет вполне приемлемым.

    Я добавлю в вопрос указание того, что Form2 - это глобальная переменная, автоматически объявленная средой.

    > Нарисуйте изображение в OnPaint, подвестьте прогу в вечном
    > цикле, проведите сверху другим окном и у вас все сотрется.
    >

    Я про половину вопросов могу придумать ситуацию, как извратиться и заставить код работать не так, как он работает в нормальных условиях. Например, про все вопросы группы "VCL" можно сказать: а если это написано не в главной нити, то всё неправильно. Ну и что? Вы хотите, чтобы оговаривалось абсолютно всё? Чтобы, как у юристов, на простейшее действие - 10-страничный договор? Это, что ли, ваш идеал вопросов для теста?

    Вы просто неверно понимаете цель этих тестов. Главное в них - не ответить правильно, а понять некоторые особенности работы Delphi, которые описаны в комментарии. Сам вопрос - это средство сделать изучение этих особенностей более интересным. И тест надо оценивать с этих позиций. Ну не знают многие новички, зачем нужен OnPaint, если они рисуют где попало, и всё рисуется! Если можете, придумайте на эту тему такой вопрос, чтобы он был понятен такому человеку, но с более точными формулировками, и я с удовольствием размещу его вместо нынешнего.

    > Ну и остальные вопрос - половина вопросов, о смещении рамки
    > квада на пиксель. Это так актуально? :)

    Во-первых, не половина, а всего два вопроса. Даже если к ним прибавить вопрос про нехватку пикселя при рисовании прямой - три вопроса. Из 12-ти. До половины ещё трёх вопросов не хватает. Во-вторых, лично для меня это было актуально, когда я работал с графикой. В-третьих, если вы знаете более актуальные вопросы, я готов выслушать вас. Критики хватает, а конкретную идею для нового вопроса пока один только Ins предложил.

    > Логично проверку делать на OnChange. Соответственно мы можем
    > только гадать, что может, а что не может лежать в TEdit.
    >  Кстати, если не ошибаюсь, у свежей дельфи, есть у TEdit
    > свойство, которое позволяет запретить ввод чего угодно кроме
    > чисел.

    И что всё это доказывает? Да пусть там разрешено вводить одни только цифры - пользователь введёт "2137561094856109285612374", и будет исключение. А даже если стоит проверка где-то в другом месте - ну и что? На суть вопроса это не влияет, потому что использование try..finally для гарантированного удаления объекта - это как, извините, не писать мимо унитаза. Нормальный программист должен делать это независимо от того, есть ли вызов StrToInt или нет. А то потом при модификации кода можно получить кучу ошибок там, где всё, вроде бы, уже отлажено. А StrToInt(Edit1.Text) в данном вопросе - просто необязательный намёк, квалифицированному программисту и без него отсутствие try..finally должно глаз резать.
  • antonn © (24.11.08 22:29) [80]

    > Григорьев Антон ©   (24.11.08 21:16) [77]

    скорее всего там дело не в теге, а в хедере (заголовке страницы. "Content-Type: text/html", а ИЕ возможно хочет "Content-Type: text/html; charset=utf-8")
  • antonn © (24.11.08 22:38) [81]
    попробывал тест на ГДИ, 7 из 12 правильно, больше половины всяких способов вижу впервые, тыкал наугад :)
  • Leonid Troyanovsky © (24.11.08 23:00) [82]

    > Григорьев Антон ©   (24.11.08 17:27) [68]

    > > 4. Посылает SendMessage окну Application.

    > Нет, такой ответ туда точно не впишется. Там речь идёт об
    > общей идеологии - кто кого ждёт и кто что делает, а не о
    > конкретном механизме обеспечения этого ожидания.

    Тогда, исключить 4 статью на.
    Нужны ли антинаучные эскапады.

    --
    Regards, LVT.
  • тимохов (24.11.08 23:03) [83]
    2Антон

    Хоть убей - не соглашусь, что нужно считать корректным вопрос про некорректность TerminateThread. Его нужно задавать иначе - например, так, чтобы раскрылось знание отвечающего какие последствия будут у terminatethread. В MSDN есть список последствий. Вот на него и можно проэкзаменовать. А корректность - термин расплывчатый.
  • Leonid Troyanovsky © (24.11.08 23:14) [84]

    > Leonid Troyanovsky ©   (24.11.08 23:00) [82]

    Кста, при выборе 4 ответа на вопрос 3
    http://www.delphikingdom.com/quintana/quintana.asp?ItemID=14
    комментарий не доступен.
    Видимо, предполагалось, что начало - 1 вопрос/ответ.

    Ну, а вообще - весьма полезное начало, спасибо.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (24.11.08 23:22) [85]

    > Leonid Troyanovsky ©   (24.11.08 23:14) [84]

    > Видимо, предполагалось, что начало - 1 вопрос/ответ.

    А, я понял, нужно пометить все, sorry.

    Ну, ничего-ничего, такое тоже имеет место быть.

    --
    Regards, LVT.
  • @!!ex © (25.11.08 00:09) [86]
    Написал кучу комментариев.. удалил все. Оставлю только один, который на мой взгляд единственный, действительно бредовый. :)
    Не с целью поспорить, просто вижу косяки на мой взгляд, и пользуюсь для того, чтобы улучшить качество тестов и поднять свой уровень.

    > Я про половину вопросов могу придумать ситуацию, как извратиться
    > и заставить код работать не так, как он работает в нормальных
    > условиях. Например, про все вопросы группы "VCL" можно сказать:
    > а если это написано не в главной нити, то всё неправильно.
    > Ну и что? Вы хотите, чтобы оговаривалось абсолютно всё?
    > Чтобы, как у юристов, на простейшее действие - 10-страничный
    > договор? Это, что ли, ваш идеал вопросов для теста?
    >
    > Вы просто неверно понимаете цель этих тестов. Главное в
    > них - не ответить правильно, а понять некоторые особенности
    > работы Delphi, которые описаны в комментарии. Сам вопрос
    > - это средство сделать изучение этих особенностей более
    > интересным. И тест надо оценивать с этих позиций. Ну не
    > знают многие новички, зачем нужен OnPaint, если они рисуют
    > где попало, и всё рисуется! Если можете, придумайте на эту
    > тему такой вопрос, чтобы он был понятен такому человеку,
    > но с более точными формулировками, и я с удовольствием
    > размещу его вместо нынешнего.

    Да нет. Просто формулировка о том, что нарисованное "не стирается" - откровенный бред. "не стирается" и "перерисовывается" - абсолютно не синонимы. Об этом собственно и говорю. У юристов, между прочим количество текста такое, чтобы избежать двусмысленности. Если часть юридического текста можно трактовать двусмысленно, и это пропустил ответственный юрист, такой юрист идет нафиг.
  • Германн © (25.11.08 01:54) [87]

    > Если часть юридического текста можно трактовать двусмысленно,
    >  и это пропустил ответственный юрист, такой юрист идет нафиг.
    >
    >

    Вот только не надо переводить "наши термины" на другой язык!
  • {RASkov} © (25.11.08 09:32) [88]
    > [86] @!!ex ©   (25.11.08 00:09)
    > Написал кучу комментариев.. удалил все. Оставлю только один

    Ты лучше свой тест напиши :)
  • сюжетнаялиния (25.11.08 09:37) [89]
    ух ты, я оказывается Дэлфи знаю - 13 из 13 )))
  • data © (25.11.08 09:43) [90]
    тряхнула стариной, протестировалась. По графике половину только ответила, в каком-то вопросе тип Cardinal проглядела, остальное вроде ок, получается, что не забыла еще:).
    Хороший тест.
  • @!!ex © (25.11.08 10:03) [91]
    > Ты лучше свой тест напиши :)

    А смысл?
    Тем более мой уровень не достаточен для того, чтобы написать адекватный тест.
    Чукча не писатель.
  • Ping-Pong (25.11.08 14:09) [92]
    Вопрос №2
    В программе объявлена переменная A типа TSomeClass (некоторый класс). Что нужно сделать, чтобы создать экземпляр этого класса?

    1. Больше ничего, экземпляр уже существует, т.к. переменная A объявлена
    2. A.Create;
    3. A := TSomeClass.Create;
    4. New(A, Create);



    При проверке говорят, мол, правильньій вариант - 3. А я считаю, что 2. Вопрос - о создании єкземпляра класса; о переменной А в вопросе ничего нет. Переменная А фигурирует в условии, но зачем - совершенно непонятно.

    Что-то типа: У Васи есть три яблока. Сколько будет 2 х 2 = ?
  • Rouse_ © (25.11.08 14:59) [93]

    > При проверке говорят, мол, правильньій вариант - 3. А я считаю, что 2

    Хорошо когда есть собственное мнение :) А где во втором варианте создание экземпляра класса, раз уж о нем шла речь в вопросе? :)
  • Сергей М. © (25.11.08 15:47) [94]

    > Ping-Pong   (25.11.08 14:09) [92]


    > А я считаю, что 2


    2-й ответ верен условно, в то время как 3-й верен безусловно.
  • Юрий Зотов © (25.11.08 15:53) [95]
    > Ping-Pong   (25.11.08 14:09) [92]

    При вызове конструктора, как обычного метода (т.е., НЕ через ссылку не класс) новый экземпляр класса НЕ создается.

    А в вопросе речь идет как раз о создании экзмляра класса,  поэтому вариант 2 - ошибочный, а вариант 3 - правильный.
  • Юрий Зотов © (25.11.08 15:56) [96]
    > Сергей М. ©   (25.11.08 15:47) [94]

    Согласно формулировке вопроса, переменая А - это ссылка на объект, а не на класс. Поэтому я не нашел условий, при которых ответ 2 был бы верен.
  • Сергей М. © (25.11.08 16:02) [97]

    > Юрий Зотов ©   (25.11.08 15:56) [96]


    > я не нашел условий, при которых ответ 2 был бы верен


    type
     TMyObjectClass = class(TObject)
       ..
     end;

     TSomeClass = class of TMyObjectClass;

    var
     A: TSomeClass;

    ..
     
     A.Create;
  • Сергей М. © (25.11.08 16:07) [98]

    > Юрий Зотов ©   (25.11.08 15:56) [96]
    > Согласно формулировке вопроса, переменая А - это ссылка
    > на объект, а не на класс


    Под "некоторым классом" ведь можно понимать и декларацию вида
    class of ..

    и декларацию вида
    class(..)

  • blackman © (25.11.08 16:19) [99]
    Григорьев Антон ©   (24.11.08 21:16) [77]
    Посмотрел еще раз в Opera и CHrome все нормально и видно исходник. Видимо это глюки IE7.
  • Ins © (25.11.08 16:35) [100]

    > Под "некоторым классом" ведь можно понимать и декларацию
    > вида class of .. и декларацию вида class(..)


    Едва ли по-русски первую можно так назвать. Типом классовой ссылки или метаклассом, но не просто "некоторым классом"... Другое дело, что про идентификатор типа TSomeClass, если провести аналогию с TObject/TClass, TPersistent/TPersistentClass можно подумать, что это классовая ссылка. Ну, можно назвать идентификатор TSomeObject, или как модно TBar/TFoo. Но все  эти придирки ИМХО притянуты за уши, особенно учитывая тот факт, что тесты эти для себя и нигде их результаты не фиксируются. Ну, если вдруг кто-то ответит 2 из соображений, что TSomeClass - это метакласс, то пусть считает, что ответил правильно :) Я вот тоже на один вопрос формально промахнулся (про ShowMessage в статическом методе несозданного экземпляра), но неформально себе правильный ответ засчитал :-D
  • Сергей М. © (25.11.08 16:40) [101]

    > Юрий Зотов ©   (25.11.08 15:56) [96]


    Т.е. 3-й ответ будет единственно и безусловно верным при условии, что вопрос будет звучать так:

    Что нужно сделать, чтобы создать экземпляр этого класса, если на момент создания переменная А не инциализирована ?
  • Сергей М. © (25.11.08 16:47) [102]

    > Ins ©   (25.11.08 16:35) [100]


    > Едва ли по-русски первую можно так назвать


    А даже если так, то все равно в вопросе должно быть явно оговорено, что A на момент создания экз-ра не содержит корректной ссылки на ранее созданный объект.

    Иначе ответы 2 и 3 будут верными.
  • Ins © (25.11.08 17:02) [103]

    > Что нужно сделать, чтобы создать экземпляр этого класса,
    >  если на момент создания переменная А не инциализирована
    > ?


    А что значит "не инициализирована"? Имеет неопределенное значение (или nil)? Если да, то как значение этой переменной до вызова влияет на то, как нужно создавать экземпляр класса?
    Или под этим понимается тот факт, что не был осуществлен вызов A := TSomeClass.NewInstance; Так в этом случае второй вариант тоже не подходит, так как вызов Create в данном случае не создает экземпляр класса.

    Можно было бы сформулировать так: Что нужно сделать, чтобы создать новый экземпляр этого класса, доступный через переменную A.
  • Ins © (25.11.08 17:05) [104]

    > А даже если так, то все равно в вопросе должно быть явно
    > оговорено, что A на момент создания экз-ра не содержит корректной
    > ссылки на ранее созданный объект.
    >
    > Иначе ответы 2 и 3 будут верными.


    Э - нет. :) Читаь постом выше или пост Юрия Зотова под номером 95
  • Сергей М. © (25.11.08 17:12) [105]

    > что значит "не инициализирована"?


    Имеется ввиду явно не инициализирована корректной ссылкой на заведомо существующий (где-то ранее созданный) объект класса TSomeClass.

    Иными словами,

    A := TSomeClass.Create; // если подобная строка фигурирует где-то ранее по ходу выполнения программы
    ..
    A.Create; // то эта демонстрирует верность ответа №2, поскольку эвивалентна строке TSomeClass.Create
  • Ins © (25.11.08 17:15) [106]

    > то эта демонстрирует верность ответа №2, поскольку эвивалентна
    > строке TSomeClass.Create


    Не, не демонстрирует ;-) Это просто инициализация созданного ранее экземпляра, но никак не создание
  • Сергей М. © (25.11.08 17:16) [107]

    > Ins ©   (25.11.08 17:05) [104]


    Условия только декларации переменной для выбора однозначно верного ответа, imho, недостаточно.

    Нигде в условиях не сказано, что творилось с этой переменной до вызова A.Create, значит имею полное право предположить, что переменная была ранее инициализирована корректным значением.

    Что не запрещено, то разрешено)
  • Rouse_ © (25.11.08 17:17) [108]

    >
    > type
    >  TMyObjectClass = class(TObject)
    >    ..
    >  end;
    >
    >  TSomeClass = class of TMyObjectClass;
    >
    > var
    >  A: TSomeClass;
    >
    > ..
    >  
    >  A.Create;

    Работает? :)
  • Сергей М. © (25.11.08 17:19) [109]

    > Это просто инициализация созданного ранее экземпляра


    Логично)

    [102] снимаю.
  • Григорьев Антон © (25.11.08 17:20) [110]
    У конструктора
    > Сергей М. ©   (25.11.08 16:47) [102]
    > А даже если так, то все равно в вопросе должно быть явно
    > оговорено, что A на момент создания экз-ра не содержит корректной
    > ссылки на ранее созданный объект.
    >
    > Иначе ответы 2 и 3 будут верными.

    У конструктора два неявных параметра - Self и ещё один булевский параметр, который показывает, вызывается ли конструктор как классовый метод или как обычный метод.

    В пролог конструктора вставляется код, который анализирует этот параметр. Если конструктор вызывается как классовый метод, то из пролога вызывается NewInstance, который создаёт новый экземпляр класса. Указатель на этот экземпляр помещается в Self, перетирая ссылку на класс, которая была там при вызове. Именно поэтому с самого начала Self в конструкторе содержит ссылку на объект, хотя изначально это была ссылка на класс.

    Если конструктор вызывается как обычный метод (т.е. Self изначально содержит ссылку на объект, а не на класс), пролог не делает ничего дополнительного, и конструктор отрабатывает так же, как обычная процедура. Сделано это для того, чтобы из конструктора можно было вызывать унаследованный конструктор, и это не приводило бы к повторному вызову NewInstance.

    Таким образом, если A - это ссылка на объект, A.Create ни при каких условиях не создаст новый экземпляр объекта, так как такой вызов будет интерпретирован компилятором как вызов конструктора в качестве обычного, а не классового метода.

    Но вообще, впечатление такое, как будто некоторые люди здесь устроили конкурс на самое извращённое толкование вопросов теста :)
  • Сергей М. © (25.11.08 17:21) [111]

    > Rouse_ ©   (25.11.08 17:17) [108]


    А куда оно денется, если перед A.Create выполнить, скажем,

    A := TSomeClass(TMyObjectClass.Create.ClassType);
  • Rouse_ © (25.11.08 17:22) [112]

    > А куда оно денется, если перед A.Create выполнить, скажем,
    >
    >
    > A := TSomeClass(TMyObjectClass.Create.ClassType);

    Ну вот про это в условии точно ничего небыло :)))
  • Сергей М. © (25.11.08 17:23) [113]

    > Григорьев Антон ©   (25.11.08 17:20) [110]


    [102] снимается с рассмотрения)

    А что скажешь по поводу [4] ?
  • Сергей М. © (25.11.08 17:24) [114]

    > Rouse_ ©   (25.11.08 17:22) [112]


    > про это в условии точно ничего небыло


    А там ничего не было кроме "объявлена переменная типа типа")
    Потому и возникает неоднозначность.
  • Ins © (25.11.08 17:25) [115]

    > Нигде в условиях не сказано, что творилось с этой переменной
    > до вызова A.Create, значит имею полное право предположить,
    >  что переменная была ранее инициализирована корректным значением.
    >


    А это уже софистика, не нужно доводить до абсурда :) Потому что с другой стороны, если в тексте вопроса что-то не оговорено, значит и выдумывать ничего лишнего не нужно. Все, что нужно для ответа, есть в тексте вопроса. Не согласны? ;-)

    ЗЫ: И все равно, даже если пуститься в подобное словоблудие, то вызов Create как instance-метода никаким образом нельзя назвать "созданием экземпляра" ;-)
  • Ins © (25.11.08 17:27) [116]

    > Логично)
    >
    > [102] снимаю.


    Принято. 115 писал раньше, чем увидел этот пост. Так что тоже снимается :)
  • Ins © (25.11.08 18:19) [117]

    > Работает? :)


    Работает, даже ничего не нужно дописывать до вызова A.Create. И даже в соответствии  условием создает новый экземпляр (правда тебе ссылку на него не возвращает), но см. [100] ;-)
  • Григорьев Антон © (25.11.08 18:31) [118]

    > Сергей М. ©   (25.11.08 17:23) [113]
    >
    > > Григорьев Антон ©   (25.11.08 17:20) [110]
    > А что скажешь по поводу [4] ?

    Решил, что надо сделать общий комментарий к теме, и в теме про DLL написать, что все вопросы здесь относятся к случаю, когда нет Build with run-time packages. А про пакеты, возможно, будет отдельная тема. Такой комментарий немедленно вставить не могу, для этого нужна модификация движка Квинтаны.
  • Сергей М. © (25.11.08 19:13) [119]

    > Ins ©   (25.11.08 17:25) [115]


    > Не согласны?


    Не-а..

    Т.е. угу, не согласен.

    Батоношлепство в Делфи (со всеми вытекающими, что собссно и наблюдаем) цветет махровым цветом именно по той причине, что авторы такого рода "знаний" (хоть в форме тестов, хоть еще как-либо) не удосуживаются сформулировать вопросы-ответы, исключающие неоднозначность.
  • Rouse_ © (25.11.08 20:04) [120]

    > Ins ©   (25.11.08 18:19) [117]
    > Работает, даже ничего не нужно дописывать до вызова A.Create.

    Верю, у меня тож акромя АВ ничего не выдает в таком варианте, как был приведен :)
  • Григорьев Антон © (25.11.08 20:30) [121]
    Спорный вопрос про создание нового объекта переформулировал так:

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

    Специально выбрал такую витиеватую формулировку, чтобы избежать выражений "поместить объект в A" (так как это неверно идеологически) и "поместить ссылку на объект в A" (так как те, на кого ориентирован этот вопрос, в большинстве своём не знают, что в переменную помещается не объект, а ссылка на него, и не поймут вопрос).
  • wp2 (25.11.08 21:26) [122]
    по первому тесту - не прошел 4 вопроса...
  • Palladin © (25.11.08 23:22) [123]
    пршу прощения если повторюсь. проходить начал 20 минут назад, 10 минут оформлял возмущенности

    базовые свойства
    4 неочевидность понятия флаг очевидна, но и + и  or ответы правильные для формирования их совокупности
    13 а кого волнут особеннсти реализации fpu? кого вообще волнуют ривязки к pc ? а возьму и объявлю алиас Double=Currency ... очень очень неочевидная особенность... вопрос вообще сводится к тому "а ты статью читал? негодяй"

    классы
    2 бред чтозначит новый экземпляр, относительно чего новый, новый отличый от уже чего? или а переменная типа этого класса еще не сществует и идентификатор инстанцировать нужно. всяко на понт берут... нгодяи ) и только просмотрев ответы понт можно разгадать :)
    5 и первый и третий ответы правильные... что же имели ввиду авторы... надеюсь объяснят чем один ответ правильнее другого

    vcl
    1 абсолютно не очевидно певый правилен или третий. валят!! :)
    6 правильно ВСЕ. и попробуйте опровергнуть

    следующие три раздела еще н исследованы
 
Конференция "Прочее" » Тесты на знание Delphi
Есть новые Нет новых   [134446   +39][b:0.001][p:0.005]