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

Вниз

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

 
Anna   (2005-01-25 16:14) [0]

Уважаемые профессионалы, помогите, пожалуйста! При приеме на работу надо выяснить уровень компетентности человека в Delphi.
Может быть, кто-нибудь знает недлинный тест, котором достаточно быстро можно понять, насколько кандидат в предмете.
Я Delphi немного знаю.


 
kaZaNoVa ©   (2005-01-25 16:30) [1]

Anna   (25.01.05 16:14)
1 если ты немного делфя знаешь, то сложно будет оценить компетентность ...

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


 
kaZaNoVa ©   (2005-01-25 16:32) [2]

например типа:

послать по e-mail все *.doc с раюочего стола, посмотреть, какие он компоненты заюзает, как код оформляет и т.д.


 
Anna   (2005-01-25 16:45) [3]

Спасибо.


 
Digitman ©   (2005-01-25 16:46) [4]


> При приеме на работу надо выяснить уровень компетентности
> человека в Delphi


ох как сложно(

начни с того как чел форматирует свой код в Object Pascal ..

о многом это может сказать ..


 
Anna   (2005-01-25 16:55) [5]

Это все-таки уровень культуры программирования, а не знание компонент и особенностей


 
Arm79 ©   (2005-01-25 17:09) [6]

Тесты бывают разные. Мне вот примерно год назад попадался один. Там присутствовал следующий вопрос: Почему БДЕ идеально подходит для разработки клиент-серверных приложений? Как вы считаете, почему? Я вот написал напротив вопроса, что отнюдь не считаю его идеальным. А контора требовала знания MS SQL Server 2000. Так меня и не взяли, о чем кстати, я сейчас не жалею.


 
Erik1 ©   (2005-01-25 17:12) [7]

А посылка файлов с рабочего стола лучше что ли? И где человек возмет компоненты для работы? Лучше уж ему зарание давать сделать такую вещь.


 
MBo ©   (2005-01-25 17:13) [8]

>Anna  
1. На какую позицию принимается человек?
2. Рядом нет серьезного программиста, который мог бы провести собеседование и дать/оценить тестовые задачи?

А вообще, гони его на форум, пусть поработает, через неделю-другую дадим заключение (о некоей части качеств) ;)


 
Arm79 ©   (2005-01-25 17:15) [9]

Да, и по поводу отсылки файлов с рабочего стола... Я вот с ходу не напишу. Но решаемость этой задачи в короткие сроки с хелпом и справочной литературой у меня не вызывает никаких сомнений. Я вот просто не помню как с почтой работать.


 
uny ©   (2005-01-25 17:15) [10]

можно открыть какой нибудь код и попросить объяснить что то оттуда. желательно самому понимать этот код


 
Digitman ©   (2005-01-25 17:17) [11]


> Это все-таки уровень культуры программирования


согласен.

и вот как раз то, как чел оформляет свой код, может многое сказать о его "культуре" ..


 
Anna   (2005-01-25 17:32) [12]

2_MBo
>1. На какую позицию принимается человек?
Разработка Delphi+Oracle.

>2. Рядом нет серьезного программиста, который мог бы провести собеседование и дать/оценить тестовые задачи?
Серьезный пока занят...

>А вообще, гони его на форум, пусть поработает, через неделю-другую дадим заключение (о некоей части качеств) ;)
За предложение спасибо, но недели нет.


 
palva ©   (2005-01-25 17:34) [13]

Пусть в вашем присутствии пройдет онлайновый тест на certifications.ru Delphi 5 или Delphi 7. Там 40 вопросов. Кто на большее число вопросов ответит, того возьмете.


 
Awex   (2005-01-25 18:11) [14]

2palva
Ага... и большая половина по BDE...
да и вообще

Вопрос типа:
Какой тип данных не поддерживается в базах InterBase Server?
множественный выбор:
INTEGER
BOOLEAN
SMALLINT
CURRENCY
VARCHAR  

коментарий:
Причем сдесь такой вопрос, если тест по Delphi? Да и какая версия InterBase ??? От этого зависит правильный ответ....

по моему мнению тесты по Delphi на certifications.ru полный отстой...


 
kaZaNoVa ©   (2005-01-25 18:24) [15]

Erik1 ©   (25.01.05 17:12) [7]

> Лучше уж ему зарание давать сделать такую вещь.

100% половину не сам сделает))))

Arm79 ©   (25.01.05 17:15) [9]

> Да, и по поводу отсылки файлов с рабочего стола... Я
> вот с ходу не напишу.

я тоже, но могу сказать, что например для коннекта импользую WinApi сокеты в потоке, блокирующие, для определения папки рабочего стола использую Shell-функции, для поиска файлов - FindFile из SysUtils и т.д. и только одну процедуру чистого кода написать - я так думаю ...

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


 
kaZaNoVa ©   (2005-01-25 18:27) [16]

kaZaNoVa ©   (25.01.05 18:24) [15]
забыл сказать, проверку на расшируние сделать можно и вручную, но грамотнее использовать функции из "масок" и т.д.  -=))


 
kaZaNoVa ©   (2005-01-25 18:29) [17]

palva ©   (25.01.05 17:34) [13]

> Пусть в вашем присутствии пройдет онлайновый тест на
> certifications.ru Delphi 5 или Delphi 7. Там 40
> вопросов. Кто на большее число вопросов ответит, того
> возьмете.

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


 
kaZaNoVa ©   (2005-01-25 18:33) [18]

Arm79 ©   (25.01.05 17:15) [9]

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

имхо как раз умение решать средней сложности задачи сразу, находу, без заглядываний в справку и отличает опытного программера, "профи", так как на каждое обращение к справке тратится время и "прогер средней руки" будет писать прогу намного медленее, чем профи)))


 
Игорь Шевченко ©   (2005-01-25 18:34) [19]

Digitman ©   (25.01.05 17:17) [11]


> и вот как раз то, как чел оформляет свой код, может многое
> сказать о его "культуре" ..


Уважаю. Ты абсолютно прав.


 
Developerr   (2005-01-25 18:38) [20]

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


 
HSolo ©   (2005-01-25 18:54) [21]

>Какая разница, как он пишет код и использует компоненты, главное чтобы был конечный результат

Вы не боитесь, что Вам придется разбирать что-то вроде http://delphimaster.net/view/15-1106553402/
?


 
Developerr   (2005-01-25 19:03) [22]


> HSolo ©

Дело в том, что я не знаю какая стоит задача в приведенном Вами коде. Согласен, сразу пугает, ну и ничего страшного, есть и более серьезные коды, например, исходники Linux, но это же не значит, что там писали люди из дурки.
Разобраться можно во всем. Юзеру до лампочки, какой код в программе, главное чтобы хорошо работало и без глюков или я не прав?

А, что если код очень понятно написан, но с кучей ошибок? Пользователь этого не простит.


 
kaZaNoVa ©   (2005-01-25 19:16) [23]

Developerr   (25.01.05 18:38) [20]

> Какая разница, как он пишет код и использует
> компоненты, главное чтобы был конечный результат

ага, еще можно предложить, что он будет свою работу перепоручать "3-му лицу" - "лишь бы результат" ))


 
kaZaNoVa ©   (2005-01-25 19:21) [24]

Developerr   (25.01.05 19:03) [22]
Юзеру до лампочки, какой код в программе, главное чтобы хорошо работало и без глюков или я не прав?

я раньше так же думал ..  раньше . .)))

но под влиянием этого форума изменил мнение, согласен с [11] и [19]


 
Romkin ©   (2005-01-25 19:31) [25]

Зотов что-то молчит :))
Есть у него зверский тест, здесь уже публиковался:
На все вопросы нужно отвечать без машины, книг и справки. Можно пользоваться
лишь бумагой и ручкой. Если чего-то не помните наизусть - например, количество
параметров в функциях, их тип и порядок следования - это неважно, достаточно
указать лишь схему кода - например: MyFunc(MyParam1, ..., MyParamN). Ответы
нужны короткие, но точные - то есть, лишь самая суть в одной-двух фразах. Общее
время на все - примерно час. В него надо уложиться и, кроме того, в вопросах 2в,
3д и 4в тоже указано контрольное время, в которое надо уложиться, отвечая на
данный вопрос.

И еще - имейте в виду, что большинство приводимых ниже вопросов, IMHO, в
общем-то, выше уровня среднего прикладного программиста. Так что, если на что-то
не ответите, то это вовсе не повод не для расстройства (зато повод для чтения
книг). Думаю, если ответите на половину, то это будет уже неплохо. А если на все
- то Ваш уровень явно выше среднего.

Вопрос 1 (на знание основ и платформы).
Чему будет равно W после выполнения следующего кода процессором Intel x86? Ответ
объяснить.

type
PWord = ^word;
var
I: integer;
W: word;
begin
I := High(I) shr 8;
W := PWord(Integer(@I) + 2)^;
end;

Вопрос 2 (на знание языка, общее умение программировать и грамотность стиля).
а). Что такое открытые массивы и их конструкторы?
б). Напишите пример перегрузки процедуры.
в). Написать процедуру поиска в заданном каталоге и всех его подкаталогах всех
файлов по маске A?.B* (контрольное время - 20 минут).
г). В чем заключается недостаток такого кода:

try
Obj := TMyObject.Create;
...
finally
Obj.Free;
end;

Вопрос 3 (на знание и понимание VCL).
а). Что такое Custom-класс, абстрактный метод, классовый метод?
б). В чем принципиальное отличие TLabel от TStaticText?
в). От какого класса наследуется TCollection и почему?
г). У каких компонентов есть событие OnCreate? Почему его нет у других
компонентов?
д). Написать модуль, содержащий класс, который позволяет создать лишь один свой
экземпляр (контрольное время - 10 минут).

Вопрос 4 (на знание Win32 и ее API).
а). Что такое объекты ядра? Перечислите несколько функций, в которых они
используются.
б). Приводят ли вызовы функций LoadLibrary/FreeLibrary к загрузке DLL в ОЗУ или
выгрузке из ОЗУ?
в). Написать стандартный код цикла выборки сообщений (контрольное время - 2
минуты).
г). Чем принципиально отличаются функции SendMessage, PostMessage и
PostThreadMessage?
д). Каково назначение функций GetStockObject и SelectObject?


 
Romkin ©   (2005-01-25 19:34) [26]

И мое дополнение:
Вопрос 5 (СОМ)
а). Есть отрывок кода работы с Excel:

var
 Workbook: ExcelWorkbook;
 Worksheet: ExcelWorksheet;
 Disp: IDispatch;
...
begin
 ...
 Disp := Workbook.Sheets.Add(EmptyParam, EmptyParam, 1, EmptyParam, 0);
 OleCheck(Disp.QueryInterface(_WorkSheet, WorkSheet));
 ...
end

Объясните, что делается в этом отрывке и почему, по вашему мнению,
написано именно так?

б). Объясните, для чего применяется интерфейс IStream. Назовите несколько
функций СОМ, работающих с этим интерфейсом.

Вопрос 6. (SQL)
a). Имеется таблица

create table T (
 Дата  date,
 Валюта char(3),
 Курс numeric,
 primary key (Дата, Валюта)
);

Данные:

Дата      Валюта    Курс
------------------------
01.09.04  USD       29.8
02.09.04  EUR       35.4
03.09.04  USD       29.7
05.09.04  USD       29.6
06.09.04  USD       29.8
06.09.04  EUR       35.6
...

Напишите запрос, выдающий курс заданной валюты на заданную дату.
Курс считается определенным, если для данной валюты
есть запись с датой не превосходящей заданную, взять ближайший курс.
Запрос должен выдать курс в обеих случаях:
- курс USD на 06.09.04
- курс USD на 04.09.04

б). Имеется таблица

create table T (Client_ID integer, CNT integer);

Пример заполнения:

Client_ID  CNT
----------------
1          3
1          2
2          1
4          2
4          3
4          4
5          2
5          7
...

Напишите запрос, удовлетворяющий стандарту SQL92,
возвращающий значение CLIENT_ID, для которого сумма CNT максимальна.


Если найдете человека, правильно ответившего на больше половины вопросов - смело берите :))) Рекорд - все, кроме 4 (!). Не мой, к сожалению.


 
Gero ©   (2005-01-25 19:38) [27]


Digitman ©   (25.01.05 16:46)
> начни с того как чел форматирует свой код в Object Pascal
> ..
> о многом это может сказать ..

Да ни о чем это не говорит.
Форматирования кода и уровень знаний никак не связаны.


 
Romkin ©   (2005-01-25 21:20) [28]

Gero ©   (25.01.05 19:38) [27] Может, и не связаны. Однако корреляция просматривается: опытный программист всегда форматирует код правильно :)))
И по форматированию многое можно сказать об опыте.
А с другой стороны - работать-то в коллективе придется. И если код не форматирован, канделябром сразу получаешь. И нафига такое?


 
Developerr   (2005-01-25 21:21) [29]


> ага, еще можно предложить, что он будет свою работу перепоручать
> "3-му лицу" - "лишь бы результат" ))

Совершенно верно. В нормальной фирме Результат прежде все. Директора не интересует культура программирования и код. Не будет результата Вас попросят и все. Никто и слова не замолвит, что у Вас есть культура програмирования.
А кто будет делать, так это уже никого не интересует. Даром делать никто не будет, следовательно, если не умеешь и соваться нечего. А культура отдыхает.


 
Gero ©   (2005-01-25 21:22) [30]


> И по форматированию многое можно сказать об опыте.

Ничего подобного.


 
Romkin ©   (2005-01-25 21:27) [31]

Gero ©   (25.01.05 21:22) [30] Ответь на вопрос: почему опытный программист после then начинает новую строку? :)))


 
Gero ©   (2005-01-25 21:29) [32]


> Romkin ©   (25.01.05 21:27)

А почему?


 
VMcL ©   (2005-01-25 22:05) [33]

>>Gero ©  (25.01.05 21:29) [32]

Как минимум, дебажить удобнее (по крайней мере до D6 включительно).


 
Юрий Зотов ©   (2005-01-25 22:29) [34]

> Gero ©   (25.01.05 21:22) [30]

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

> Gero ©   (25.01.05 21:22) [32]

Оператор if записан в 1 строку:
if условие then begin код1 end еlse begin код2 end;
В ней возникает ошибка. Надо найти причину. Пройдите дебаггером и сразу все поймете. Потом запишите то же самое вот так и сравните, насколько проще стала отладка:
if условие then
begin
 код1
end
еlse
 begin
   код2
 end;

Информация к размышлению: до 80% рабочего времени программиста - это отладка.


 
Юрий Зотов ©   (2005-01-25 22:38) [35]

> Gero ©   (25.01.05 21:22) [30]

Еще пример (A и B - целые переменные, F1 и F2 - функции, возвращающие целые значения).

Какой код лучше:
if (A > B) and (F1 < F2) then...
или
if (F1 < F2) and (A > B) then...

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


 
KilkennyCat ©   (2005-01-25 22:52) [36]


> Информация к размышлению: до 80% рабочего времени программиста
> - это отладка.


есть еще похожая поговорка:
первые 90% работы занимают 10% времени. последние 10% работы занимают 90% времени.


 
Gero ©   (2005-01-25 23:02) [37]


> Вы неправы.

Речь шла о форматировании.
Вот я форматирую код очень хорошо, хотя опытным программистом не являюсь.

> Оператор if записан в 1 строку:

Конечно, но ведь можно записать и так:
if условие then begin
код1
end еlse begin
код2
end;

Кроме читабельности ничего не страдает.

> Информация к размышлению: до 80% рабочего времени программиста
> - это отладка.

Да я догадываюсь в общем-то :)
Приходилось программировать немного.

> Какой код лучше:
> if (A > B) and (F1 < F2) then...
> или
> if (F1 < F2) and (A > B) then...
Лучше в плане чего?
В каждом конкретном случае может быть по-разному.
Скажем, если {$B+}, то разницы может не быть никакой.
> Так вот - в коде профи все нюансы подобного рода продуманы
> и написаны оптимальным образом. А ведь это тоже элементы
> оформления (хотя и не форматирование, конечно).

Ну это уже не оформление вовсе.


 
KilkennyCat ©   (2005-01-25 23:08) [38]


> if (A > B) and (F1 < F2) then...
> или
> if (F1 < F2) and (A > B) then...


а вот я не понял... имеется ввиду, что выполнение (F1 < F2) может повлиять на (A > B) ?


 
Gero ©   (2005-01-25 23:15) [39]


> KilkennyCat ©   (25.01.05 23:08)

Думаю, что имеется ввиду скорость сравнивания значений переменных и результатов выполения функций.


 
default ©   (2005-01-25 23:39) [40]

"> if (A > B) and (F1 < F2) then...
> или
> if (F1 < F2) and (A > B) then..."
а если человек не уверен что сравнение обязательно будет слева направо и напишет код
if F1 < F2 then if A > B then...
то зачтётся ответ?


 
SergP ©   (2005-01-25 23:49) [41]


>  [13] palva ©   (25.01.05 17:34)
> Пусть в вашем присутствии пройдет онлайновый тест на certifications.ru
> Delphi 5 или Delphi 7. Там 40 вопросов. Кто на большее число
> вопросов ответит, того возьмете.


Тот тест даже при присутствии кого-нить (т.е. честно) может пройти большая часть людей, которые только поверхностно знакомы с Delphi.
И вообще использование тестов (простых, сложных или даже суперсложных) в таких вопросах как сабж ИМХО нежелательно.


 
SergP ©   (2005-01-25 23:56) [42]


> [35] Юрий Зотов ©   (25.01.05 22:38)
> > Gero ©   (25.01.05 21:22) [30]
>
> Еще пример (A и B - целые переменные, F1 и F2 - функции,
> возвращающие целые значения).
>
> Какой код лучше:
> if (A > B) and (F1 < F2) then...
> или
> if (F1 < F2) and (A > B) then...
>
> Так вот - в коде профи все нюансы подобного рода продуманы
> и написаны оптимальным образом. А ведь это тоже элементы
> оформления (хотя и не форматирование, конечно).


ИМХО в большинстве случаев if (A > B) and (F1 < F2) then...
Но если представить ситуацию что может быть задача где A>B практически во всех случаях сравнении и иначе только в тысячных долях процента от всех случаев, а функции F1 и F2 сами по себе простенькие. В таком случае будет лучше использовать второй вариант.


 
saNat ©   (2005-01-26 00:03) [43]

Я скорее начинающий, но написал бы

If (A>B)And(F1<F2)
Then

исходя из того, что если (A>B) не выполняется, то не зачем тратить время на проверку результата функций

С уважением, ЕВА


 
Palladin ©   (2005-01-26 00:04) [44]


> Кроме читабельности ничего не страдает.

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


 
Piter ©   (2005-01-26 01:07) [45]

Developerr   (25.01.05 19:03) [22]
Юзеру до лампочки, какой код в программе, главное чтобы хорошо работало и без глюков или я не прав?


прав. Только дело в том, что профессиональный программист будет оформлять код ВСЕГДА ГРАМОТНО. Он просто так привык и ему ТАК УДОБНЕЕ.

Поэтому если оформления нету - то это на 99,999999% не профессиональный программист

Gero ©   (25.01.05 19:38) [27]
Да ни о чем это не говорит.
Форматирования кода и уровень знаний никак не связаны.


ошибаешься.
Точнее, формально ты прав, напрямую они не связаны. Но я никогда не встречал программиста с хорошим уровнем знаний, который не имел бы опыта написания программ. А если он имеет достаточный опыт написания программ - он автоматически форматирует код, на автомате.

Я например даже в чисто тестовых приложениях, может быть в десяток строк, все равно делаю форматирование, уже на уровне рефлексов. Так ГОРАЗДО проще, когда код оформлен.

И если человек профи, если он уже писал миллионы строк в своей жизни - как у него не может быть такого же рефлекса?

Я согласен с тем, что хорошее форматирование не всегда говорит о профессионале. Но плохое форматирование всегда говорит о НЕпрофессионале

Вот комментирую я очень редко, хотя по заявлениям профессионалов это тоже должно придти и это надо делать

KilkennyCat ©   (25.01.05 23:08) [38]
а вот я не понял... имеется ввиду, что выполнение (F1 < F2) может повлиять на (A > B) ?


Может и так. Хотя это имхо плохой стиль программирования.

К тому же, в функциях F1 и F2 могут выполняться операции, которые просто не имеет смысла выполнять, если A<=B. И вообще, функции наверняка будут выполняться куда дольше, чем мгновненное сравнение A с B.


 
Юрий Зотов ©   (2005-01-26 01:24) [46]

> default ©   (25.01.05 23:39) [40]

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

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

> All

Этот пример нельзя рассматривать в отрыве от всей программы. И поэтому я задал вопрос, но не стал на него отвечать. Помните дона Хуана? "Что лучше - пена или дом?".
:о)

Здесь, на форуме, однозначного ответа дать нельзя.

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

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

При взгляде же на код середнячка тоже видно. Но совсем другое.


 
KilkennyCat ©   (2005-01-26 01:25) [47]


> Может и так. Хотя это имхо плохой стиль программирования.


поэтому и не понял...


 
Arm79 ©   (2005-01-26 11:42) [48]

kaZaNoVa ©   (25.01.05 18:33) [18]

Arm79 ©   (25.01.05 17:15) [9]

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

имхо как раз умение решать средней сложности задачи сразу, находу, без заглядываний в справку и отличает опытного программера, "профи", так как на каждое обращение к справке тратится время и "прогер средней руки" будет писать прогу намного медленее, чем профи)))


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

kaZaNoVa ©   (25.01.05 18:24) [15]

Arm79 ©   (25.01.05 17:15) [9]

> Да, и по поводу отсылки файлов с рабочего стола... Я
> вот с ходу не напишу.

я тоже, но могу сказать, что например для коннекта импользую WinApi сокеты в потоке, блокирующие, для определения папки рабочего стола использую Shell-функции, для поиска файлов - FindFile из SysUtils и т.д. и только одну процедуру чистого кода написать - я так думаю ...

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


 Алгоритм то отсылки понятен, но весь вопрос в реализации. Я вот  почту бы попытался бы отослать через Indy или NM. Разве это хуже работы с сокетами? Я так не считаю. Если есть готовая реализация (уже отлаженная), то почему бы ее и не использовать...


 
Игорь Шевченко ©   (2005-01-26 11:57) [49]

Gero ©   (25.01.05 19:38) [27]


> > И по форматированию многое можно сказать об опыте.
>
> Ничего подобного.


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

С уважением,


 
MetalFan ©   (2005-01-26 12:33) [50]


> type
> PWord = ^word;
> var
> I: integer;
> W: word;
> begin
> I := High(I) shr 8;
> W := PWord(Integer(@I) + 2)^;
> end;

простите за оффтоп)
объясните в чем соль этого кода!
видимо не очень хорошо знаю:
Вопрос 1 (на знание основ и платформы).
Чему будет равно W после выполнения следующего кода процессором Intel x86? Ответ
объяснить.


 
default ©   (2005-01-26 12:39) [51]

MetalFan ©   (26.01.05 12:33) [50]
да не в чём, разве что в знании что младший байт лежит по младшему адресу


 
Piter ©   (2005-01-26 12:40) [52]

Arm79 ©   (26.01.05 11:42) [48]
имхо как раз умение решать средней сложности задачи сразу, находу, без заглядываний в справку и отличает опытного программера, "профи", так как на каждое обращение к справке тратится время и "прогер средней руки" будет писать прогу намного медленее, чем профи


да ну, бред. Конечно, программист с большим опытом уже какие-то вещи запомнил на 100%, но это только так сказать побочный эффект, это вовсе не отличительная способность высококлассного специалиста. Это разве может говорить о хорошей памяти.

А вот знать ГДЕ искать и КАК искать - это другое...


 
MetalFan ©   (2005-01-26 12:52) [53]

так в W мы всегда имеем $7F. почему?


 
MetalFan ©   (2005-01-26 12:59) [54]

I := High(I) shr 8
 mov [ebp-$08], $007fffff
W := PWord(Integer(@I)+2)^;
 lea eax,$02
 jno TForm1.Button1Click + $20
 call @IntOver
 mov ax,[eax]
 mov [ebp-$0a],ax

объясните плз суть ассемблерного кода!


 
begin...end ©   (2005-01-26 13:03) [55]

> [51] default ©   (26.01.05 12:39)

Не только. Как минимум, для осмысленного решения данного примера нужно знать внутреннее устройство Integer и правила выполнения операций с указателями. Если значение PWord увеличивается на 1, то это, в частности, не означает, что новый указатель будет указывать на следующий байт памяти.

> [53] MetalFan ©   (26.01.05 12:52)

А почему бы и нет? :-)


 
default ©   (2005-01-26 13:06) [56]

MetalFan ©   (26.01.05 12:52) [53]
да, подлый код
он рассчитан на то что решающий эту задачу даст ответ на этот код как на код:
type
PWord = ^word;
var
 I: integer;
 W: word;
begin
 I := High(Cardinal) shr 8;
 W := PWord(Cardinal(@I) + 2)^;
end;


 
Fay ©   (2005-01-26 13:08) [57]

2 begin...end ©   (26.01.05 13:03) [55]
>> Если значение PWord увеличивается на 1, то это, в частности, не означает,
>>что новый указатель будет указывать на следующий байт памяти.

Очень свежая мысль


 
default ©   (2005-01-26 13:11) [58]

MetalFan ©   (26.01.05 12:52) [53]
он рассчитан на то что High(I) мы будет считать за High(Cardinal)=$FFFFFFFF и на понимание того чего там делается


 
Developerr   (2005-01-26 13:13) [59]


> Юрий Зотов ©

Видно сразу, что опытный программист, с хорошей культурой программирования.
Этому учат в самом начале программирования. Код в Паскале (Делфи) нужно офрмлять лесенкой.
Но посмотрите в [12]

> Серьезный пока занят...


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

Что значит, Серьезный пока занят.... Да для опытного программиста достаточно пары минут, чтобы понять соображает человек или нет. Я не думаю, что нельзя выделить 5 минут, чтобы проверить кого-либо.


 
Piter ©   (2005-01-26 13:15) [60]

Блин, все время забываю:

Romkin ©   (25.01.05 19:31) [25]
г). У каких компонентов есть событие OnCreate? Почему его нет у других
компонентов?


Какой правильный ответ то?

MetalFan ©   (26.01.05 12:33) [50]
объясните в чем соль этого кода!


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


 
Developerr   (2005-01-26 13:15) [61]


> Видно сразу, что опытный программист, с хорошей культурой
> программирования.

Это я сказал без иронии.
Просто следующая фраза:

> Этому учат в самом начале программирования. Код в Паскале
> (Делфи) нужно офрмлять лесенкой.

может показать, что я иронизирую. Отнюдь нет.


 
Игорь Шевченко ©   (2005-01-26 13:19) [62]


> Какой правильный ответ то?


У TForm


 
begin...end ©   (2005-01-26 13:21) [63]

> [57] Fay ©   (26.01.05 13:08)

Блин!!! :-) Я хотел написать "означает". "Не" написал, потому что сначала хотел про другое сказать - про значение самой переменной, а не указателя. Мои извинения.


 
MBo ©   (2005-01-26 13:40) [64]

>У TForm
еще TDataModule


 
MetalFan ©   (2005-01-26 13:40) [65]

так может мне кто-нибудь объяснить на пальцах, почему мы в результате в W имеем 127?????!!!


 
Fay ©   (2005-01-26 13:43) [66]

2 MBo ©   (26.01.05 13:40) [64]
А constructor, видимо, придумали для лохов 8)


 
Игорь Шевченко ©   (2005-01-26 13:45) [67]

MBo ©   (26.01.05 13:40) [64]

Точно, спасибо. Вредно начинать изучение Delphi с первой версии :)

С уважением,


 
begin...end ©   (2005-01-26 13:52) [68]

> [65] MetalFan ©   (26.01.05 13:40)

I := High(I) shr 8

Значение High(Integer) возвращает 2147483647.
В двоичной системе это число выглядит так:

01111111 11111111 11111111 11111111

Теперь выполняем сдвиг на 8 битов вправо:

00000000 01111111 11111111 11111111

Integer(@I) - получаем адрес первого (нулевого) байта (см. строку выше).

Integer(@I) + 2 - теперь указатель указывает не на первый (нулевой байт), а на 2-й (3-й).

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

00000000 01111111 11111111 11111111

Значение этого слова и есть 127.


 
KSergey ©   (2005-01-26 13:59) [69]

> [62] Игорь Шевченко ©   (26.01.05 13:19)
> У TForm

Просто для общего развития: а TCustomForm - это можно считать компонентом? Или компонент - то, что на палитре?

но есть и более другой вопрос.
А вот как ответить на "Почему его нет у других компонентов?". Вот тут я теряюсь...
Неужели просто "им и не надо"? Хотя опять же - почему?..


 
Fay ©   (2005-01-26 14:05) [70]

2 KSergey ©   (26.01.05 13:59) [69]
>> Или компонент - то, что на палитре?
Ага, а форма - это в песочнице для куличиков 8)


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

KSergey ©   (26.01.05 13:59) [69]


> А вот как ответить на "Почему его нет у других компонентов?".
> Вот тут я теряюсь


Теряться не надо, надо просто подумать немного :)

С уважением,


 
MetalFan ©   (2005-01-26 14:07) [72]


> Значение High(Integer) возвращает 2147483647.

млиииин... ну вот! приехали! а я High() и Hi() перепутал((( видать похмелье сказывается!


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

Игорь Шевченко ©   (26.01.05 14:05) [71]
по-моему от того имеет-ли смысл это делать
ведь OnCreate всплывает на WM_CREATE которое отсылается при создании окон в том числе эдитов, кнопок и др виндовых контролов
для них же нет OnCreate-он - там нафиг не нужен он


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

> Fay © (26.01.05 13:43) [66]

Конструктор и OnCreate - вещи, принципиально разные. В том-то и весь фокус. А смысл вопроса - выяснить, понимает ли человек эту разницу.

> begin...end ©   (26.01.05 13:52) [68]

Ответ неточный. На четверочку, не более.
:о)


 
KSergey ©   (2005-01-26 14:18) [75]

> [73] default ©   (26.01.05 14:14)
> для них же нет OnCreate-он - там нафиг не нужен он

Но вопрос "почему" - как-то у меня остается... Вернее, я что-то не могу увидеть принципиальную проблему от того, что такое сообщение будет...
Может мало/плохо думаю?

> [70] Fay ©   (26.01.05 14:05)
> Ага, а форма - это в песочнице для куличиков 8)

Не понял
Я к тому, что OnCreate есть в TCustomForm, хоть и в Protected


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

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

> Ответ неточный.

Ну хоть подскажите, чего не хватает :-)

> На четверочку, не более.

А мне больше и не надо :-)


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

> default ©   (26.01.05 14:14) [73]

> ведь OnCreate всплывает на WM_CREATE

Неверно в принципе!!!

TDataModule - вообще невизуальный компонент и не имеет никаких окон - но OnCreate имеет вполне успешно.


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

KSergey ©   (26.01.05 14:18) [75]

Если ты обратил внимание, то почти все свойства в TCustomxxxx объявлены в разделе protected :)

С уважением,


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

> begin...end ©   (26.01.05 14:22) [76]

> Ну хоть подскажите, чего не хватает :-)

Физического расположения в памяти.


 
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]
Мдя.

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


 
Игорь Шевченко ©   (2005-01-26 17:50) [121]


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


Форматировать нужно при программировании на любом, поддерживающем форматирование языке.

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


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


Которые загружаются из ресурсов :)

С уважением,


 
GuAV ©   (2005-01-26 17:59) [122]

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

Тогда ничего не понял. Если дело только в том что попытка вызова обработчика из ресурса сработает только после заргрузки из ресурса, о чём я пытался сказать в [98] , то это вполне решимая проблема. и в  [103] Вы говорите что дело не в том. Так ещё раз, в чём дело.


 
GuAV ©   (2005-01-26 18:01) [123]

Кстати, с фреймами кажется понял. OnCreate сработал бы если бы он был назначен как TFrame1.Frame1FrameCreate, но назначенный TForm1.Frame11Create нне сработал бы.


 
}|{yk ©   (2005-01-26 18:26) [124]


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

Обратный порядок байт?


 
Piter ©   (2005-01-26 18:47) [125]

Игорь Шевченко ©   (26.01.05 13:19) [62]
У TForm


это не полный ответ :)


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

Piter ©   (26.01.05 18:47) [125]

> это не полный ответ :)


Да я уже сознался в своем невежестве :)

С уважением,


 
Piter ©   (2005-01-26 19:28) [127]

Был задан вопрос:

У каких компонентов есть событие OnCreate? Почему его нет у других
компонентов?


Я обращаюсь к Юрию Зотову. Пожалуйста, напишите точный ответ на этот вопрос, без всяких поправок. Вот как бы строго надо было ответить на этот вопрос.


 
Юрий Зотов ©   (2005-01-26 19:54) [128]

> Piter ©   (26.01.05 19:28) [127]

Событие OnCreate есть у компонентов-контейнеров, загружающихся из ресурсов (формы, модули данных). У других компонентов его нет потому, что в нем нет смысла - вызвать его обработчик можно только после загрузки ресурсов, а для этого уже есть событие OnCreate контейнера.


 
KSergey ©   (2005-01-27 06:03) [129]

Рискну высказать еще вот что, с утра пораньше ;)

Сразу скажу, что абзац ниже - на основе мысли из default ©   (26.01.05 15:48) [106].Ну и разумеется, лишь мое понимание, возможно - ошибочное.

В примере и позже сформулированном ответе Юрия Зотова упор делается на то, что "OnCreate просто неимеет смысла". Но как-то вот не устраивает меня такой мотив. В том смысле, что здесь нет явного противоречия и, вроде бы, можно как-то таки извернуться и такое событие припендюрить. Но, пожалуй, тут все же есть принципиальная невозможность такого события: положим, каким-то образом все же это событие срабатывает при создании компонента (ну не важно как, ну что - фантастику не читаем? :)  Так вот, как было указано default - будет корявость: тот компонент, OnCreate которого уже сработало - создан, возможно - инициализирван. Но другие-то не созданы! (или не инициализированы или еще что-то). Получается, в обработчике мы не можем обращаться ни к чему, кроме самомого этого компонента, хотя сам метод (обработчик) и относится к форме...
И это на мой взгляд именно принципиальная невозможность создания такого события, что мне как-то милее, нежели "не имеет смысла" - слишком это как-то мягко... (В принципе может и можно, исхитриться создать корректно, но тогда, по сути, инициатором должен будет являться контейнер... к тому и пришли.)

Это же, к стати, объясняет, почему его нет у фрейма.
Положим, у фрейма оно таки есть (ну в каком-то смысле это вроде как самостоятельный элемент, даже dfm свою имеет.)
Однако что получится? Ну назначили обработчик на OnCreate у самого фрейма. Положили на форму, опять что-то приписали на событие OnCreate фрейма, однако как вызвать обработчик, привязанный к самому фрейму? inherited - не то, это к форме.. Получается - совсем никак?! Да, получается... Т.е. опять же сделать нормально функционирующее OnCreate для фрейма просто невозможно. Потому его и нет.


 
Игорь Шевченко ©   (2005-01-27 13:21) [130]

На мой взгляд, событие OnCreate у контейнеров может быть заменено перекрытием их метода Loaded. Но неудобно.

Поправьте, если ошибаюсь.


 
_Lucky_   (2005-01-27 13:43) [131]

По поводу тестов. Как-то мой друг по универу в конец забадал меня спором о том что лучше си или пас, причем спорил не приводя особых довод (да и фиг с ними, дело то не в этом), тогда я сказал, что для начала неплохобы просто знать хотя бы пас, на что получил утвердительный ответ: "мол я все знаю!", я конечно сразу поймал его на слове, поскольку был уверен в обратном и написал ему такой вот код:
Program FindMinPrg;

Uses Crt;

Type
TVector = Array [1..10000] Of integer;

Var
Vector : TVector;
  I : Integer;

Function FindMin (Vect : TVector) : Integer;
Var
X, Min : Integer;
Begin
Min := Vect [1];
For X := 2 To 10000 Do
 If Min > Vect [x] Then
  Min := Vect [X];

FindMin := Min;
End;

Procedure SetRandom (Var Vect : TVector);
Var
X : integer;
Begin
For X := 1 To 10000 Do
   Vect [x] := random (32767)-16384;
End;

Begin
ClrScr;
Randomize;
  SetRandom (Vector);
  WriteLn ("Min: ", FindMin (Vector));
End.

код был написан для turbo pascal, задача ставилась исправить его, причем принципиально не меняя его, т.е. можно было дописать или стереть всего пару "слов".
Естественно у него ничего не вышло, хотя его товарищь из магазина в котором они оба работали, исправил все за 10 секнуд.
Смысл всего: "Каждому уровню свой тест!".


> Игорь Шевченко ©   (26.01.05 11:57) [49]
> Gero ©   (25.01.05 19:38) [27]
>
>
> > > И по форматированию многое можно сказать об опыте.
> >
> > Ничего подобного.
>
>
> Когда у тебя будет такой же опыт, как у Сергея или у меня,
> тогда ты сам придешь к тому, что по форматированию и прочим
> аспектам оформления кода можно очень многое сказать о его
> авторе. Без обид.

Абсолютно согласен! Учась на 5-м курсе, я сделал 2 курсача девченкам со второго курса, темы были разные, одна математика другая графика, но когда они пошли здаваться, то препод посмотрев минут по 5 на каждый заявил: "Это делал программист  с опытом, и с уже сложившимся собственным стилем написания ...", а после он даже им сказал, что курсачи делал один человек, вот так, а вы говорите не может быть.


 
Kerk ©   (2005-01-27 13:50) [132]

на первом курсе препод в лицо узнавал написанные мной товарищам лабы.. :)


 
}|{yk ©   (2005-01-27 14:13) [133]

Нифига не согласен про оформление. Я вот пользуюсь DelForEx и доволен. Че мне еще думать про формление? Именно по этой же причине я перехожу на LaTeX. Чтобы не отвлекаться на оформление и остальную мишуру.


 
jack128 ©   (2005-01-27 14:34) [134]

}|{yk ©   (27.01.05 14:13) [133]
Че мне еще думать про формление?

Так в том то и дело, что уже не думаешь..Все на автомате оформляется... Ну кроме названий идентификаторов, но тут DelForEx не поможет


 
Piter ©   (2005-01-27 15:17) [135]

Игорь Шевченко ©   (27.01.05 13:21) [130]

[101] внизу
[118]


 
Derevyanniy kak Rels   (2005-01-27 15:23) [136]

Если я не ошибаюсь Юрий Зотов на моей памяти на этом форуме
вопрос:
" У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?"

и отвечает на него раз пятый :)


Игорь Шевченко ©   (26.01.05 17:50) [121]

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

Форматировать нужно при программировании на любом, поддерживающем форматирование языке.


Несомненно !
но я не это имел ввиду , я имел ввиду то что там бывает волей неволей форматировать начинаешь .

но это я утрирую конечно :)


 
jack128 ©   (2005-01-27 16:47) [137]

Derevyanniy kak Rels   (27.01.05 15:23) [136]
и отвечает на него раз пятый :)


Насколько я помню - третий. Я каждый раз НАПРОЧЬ забываю ответ на этот вопрос и начинаю думать по новой. Надеюсь в следующий раз отвечу сам и без подсказок..


 
JJJ   (2005-01-27 16:53) [138]

Блин, а кто-нито эту задачу решил, а то уже мозги набекрень ?)))

б). Имеется таблица

create table T (Client_ID integer, CNT integer);

Пример заполнения:

Client_ID  CNT
----------------
1          3
1          2
2          1
4          2
4          3
4          4
5          2
5          7
...

Напишите запрос, удовлетворяющий стандарту SQL92,
возвращающий значение CLIENT_ID, для которого сумма CNT максимальна.


 
Юрий Зотов ©   (2005-01-27 17:16) [139]

> Derevyanniy kak Rels   (27.01.05 15:23) [136]

Это все Romkin виноват...
:о)


 
Rule ©   (2005-01-27 18:24) [140]

JJJ   (27.01.05 16:53) [138]
ну так на вскидку навернео что-то типа

select first 1 client_id  from t  group by client_id order by sum(cnt) desc


хотя почемуто меня мучают сомнения что это не соответствует стандарту SQL92, там помоему ферст нет ....


 
raidan ©   (2005-01-27 18:33) [141]

Забыл SQL92 напрочь :(
Неправильный, наверна, будет ответ :(

SELECT *
 FROM (SELECT tio.client_id AS cid, sum(tio.cnt) AS csum
        FROM t tio
    GROUP BY tio.client_id)
WHERE csum = (SELECT max(csum)
                FROM (SELECT tio.client_id AS cid, sum(tio.cnt) AS csum
                       FROM t tio
            GROUP BY tio.client_id))


 
raidan ©   (2005-01-27 18:39) [142]

>Rule ©   (27.01.05 18:24) [140]
На Оракле не заработает ни в жисть :)
(я уж проверил :))
Громоздяку пришлось написать :(


 
Rule ©   (2005-01-27 18:58) [143]

raidan ©   (27.01.05 18:39) [142]
странно, а я на фаерберде решил проверить, и заработало сразу, написал даже без ошибок ... руку уже набил :-), про Оракл ничего не скажу, я его не знаю, значит я был прав и не очень мой запрос совместим с SQL92, но твой тоже, так как вложеные запросы вроде тоже
SELECT max(csum)
               FROM (SELECT tio.client_id AS cid, sum(tio.cnt) AS csum
                      FROM t tio
           GROUP BY tio.client_id)

не очень то по правилам ....


 
Rule ©   (2005-01-27 18:59) [144]

Rule ©   (27.01.05 18:58) [143]
хотя утверждать не буду, давное не читал SQL92, мож кто поправит ...


 
TUser ©   (2005-01-27 19:16) [145]


> _Lucky_   (27.01.05 13:43) [131]

Если не секрет. Я вот переписал это дело - сделал Vector указателем и соотвественнос все переписал. Заработало. Только мне очень интересно почему так (во времена ТР я был дитем малым, так что извините) - там что массивы в качестве параметров как-то по-другому передавались?


 
Fay ©   (2005-01-28 03:33) [146]

2 Rule ©   (27.01.05 18:58) [143]
>> вложеные запросы вроде тоже не очень то по правилам ....

Ага. Их же нет в IB/FB! 8)


 
Derevyanniy kak Rels   (2005-01-28 11:41) [147]


Jack128 ©
Насколько я помню - третий. Я каждый раз НАПРОЧЬ забываю ответ на этот вопрос и начинаю думать по новой. Надеюсь в следующий раз отвечу сам и без подсказок..


Ну значит в подчетах ошибся , кстати я тоже постоянно забываю ответ на него .

наде еще раз пять будет прочитать ответ :) :)


 
Rule ©   (2005-01-28 13:23) [148]

Fay ©   (28.01.05 3:33) [146]

кто сказал что нет ?


 
Romkin ©   (2005-01-28 13:33) [149]

Select from select и first - не подходит :)))
Нетути. Все проще и элегантнее делается ;)
А с first еще и проблема: с максисумом-то может быть несколько client_id, и надо бы получить все, а не первый попавшийся


 
Romkin ©   (2005-01-28 13:36) [150]

Rule ©  (28.01.05 13:23) [148] select from select нету в Firebird :)


 
Romkin ©   (2005-01-28 13:37) [151]

JJJ  (27.01.05 16:53) [138] Не расстраивайся. Я потратил на решение этой задачки 2 часа. И все вокруг говорили, что это невозможно :)))


 
Александр Иванов ©   (2005-01-28 13:46) [152]

Romkin ©   (28.01.05 13:33) [149]
HAVING?


 
Romkin ©   (2005-01-28 14:08) [153]

Александр Иванов ©  (28.01.05 13:46) [152] Идея правильная :)


 
Rule ©   (2005-01-28 14:08) [154]

Romkin ©   (28.01.05 13:33) [149]
действительно :-), не подумал ....

Romkin ©   (28.01.05 13:36) [150]
а разве в последнем интербейзе не появилося ?, я лично с ним не сталкиваюсь, но ктото вроде говорил ....
а в фаерберде, то понятно что нет :)


 
Rule ©   (2005-01-28 14:13) [155]

Romkin ©   (28.01.05 14:08) [153]
Очень прошу, не надо публиковать решение, очень хочеться подумать :-)


 
Rule ©   (2005-01-28 14:21) [156]

Усовершенствовав предыдущий запрос с учетом
Romkin ©   (28.01.05 13:33) [149]

то получается
select client_id from t group by client_id having sum(cnt)=
(select first 1 sum(cnt)  from t  group by client_id order by sum(cnt) desc)


 
Rule ©   (2005-01-28 14:23) [157]

Rule ©   (28.01.05 14:21) [156]
все нормально, только вот   я не уверен что ферст есть в 92 ....


 
Romkin ©   (2005-01-28 14:26) [158]

Ну нету там first! Так что обходитесь.
Запрос вообще и предыдущему стандарту удолетворяет :))
Rule ©  (28.01.05 14:21) [156] Почти :)


 
Александр Иванов ©   (2005-01-28 14:27) [159]

Rule ©   (28.01.05 14:23) [157]
Зачем first, если можно просто max?


 
DenK_vrtz ©   (2005-01-28 14:30) [160]

select client_id, sum(cnt) sum_cnt from t
GROUP BY client_id
HAVING sum(cnt) =
(select max(sum(cnt)) sum_cnt from t
GROUP BY client_id)


 
Rule ©   (2005-01-28 14:38) [161]

DenK_vrtz ©   (28.01.05 14:30) [160]
ага, сто пудов, по стандарту низя агрегатные функции влажывать ...., тем более интербейз этого не понимает ....


 
Romkin ©   (2005-01-28 14:40) [162]

Rule ©  (28.01.05 14:38) [161] Это вообще ни один сервер не понимает, как считать :)))


 
Rule ©   (2005-01-28 14:43) [163]

надо мной уже коллеги смеются :-), я всё отложил и сижу над этим и думаю, а мне мешают ....
уберите их от меня :-))))))))))))))


 
DenK_vrtz ©   (2005-01-28 14:46) [164]

>Romkin ©   (28.01.05 14:40) [162]

А ORACLE 9i понимает и, вроде как, результаты правильные выдает


 
DenK_vrtz ©   (2005-01-28 14:56) [165]

тогда так :)

select client_id, sum(cnt) sum_cnt from t
GROUP BY client_id
HAVING sum(cnt) >= ALL
(select sum(cnt) sum_cnt from t
GROUP BY client_id)


 
Romkin ©   (2005-01-28 15:06) [166]

DenK_vrtz ©  (28.01.05 14:56) [165] Yess! :)))
Так немного лучше:

select client_id
from t
GROUP BY client_id
HAVING sum(cnt) >= ALL (select sum(cnt) sum_cnt
                       from t
                       GROUP BY client_id)


 
Rule ©   (2005-01-28 15:08) [167]

DenK_vrtz ©   (28.01.05 14:56) [165]
действительно работает, но мне не понятно, какую роль в данном случае выполняет ALL ? и не противоречит ли это 92 ?


 
Rule ©   (2005-01-28 15:10) [168]

Rule ©   (28.01.05 15:08) [167]
Всё, понял, я раньше и не догадывался что можно АЛЛ использовать в таком контексте, так что долго бы я ещё думал :), век живи, век учись :)


 
JJJ   (2005-01-28 15:33) [169]

>>Romkin
Прикольно... Только такой запрос на MySql не прокатит...


 
Rule ©   (2005-01-28 15:38) [170]

JJJ   (28.01.05 15:33) [169]
почему это ?, проверить можешь ?


 
Romkin ©   (2005-01-28 15:44) [171]

Rule ©  (28.01.05 15:38) [170] Потому что MySQL не поддерживает подзапросы


 
Style ©   (2005-01-28 19:06) [172]


> Rule ©  (28.01.05 15:38) [170] Потому что MySQL не поддерживает
> подзапросы


В 5 версии поддерживает...


 
_Lucky_   (2005-01-28 19:23) [173]


> TUser ©   (27.01.05 19:16) [145]
>
> > _Lucky_   (27.01.05 13:43) [131]
> Если не секрет. Я вот переписал это дело - сделал Vector
> указателем и соотвественнос все переписал. Заработало. Только
> мне очень интересно почему так (во времена ТР я был дитем
> малым, так что извините) - там что массивы в качестве параметров
> как-то по-другому передавались?


Вообщем-то лучше бы кусок кода привел, потому что я особо не понял, что и где ты переписал. Мое решение заключалось в следующем, строку
Function FindMin (Vect : TVector) : Integer;
нужно исправить на
Function FindMin (Var Vect : TVector) : Integer;
тогда в функцию будет передаваться ссылка на массив, а не весь массив целиком, а если массив большой, то представть себе как он поползет через стек, может и не уместиться, что в принцепе и получилось


 
jack128 ©   (2005-01-28 20:05) [174]

_Lucky_   (28.01.05 19:23) [173]
Function FindMin (Vect : TVector) : Integer;
нужно исправить на
Function FindMin (Var Vect : TVector) : Integer;
тогда в функцию будет передаваться ссылка на массив

лудше тогда уж на Function FindMin (const  Vect : TVector) : Integer;


 
Styx   (2005-01-28 22:24) [175]

Style ©   (28.01.05 19:06) [172]
> В 5 версии поддерживает...

В 4 версии :)


 
Style ©   (2005-01-28 23:26) [176]


> В 4 версии :)


Пардон ошибся :)

Если точнее, то начиная с 4.1
http://dev.mysql.com/doc/mysql/en/subqueries.html


 
Piter ©   (2005-01-29 14:58) [177]

Romkin ©   (28.01.05 13:36) [150]
select from select нету в Firebird :)


В Interbase нету вложенных ЗАПРОСОВ?!?! не может быть...


 
Юрий К   (2005-01-29 16:54) [178]

Задача для теста:

В RichEdit загружен/скопирован юникод текст.
В Мемо нужно распечатать шестнадцатиричное представление данных, которые в RichEdit. Один юникод символ представляется двумя шестнадцатеричными числами, как к примеру по F3 мы видим в WinCmd32, если выбрать в опциях "Hex". То есть примерно выглядеть в Мемо будет так:  1F 04  40 04  38 04  32 04  35 04  42 04, что есть представление слова "Привет".


 
Юрий К   (2005-01-29 16:57) [179]

На [178]:
У кого получится, просьба решение привести в теме "
RichEdit и Unicode." - http://delphimaster.net/view/15-1106553402/



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

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

Наверх





Память: 1.36 MB
Время: 0.058 c
14-1106541978
X9
2005-01-24 07:46
2005.02.13
Работа с LPT-портом под XP


1-1106797782
bnm
2005-01-27 06:49
2005.02.13
Как реализовать диалог выбора каталога


4-1103612577
07BB:080Dh
2004-12-21 10:02
2005.02.13
Есть разница между обычным модемом и оптическим?


1-1107097872
rolex
2005-01-30 18:11
2005.02.13
Как убрать иконку в заголовке окна?


4-1104059945
pomashok
2004-12-26 14:19
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский