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

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
Страждущий   (2003-03-20 22:58) [0]

Уважаемые мастера ! Нужна ваша помощь - протестируйте мои знания, пожалуйста !

Дело в том, что очень хочу работать программистом, мне это ужасно нравится... но нету никакого опыта работы в комманде, я абсолютно не представляю свой уровень знаний по сравнению с другими. Я жутко стесняюсь что ли... устраиваться куда-нибудь программистом...а что, если мои знания - полная лажа ? Просьба ко всем, кто работает программистом, а особенно отвечает за прием новичков. Все места где я узнавад мне говорили... ну что, мол, молодых специалистов они уже набрали, им нужны опытные люди.
Я вообще хотел узнать, требуются ли фирмам свежие люди, которые не очень сильын в своей обасти, но которые полны желания научиться и творить ? Мне даже не очень важна зарплата, мне просто хочется посмотреть и, как говорится, себя показать. Я писал приложения для работы с сетями (TCP/IP большей частью), работал немного с базами (в большинстве случаев с локальными).

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

Мне это очень важно, поверьте

Заранее спасибо


 
Юрий Зотов   (2003-03-21 09:19) [1]

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

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

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

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

Вопрос 1 (на знание основ и платформы).
Чему будет равно W после выполнения следующего кода процессором 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 и PosrThreadMessage?
д). Каково назначение функций GetStockObject и SelectObject?





 
Игорь Шевченко   (2003-03-21 09:39) [2]

www.brainbench.com - бесплатные тесты по Delphi. (По Delphi 3, если не ошибаюсь, но для начального тестирования пригодится)


 
REA   (2003-03-21 10:24) [3]

2ЮЗотов - кстати неплохой тестик получился. Надо бы еще вопросиков 1000 добавить, автоматизировать и выложить. Будет BrainBench.ru - полезный ресурс для работодателей и работовзятелей.


 
stone   (2003-03-21 10:31) [4]

2 Юрий Зотов © (21.03.03 09:19

> Уговор - на все вопросы отвечать без машины, книг и справки.
>


Оригинально. Это типа ходячая энциклопедия? Я еще ни разу не встречал человека, который знает все. Не в смысле именно эти вопросы, могли быть и другие.
Есть такая пословица: дурак уверен, сто знает все, а умный в этом сомневается. Не воспринимайте это как личное.


 
Vint   (2003-03-21 10:38) [5]

Ув. Юрий Зотов © (21.03.03 09:19) и REA © (21.03.03 10:24)

не надо такой ресурс :) а то хотелось бы по вопросам что бы и зарплата была соизмеримая, а это будет вряд ли ;)


 
alxx   (2003-03-21 10:40) [6]

в). Написать процедуру поиска в заданном каталоге и всех его подкаталогах всех файлов по маске A?.B* (контрольное время - 20 минут).

Где-то читал, что 9 из 10 программистов (кажется, работавших программистами ранее), устраивающихся на работу не справлялись с таким заданием.


 
Romkin   (2003-03-21 10:43) [7]

Класс!!! Я засыпался на нескольких пунктах :-)))


 
alxx   (2003-03-21 10:44) [8]

Кстати, отгадки будут?


 
Anatoly Podgoretsky   (2003-03-21 10:59) [9]

alxx © (21.03.03 10:40)
Потому что они путают понятия каталог и файл и пытаются применить маску файла к каталогам, то есть применяют FindFirst("A?.B*" и к каталогам.


 
Mike_Goblin   (2003-03-21 11:04) [10]

1. Честно признаю - ошибся при сдвиге на 1 бит
2.
а) Массивы передаваемые в качестве параметра метода без указания их размера. Размер передается как скрытый параметр
б) перевод на русский язык термина перегрузка имеет как правило два значения override и overload. Какой имелся ввиду?
в) Этюд на тему рекурсии, MatchesMask, FindFirst, FindNext
г) при возникновении исключительной ситуации в конструкторе экземпляр объекта не создается, при этом метод Free - освобождающий память экземпляра будет все равно вызван
3.
а)CustomClass - класс реализующий функциональность, но не выставляющий ее (чаще всего свойства) в секцию published. Потомки выставляют в published нужные им свойства. Наличие их связано с невозможностью уменьшить видимость члена класса. Абстрактный метод - метод без реализации (см ключ слово abstract). Классовый метод - может быть вызван без создания экземпляра класса
б. Лазил в Help, тк не помню особенностей TStaticText - он оказывается оконный, т.е может получать фокус и быть контейнером других компонентов
в. TPersistent. Метод Assign
г. Опять смотрел Help. тк давно не работал. Методы GDI, кстати к VCL они не относятся - это из API
д. В implementation секции - глобальную переменные Instance:TObject и RefCount, переопределить методы NewInstance и FreeInstance.
procedure TSingleton.FreeInstance;
begin
Dec( Ref_Count );
if ( Ref_Count = 0 ) then
begin
Instance := nil;
inherited FreeInstance;
end;
end;

class function TSingleton.NewInstance: TObject;
begin
if ( not Assigned( Instance ) ) then
Instance := inherited NewInstance;
Result := Instance
Inc( Ref_Count );
end;


 
Игорь Шевченко   (2003-03-21 11:08) [11]

Юрий Зотов © (21.03.03 09:19)

Можно использовать вопросы (с сохранением авторства) ? :-)))))
Хорошая подборка получилась


 
REA   (2003-03-21 11:11) [12]

>д). Написать модуль, содержащий класс, который позволяет создать лишь один свой экземпляр (контрольное время - 10 минут).

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


 
Ihor Osov'yak   (2003-03-21 11:17) [13]

2 Romkin © (21.03.03 10:43)

Да, согласен..

О себе:

2г - не уверен в правильности обьяснения (моего). С разрешения Зотова могу запостить сюда..

3в. Не помню. Стыдно, но факт.
3г. Аналогично - не помню. Но есть простое обьяснение - всегда перекрываю AfterConstruction и никогда не использую OnCreate(там, где оно есть). Почему - могу обьяснить.
4д. Не знаю. Не приходилось использовать. Сейчас возьму учебник, посмотрю...

То ЮЗ - нескромный вопрос - Я то себя считал проффесионалом уровня выше среднего.. Не слышком ли завышенна оценка?


 
Ihor Osov'yak   (2003-03-21 11:26) [14]

Ну раз Mike_Goblin © (21.03.03 11:04)спич держал, то я скажу и по 2 г - тем более, что я сним не совсем согласен.

При исключении в конструкторе - деструктор візван будет автоматически. Это так. Но
finally
Obj.Free;
end;

имеет потенциальную проблему - не потому, что деструктор будет вызван второй раз - этого может и не быть, если до вызова конструктора Obj был установлен в nil (free проверяет условие отличия от nil). Проблема будет тогда, когда в конструкторе возникнет исключение, а obj до вызова конструктора имел какое-то "мусорное" значение. То есть, должно быть так:


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

Зы - я конечно понимаю, что глобальные переменные и поля класса изначально установлены в nil, но я рассматривал вопрос в общем случае...



 
han_malign   (2003-03-21 11:28) [15]

1. Честно признаю - ошибся при сдвиге на 1 бит
2.
.........
г) при возникновении исключительной ситуации в конструкторе экземпляр объекта не создается, при этом метод Free - освобождающий память экземпляра будет все равно вызван

- по первому пунскту часто ошибаются, я сам, пока на битовых потоках собыку не съел, путался в индексах и сдвигах...
- а вот г) в реализации D5 вполне корректен, потому как если посмотреть System.pas при возникновении исключительной ситуации в EAX в конце концов попадает nil, а Free свою очередь проверяет Instance<>nil
(см. - System.Pas: _FreeMem; TObject.FreeInstance; _ClassCreate; _ClassDestroy; TObject.Free;)


 
Игорь Шевченко   (2003-03-21 11:30) [16]

Я, честно говоря, смотрел по исходникам только на то, от какого класса TCollection наследуется. Не работаю я с TCollection плотно и упорно, не прижился. :-))
Еще раз, хорошая подборка.
Если есть еще интересные вопросы, есть предложение собрать :-))


 
Mike_Goblin   (2003-03-21 11:41) [17]

Сори п 3 г попутал с 4д
OnCreate - есть у потомков TCustomForm. В ранних версиях вызывалось из конструктора класса, сейчас из AfterConstruction. Нужно чтобы не переопределять конструктор при визуальном наследовании.

4
а) Внутренние объекты ядра Windows, ну например кисти рисования, Handles. См TCanvas
б) Надо читать MSDN, мне кажется, если DLL не загружена в память другими процессами - то вызов LoadLibrary загрузит ее туда.
д) уже написал. Коротко все тоже - не держите в голове всю справочную систему
в) что-то похожее на (я только не могу понять зачем)
while true do
begin
PeekMessage....
end;
г Чем отличаются функции SendMessage, PostMessage и PostThreadMessage? Опять же прочесть справку, я не держу в это голове



 
REA   (2003-03-21 11:45) [18]

В свое время для отбора кандидатов на работу я давал тест на профпригодность. Он конечно не того уровня, но может иногда пригодиться.
Что такое Int21h?
Что такое IRQ3?
Что такое DMA?
Что такое EMS, UMB, XMS?
Что такое LBA?
Что такое IPX?
Что такое CMOS?
Что такое PCI, PCMCIA?
Что такое PCAD?
Что такое FIDO?
Что такое IDE?
Что такое FAT, HPFS, NTFS…?
Что такое GDI?
Что такое DDE, IPC?
Что такое OLE?
Что такое MDI?
Что такое VxD?
Что такое DLL?
Что такое ADO, DAO, ODBC, BDE?
Что такое MAPI?
Что такое RTL?
Что такое USB?
Что такое TSR?
Что такое QNX?
Что такое SQL?
Что такое NNTP, SMTP, XML, SOAP?
Что такое CGI, ISAPI, NSAPI?
Что такое API?
Что такое RTTI?
Что такое DDK?
Что такое IDDQD, RTFM, LMD?
Что такое MSDN?
Что такое COM, DCOM, COM+,OCX?
Какой Scan код (hex) клавиши “any key”?


 
DiamondShark   (2003-03-21 11:51) [19]


> Anatoly Podgoretsky © (21.03.03 10:59)
> Потому что они путают понятия каталог и файл и пытаются
> применить маску файла к каталогам, то есть применяют FindFirst("A?.B*"
> и к каталогам.


Не-а, не потому. Потому что они очень быстро ляпают рекурсивную процедуру, и применяют её к подкаталогам "." и ".."
;-)


 
Romkin   (2003-03-21 11:52) [20]

2Mike_Goblin 1. - просто integer - знаковое целое :-)
2. б - overload, там "пример перегрузки процедуры" а не метода

г, кстати, спорно... Я просто не проверял, если ошибка в конструкторе, остается ли у переменной объекта прежнее значение? Скорее всего нет (да и опираться на такое не надо), значит, AV при ошибке в конструкторе будет...

Кстати, мои результаты:
1. 127 вроде правильно, пришлось покурить
2. а - Хм... О том, что [] называется конструктором - не знал, пришлось лезть в хелп...
б - не принимайте меня за идиота :-)
в. Писать на листочке не буду, это уж точно издевательство, и получится с ляпсами, в свое время писал с десяток вариантов обращения матрицы, и ни одного раза (!) не обошлось без трассировки... Правда, давно это было. А здесь интересно развернуть рекурсию в цикл, но такого на листочке я точно не напишу :-))
г. - см Mike_Goblin
3. а. - то, что понизить видимость нельзя, но могу добавить, что реализация виртуальных методов вставляется в исполнимый файл не только для данного класса, но и всех его предков, еще и поэтому рекомендуют делать потомков от TCustom... - размер кода уменьшается
б. Понятно сразу - TStaticTExt - потомок TWinControl
в. TPersistent - потомки этого класса могут сохранять себя в поток. Ессно, много published пропертей - это потомки TCollection, и очень удобно, что они могут устанавливаться в design-time
г. У потомков TCustomForm & TDataModule. Кстати, вроде бы в D6 TDataModule уже Forms не использует, ура. А вот почему у других нет - не знаю, наверно потому, что у меня никогда надобность в таком не возникало :-)
д. Синглетон? Не знаю, с интерфейсом - просто, а вот объект...

4. Вот тут тяжко...
а. Что такое объекты ядра знаю, но вот все перечислить и для чего применяются :-(( Синхронизирующие - знаю, и функции waitFor, MsgWaitFor. Остальное - увы
б. Вроде бы не приводят, но не уверен... LoadLibrary должна просто мэппить модуль в адресное пространство
в. Не знаю, не пользовал. Вроде смутно помнится PeekMessage/GetMessage в цикле, и все. Избалован я Delphi
г. Ну это просто - первые две - посылка сообщения окну, причем Send ждет ответа, третья - в очередь сообщений потока, а там он сам разберется, что куда. И, если память не изменяет, только потоку в данном процессе.
д. Понятия не имею. Посмотрел хелп. Ничего не понял :-))



 
Mike_Goblin   (2003-03-21 12:02) [21]

2 Ihor Osov"yak
а еще лучше
Obj := TMyObject.Create;
try
...
finally
FreeAndNil(Obj);
end;



 
Игорь Шевченко   (2003-03-21 12:03) [22]

Romkin © (21.03.03 11:52)

4д. в GDI имеется понятие "выбранного в контексте устройства логического объекта" (кисть, перо, палитра, шрифт и т.д.) Только выбранный объект может использоваться при выполнении операций GDI, в которых участвуют кисти, перья, шрифты и т.д. По-другому просто не получится. Для выбора логического объекта в контекст устройства и служит функция SelectObject.
В системе создается заранее определенный набор логических объектов с общеупотребительными атрибутами. Для того, чтобы каждый программист не тратил время (а, главное, системные ресурсы), эти созданные объекты помещаются в некий stock. Для их выбора и последующего использования служит функция GetStockObject.


 
Ihor Osov'yak   (2003-03-21 12:04) [23]

2 Mike_Goblin © (21.03.03 11:41)

> г Чем отличаются функции SendMessage, PostMessage и PostThreadMessage? Опять же прочесть справку, я не держу в это голове


Ну батенька, вы даете... Это же базис... Если выйти немного за бросание компонентов на формы. Имхо..


 
Ihor Osov'yak   (2003-03-21 12:10) [24]

2 Mike_Goblin © (21.03.03 12:02)

Согласен, что лучше... Но єто не решает той проблемі, о которой я говорил - если в obj был мусор до вызова конструктора. Это будет в том случае, если obj определен как локальная, или уже после юзания и освобождения тем же Free (а не так, как Вы предлагаете; я впрочем иногда пишу Free(obj); obj := nil; :-)).

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


 
REA   (2003-03-21 12:12) [25]

>д. Понятия не имею. Посмотрел хелп. Ничего не понял :-))

Вот оно поколение, которое не писало под 3.11 без OWL


 
DiamondShark   (2003-03-21 12:20) [26]

Я сегодня злой какой-то, так что кто не спрятался -- я не виноват.


> Вопрос 1 (на знание основ и платформы).


Ну ноль будет, а вот программиста, так пишущего на языке высокого уровня надо подвешивать за [вставить кому что нравится]


> Вопрос 2 (на знание языка, общее умение программировать
> и грамотность стиля).

Не-е, не так.
Вопрос 2 (на попугайское повторение заученных фич и кусков кода из книжек "Любая хрень за 21 день")


> Вопрос 3 (на знание и понимание VCL).

Вопрос д), очевидно, задумывался как провокационный.


> REA © (21.03.03 11:45)

Я знаю карате, кунг-фу, айкидо и много других страшных слов.


 
Ihor Osov'yak   (2003-03-21 12:23) [27]

2 REA © (21.03.03 12:12)

Да почему же новое, я к примеру тоже под 3.11 не писал, сразу пришлось от досовских задач к d3. Плюс к тому же - работа с графикой не моя стихия.



 
Игорь Шевченко   (2003-03-21 12:32) [28]


> б. Вроде бы не приводят, но не уверен... LoadLibrary должна
> просто мэппить модуль в адресное пространство


Приводят к гарантированной загрузке в working set страниц с кодом инициализации.


 
Style   (2003-03-21 12:33) [29]

2Г -> наверное правильно будет так
Obj := TMyObject.Create;
try
...
finally
Obj.Free;
end;


4Г -> Если не ошибаюсь
SendMessage - посылка сообщения одной нити(потоку)
PostMessage - посылка сообщения всем нитям
PostThreadMessage - посылка Msg указанной (конкретной) нити


 
Style   (2003-03-21 12:37) [30]

Да и 1 вопрос!

>>>Чему будет равно W после выполнения следующего кода процессором x86? Ответ объяснить

Вы забыли объяснить

I := High(I) shr 8;
сдвиг значения High(I) на 8 бит.
т.е. было $FFFFFFFF стало $00FFFFFF

W := PWord(Integer(@I) + 2)^;
тоже самое что
W := integer(I shr 16);

сдвиг еще на 16
получается $000000FF
а если тип integer
то ответ 127 потому что Integer - signed type!









 
Romkin   (2003-03-21 12:37) [31]

2DiamondShark ноль в любом случае не будет. А насчет так писать - это вполне искусственный пример на понимание, как хранятся числа и какой у них формат.
Насчет "попугайского" - напиши процедуру поиска файлов и отладь ее. Сколько времени уйдет?

2Игорь Шевченко это-то я понял из справки. Но ведь куча вопросов возникает - когда надо делать FreeObject, как организуется этот stock и тд В результате - мне нужен пример программы, чтобы понять, как писать :-( Поэтому и говорю - не понял


 
REA   (2003-03-21 12:39) [32]

>Приводят к гарантированной загрузке в working set страниц с кодом инициализации.

А там какие то флаги были типа LoadOnCall и т.п. Спорить конечно не буду - меня не слишком сильно интересовало, когда оно грузится в какой OS (может оно с прошлого раза загружено уже) и когда реально выгружается.


 
DiamondShark   (2003-03-21 12:45) [33]


> Romkin © (21.03.03 12:37)

Ноль -- это я High и Hi перепутал второпях.

Вот ноль ты заметил, а маразм в вопросе 3 пункт д пропустил.
А это посерьёзней формата чисел будет...


 
REA   (2003-03-21 12:49) [34]

High(I) - зависит от версии компилятора, поскольку тип принадлежит к generic integer types.


 
Romkin   (2003-03-21 12:51) [35]

2Style high(i) = $7fffffff, а 127 = $7F !!!
2Игорь Шевченко Да, о коде инициализации забыл :-(( Вообще-то Рихтера я очень давно не перечитывал, да и не интересовало меня это особо. Лучше на этом месте смотрелся бы вопрос о глобальных переменных в случае, когда dll подгружается несколькими процессами ;-)


 
Romkin   (2003-03-21 12:53) [36]

2DiamondShark Это не маразм. Как работает объект в своей глубине, знать надо - многие вопросы отпадают


 
Style   (2003-03-21 12:57) [37]

2 Romkin © -> Да если это Integer до
допустимый диапазон был бы от -7FFFFFFF до 7FFFFFFF Но в голове можно было сообразить что это UnSigned а потом поделить на два!
Так проще :)


 
han_malign   (2003-03-21 13:11) [38]

4.г) еще в школе учитель информатики вдалбливал - инициализируй переменную перед использованием и обнуляй после (лишнее оптимизатор сам выкинет, О!!! - кстати, как раз отимизатор то и не даст корректно отработать)
FillChar(Obj,sizeo(Obj),0);
try
obj:=TObject.Create;
.....
finaly
obj.Free;
(*
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
*)

end;
- а вообще если в моем конструкторе возникает Exeption - значит, либо пора делать сепуку программе(ну кончились ресурсы), либо харакири себе, но поскольку я не самурай - предпочитаю отладиться. Предпочитаю статус создания, возвращать через дополнительный метод, а не через Exeption, потому как, уж слишком долго они отрабатываются(в случае возникновения)...
З.Ы. Как мало мы оказывается знаем - а все из-за того, что переложили большую часть работы на компьютер (контекстная справка, проверка синтаксиса - особенно Hint-ы с Warning-ами)


 
Ihor Osov'yak   (2003-03-21 13:11) [39]

2 Style (21.03.03 12:33)

2Г -> наверное правильно будет так

Мне стыдно... Развел я тут хвилософию.. Тормознул с утра..

>4Г -> Если не ошибаюсь
Ошибаетесь.


SendMessage - посылка синхроного сообщения конкретному окну. Гарантируется, что сообщение будет обработано и только после этого дудет выполнен возврат из SendMessage.
Если окно в создавалось в том же потоке - это приводит к непосредственному візову оконной процедуры. Если сообщение посылается окну, зосданному в другом потоке, то выполнение собственного потока останавливается :-), посланное сообщение "присоединяется" к очереди синхронных сообщений потока создавшего окно-получатель (это немного не та очередь, которая обрабатывается с помощью getMessage и иже с ним). Если поток-получатель не был занят обработкой очередного сообщения - то он займется обработкой этого сообщения - то есть передаст оконной процедуре соответствующего окна но уже в своем контекусте. Если он обрабатывал некуе сообщение, то обработка его естественно окончится. И перед следующей иттерацией цикла сообщений - вернее где-то в глубине getmmessage или peekmessage проверяется очередь сынхронных сообщений - и если там есть наше сообщение - то оно будет обработано. После обработки синхронных сообщений от других потоков результат передается к вызвашему потоку и этот результат уже будет возвращен как результат SendMessage.. Вызвавший поток будет естественно пробужен...


PostMessage - ассинхронная посылка. То есть сообщение ставится в очередь того потока, который владеет (создавал) окном получателем.. Естественно обработка будет идти в контексте потока-владельца, но потом, когда до него очередь дойдет.. ( если окно "наше" - то и обработаем в своем потоке).. Естественно, окну оно будет передано тогда, когда разработчик цыкла не забудет сделать DispatchMessage :-)

PostThreadMessage - посылка прямо в цыкл выборки сообщения. Что с ним делать дальше - решает разработчик цыкла...


 
Ihor Osov'yak   (2003-03-21 13:20) [40]

2 Style (21.03.03 12:37)
Да и 1 вопрос!


>т.е. было $FFFFFFFF стало $00FFFFFF
$7FFFFFFF стало $007FFFFF

maxint - это $7FFFFFFF; $FFFFFFFF в интерпритации как целое знаковое дает -1

>W := PWord(Integer(@I) + 2)^;
>тоже самое что
> W := integer(I shr 16);

не совсем то... Обычная адресная арифменика...
Если не забывать что в памяти сначала младшие байты - затем чтаршие - то результат 7F:

FF FF 7F 00


$007F после интерпритации как word дает 127.

Усе..



 
Игорь Шевченко   (2003-03-21 13:21) [41]


> PostThreadMessage - посылка прямо в цыкл выборки сообщения.
> Что с ним делать дальше - решает разработчик цыкла...


PostThreadMessage - эквивалент PostMessage, за тем исключением, что при выборке сообщения параметр hwnd сообщения будет равен 0


 
Ihor Osov'yak   (2003-03-21 13:24) [42]

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


 
Ihor Osov'yak   (2003-03-21 13:28) [43]

2 Игорь Шевченко © (21.03.03 13:21)

Ну я это и имел ввиду - ведь для этих сообщений DispatchMessage не будет предпринимать никаких действий, то есь вызовов соотв. оконных процедур.. Или я заблуждаюсь?


 
Игорь Шевченко   (2003-03-21 13:33) [44]

Ihor Osov"yak © (21.03.03 13:28)

Да, конечно. Нет окна - нет вызова оконной процедуры. Но DispatchMessage корректно отработает сообщения WM_TIMER и WM_SYSTIMER при этом.


 
Style   (2003-03-21 13:44) [45]

Ihor Osov"yak © >>

На счет SendMessage может я немного не понимаю :)

Из созданного мной потока я делаю SendMessage(..)

В другом потоке написал процедуру OmMyMessage(Var: TMessage); message WM_USER;

Если я использую SendMessage, то при получении сообщения в OnMyMessage программа считает что поток остался прежним, т.е. GetCurrentThread возвращает ту же нить что и в SendMessage..

Потому я и использовал PostThread - что навело меня на такую мысль что PostThread посылка всем :)


 
Ihor Osov'yak   (2003-03-21 13:53) [46]

Style (21.03.03 13:44)

Вы наверно чего-то делали неакуратно и сделали неправильные выводы. Процедура окна вызывается всегда в контексте того потока, который создавал окно.

> В другом потоке написал процедуру OmMyMessage(

Вы также путаете потоки (в понимании windows, сори за каламбур) и методы класса-потомка TThread...


 
Style   (2003-03-21 14:04) [47]

TThread ->> возможно.. Я создаю свой поток с помощью TThread.
получается что в моем Application 2 потока...

на Form1 обрабатываю сообщения

Из TThread посылаю..

Вот если я использую SendMessage() то обработка на Form1 думает что текущий поток -> TThread

Если PostMessage() -> то поток уже другой.

Потому у меня и были такие выводы! :)


 
y-soft   (2003-03-21 14:11) [48]

А что вообще под уровнем программиста подразумевается - Знание базовых алгоритмов? Знание архитектуры ОС и процессоров? Знание языков и инструментов программирования? Умение правильно ставить и оптимально решать задачи? Умение работать самостоятельно и в команде?

IMHO лучший критерий - увидеть человека в деле...


 
Ihor Osov'yak   (2003-03-21 14:11) [49]

2 Style (21.03.03 14:04)
Код в студию.

2 Mike_Goblin © (21.03.03 12:02)

Я невнимательно читал. Посему мое утверждение в Ihor Osov"yak © (21.03.03 12:10) не совсем верно. Приношу извинения.


 
Style   (2003-03-21 14:12) [50]

>> Юрий Зотов -> вообще очень интересные вопросы..
Очень много ньюансов. И ошибиться можно на чем угодно!

Спасибо :)


 
Ihor Osov'yak   (2003-03-21 14:17) [51]

2 y-soft © (21.03.03 14:11)

> А что вообще под уровнем программиста подразумевается - Знание базовых алгоритмов? Знание архитектуры ОС и процессоров? Знание языков и инструментов программирования? Умение правильно ставить и оптимально решать задачи? Умение работать самостоятельно и в команде?


Это есть обязательные условия. C некоторыми оговорками. Если я позиционируюсь как SQL-программист, то мне пожалуй особенностей работы процессора знать не обязательно. Ну и понимать тонкости архитектуры ОС тоже пожалуй..

> IMHO лучший критерий - увидеть человека в деле...

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



 
y-soft   (2003-03-21 14:21) [52]

>Ihor Osov"yak © (21.03.03 14:17)

Так я к тому и говорю, что subj сложней, чем просто наличие каких-то знаний...

А вопросы хорошие...


 
Ihor Osov'yak   (2003-03-21 14:28) [53]

2 y-soft © (21.03.03 14:21)

О вопросах - согласен. Я просто поражаюсь ЮЗ. Интересно только, были ли него заготовки, или експромпт?

> Так я к тому и говорю, что subj сложней, чем просто наличие каких-то знаний...

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





 
Style   (2003-03-21 14:31) [54]

Ihor Osov"yak © >>
Странно, сейчас все работает!
И SendMessage и PostMessage одинаково
Наверное я действительно чего-то напутал.
потому и сомневаясь отвечал :)


 
Style   (2003-03-21 14:35) [55]

> IMHO лучший критерий - увидеть человека в деле...

Да наверное это самый лучший способ.. Если не видить работы человека, нельзя оценить его уровень! Да наверное даже по двум работам его не оценить. (Все же еще зависит от сложности работы)


 
Николай Быков   (2003-03-21 14:37) [56]

практически ни на один вопрос не ответил.
А почему нельзя пользоваться хелпом и гуглей? IMHO, программисто должен уметь найти необходимую документацию, и всё.

---

А как называются такие умный книги, где про это написано?


 
Ihor Osov'yak   (2003-03-21 14:39) [57]

2 Style (21.03.03 14:35)

Я, к примеру, как и большинство здешних, в работе Зотова, Подгорецкого, Шевченко не видел. Но почему-то уверен и их уровне компетентности и проффесионализме...


 
Ihor Osov'yak   (2003-03-21 14:44) [58]

2 Style (21.03.03 14:31)

Я ж говорил, что чего-то делали неакуратно и были сделаны неверные выводы. Такое, к сожалению, тоже иногда бывает.

2 Николай Быков © (21.03.03 14:37)

Без базовых знаний и гугля не поможет...

> А как называются такие умный книги, где про это написано?

Наверно, где все вместе - нету.. А некоторые вопросы отсутствуют вообще..
Написать хорошую техническую книгу очень сложно, ибо нужно быть
Альтруистом,Проффесионалом Высокого класса, Писателем.. В одном человеке это довольно редко встречается...


 
y-soft   (2003-03-21 14:45) [59]

>Николай Быков © (21.03.03 14:37)

А как называются такие умный книги, где про это написано?

Опыт работы:)

>Style (21.03.03 14:35)

Тут такой момент: какой программист лучше - тот, который пишет тщательно, умно, оригинально, но оооочень долго, или тот, который знает мало, но зато типовые рутинные задачи щелкает, как орешки? Или - брать ли на работу СуперГуру, страдающего запоями, или привлечь молодого и неопытного, но дисциплинированного и многообещающего, и обучить в процессе?


 
Ihor Osov'yak   (2003-03-21 14:50) [60]

2 y-soft © (21.03.03 14:45)

> какой программист лучше - тот, который пишет тщательно, умно, оригинально, но оооочень долго, или тот, который знает мало, но зато типовые рутинные задачи щелкает, как орешки?

Нужны и те, и те. На разные участки.


> Или - брать ли на работу СуперГуру, страдающего запоями,

Никогда. Ни прикаких условиях. В крайнем случае - внештатный консультант. Если человек согласится. И не очень расчитывать на факт его наличия..



 
Style   (2003-03-21 14:51) [61]

Ihor Osov"yak © >> Помимо больших познаний люди еще умеют грамотно общаться и выражать свои мысли.

Что немогу сказать о себе. :)

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



 
Nickola2   (2003-03-21 14:53) [62]

Почитал сию ветку и понял, что в ближайшее время программистом не буду, т.к. оччень мало знаю, но руки опускать не собираюсь :о)


 
y-soft   (2003-03-21 14:53) [63]

>Ihor Osov"yak © (21.03.03 14:50)

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


 
Style   (2003-03-21 14:55) [64]

y-soft!
>> привлечь молодого и неопытного, но дисциплинированного и
многообещающего, и обучить в процессе!

Если у человека в голове что-то есть ... то наверное лучше молодого .. как я :) (Мне 21) а вам скока??


 
y-soft   (2003-03-21 14:56) [65]

>Style (21.03.03 14:55)

Уже 45:(


 
MsGuns   (2003-03-21 14:58) [66]

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


 
MsGuns   (2003-03-21 14:59) [67]

..еще НЕ делает из простого столяра художника по резьбе.


 
Style   (2003-03-21 14:59) [68]

y-soft ©
Ну сейчас очень много предприятий и других организации где нужны программисты.. И возвраст тут не причем.



 
Ihor Osov'yak   (2003-03-21 15:00) [69]

2 y-soft © (21.03.03 14:53)

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

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


 
y-soft   (2003-03-21 15:01) [70]

>MsGuns © (21.03.03 14:58)

Это точно, профессия творческая. Только вот в реалиях нужны не только Рафаэли, но и маляры и терщики красок:)


 
Юрий Зотов   (2003-03-21 15:01) [71]

Протестировал сам себя. Честно - только с бумагой и ручкой. Уложился в 49 минут (2В - 13 минут, 3Д - 6 минут, 4В - 1 минута). В общем, тест прошел, но не без напряга.


 
y-soft   (2003-03-21 15:04) [72]

>Ihor Osov"yak © (21.03.03 15:00)
Конечно, если этот потолок не выше твоего :-).

Больной вопрос уровня некомпетентности руководителя:) Увы, в наших условиях решается только путем естественной ротации...


 
y-soft   (2003-03-21 15:10) [73]

>Style (21.03.03 14:59)
>>y-soft ©
>> Ну сейчас очень много предприятий и других организации где >>нужны программисты.. И возвраст тут не причем.

Ничего кроме зависти к Вашему возрасту не имею:|


 
Style   (2003-03-21 15:15) [74]

y-soft © >>
Просто у меня еще все в переди :)
А впрочем молодости можно и позавидовать. Наверное я пойму это позже!


 
Страждущий   (2003-03-21 18:44) [75]

Начал читать ветку. Огромное спасибо, Юрий Зотов, за содействие ! Прочитав немного далее - понял, что люди сами начали отвечать на вопросы. Читать поэтому дальше не стал...
Уважаемые мастера ! Я очень польщен, что вас так заинтересовала моя тема, но... как бы сказать... получше...это наверное эгоистично... но не могли бы вы выражаться только по теме ?

А теперь начинаю отвечатть на вопросы, заданные в начале Юрием Зотовым... ТОЛЬКО НЕ СМЕЙТЕСЬ, ПОЖАЛУЙСТА !

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

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


Сложно. С побитовыми операциями очень мало знаком... ответа дать не смогу... можно я напишу трудности, которые у меня возникли ?
High(I) - немного не понимаю смысла этого. High возвращает наибольший элемент массива (я так привык). А в применении к integer... даже не знаю. Справкой вы сказали не пользоваться - поэтому прочитать про High не могу. Возможно, он возвращает наибольшее значение, возможное у integer. Так как Integer это 32-ух знаковый тип, то наибольшее значение - это 01111111111111111111111111111111 (0 и 1x31). Первый бит на знак.
Потом идет логический сдвиг вправо... вот тут я потерялся. Как я читал, логический сдвиг имеет смысл только для беззнаковых типов, а тут же знаковый (нужен арифмитический сдвиг). Допускаю, получится:
00000000011111111111111111111111 (0x9 и 1x23). Этому будет равно I после I := High(I) shr 8;

Далее, integer(@I). Не понимаю. У меня две идеи:
1) Бредовая. @I - это адрес на I. Тогда integer(@I) - это адрес на I будет рассматриваться как число. Но так как адрес на I предугадать невозможно, то точно нельзя будет сказать значение W. Поэтому, считаю идея неправильная
2) Integer(@I)=I - думаю, неправильно. Слишком было бы легко.

Далее прибавляется 2. Если б в результате Integer(@I) получилось бы 32-ух битовое число, то это еще плюс 00000000000000000000000000000010 (0x30 и 10)

Далее все это приводится к PWord. Опять не знаю :((((
Идеи есть, но еще более бредовые... внятно ничено сказать не могу...

нда... сам сейчас прочел, понял, что в таких вопросах я полный ламер. Если в следующих сообщениях ответа не дано на данныую проблему - расскажите как это делать надо было !


 
Страждущий   (2003-03-21 18:54) [76]

а). Что такое открытые массивы и их конструкторы?

Эх. Когда они передаются в функцию или процедуру, то их размер заранее неизвестен. Можно определить с помощью length
Похожи на динамические. Про их внутреннюю сущность и про конструктор ничего сказать не могу

б). Напишите пример перегрузки процедуры.

procedure A(iinteger);
procedure A(s:string); overload;

Это их объявление. Думаю, это имелось в виду как ответ на вопрос.
Есди написать A(5) - то вызовется первая процедура. Если A("hi") - то вторая

в). Написать процедуру поиска в заданном каталоге и всех его подкаталогах всех файлов по маске A?.B* (контрольное время - 20 минут).

Вообще не знаю. Никогда не искал файлы. Вроде как процедура FindFirst используются или как-то так... но не смотря в Win32SDK ни одной строчки написать не смогу.

г). В чем недостаток такого кода:
try
Obj := TMyObject.Create;
...
finally
Obj.Free;
end;


Вероятно в том, что Try должен быть после Obj := TMyObject.Create;
Иначе, если возникнет ошибка при создании объекта, то сразу будет попытка уничтожения объекта... а он еще может не создаться.

а). Что такое Custom-класс, абстрактный метод, классовый метод?

Custom не знаю. Абстрактный метод - это метод, который может быть использован в потомках класса с таким методом. Нельзя объявить переменную типа объект с абстрактными методами.
Классовый метод. Не уверен в терминологии. Но если это:
class function...
То это метод, которые может выполняться без создания экземпляра класса. Он не должен использовать методы и свойства класса (так как сам объект может быть не создан)

б). В чем главное отличие TLabel от TStaticText?
Не видел нигде тип TStaticText (может, не обращал внимания). Может быть, TStaticText это константа. Не смотря в дельфи не могу сказать.

в). От какого класса наследуется TCollection и почему.
Даже не представляю. Никогда с ним не работал


 
Страждущий   (2003-03-21 18:56) [77]

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

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

д). Написать модуль, содержащий класс, который позволяет создать лишь один свой экземпляр (контрольное время - 10 минут).

Наверное, есть какие-то функции, которые проверяют, существует ли уже объект такого-то типа. И если уже существует, то в OnCreate исключение. Но без справки даже не представляю как реализовать

а). Что такое объекты ядра? Перечислите несколько функций, в которых они используются.
не знаю

б). Приводят ли вызовы функций LoadLibrary/FreeLibrary к загрузке DLL в ОЗУ?
Ну если она еще не загружена - то приводят, думаю

в). Написать стандартный код цикла выборки сообщений (контрольное время - 2 минуты).
не очень понял, что надо. В общем, не знаю

г). Чем отличаются функции SendMessage, PostMessage и PosrThreadMessage?
Первая посылает сообщение в очередь приложения. Вторая сразу обращается к прилодению, используя DispatchMessage. Про третью никогда не слышал

д). Каково назначение функций GetStockObject и SelectObject?
не знаю :(((((


Нда-а-а-а... ну блин. Могу в свое оправдание сказать, что мне 18 лет всего... (или уже?).

Люди. Я так считаю, что тестирование не прошел это. Это означает, что меня не возьмут на работу ?
Понимаете, мне бы устроиться, посмотреть что другие люди делают, чем увлекаются. Что в работе требуются больше всего.

Эх, ладно, пойду дальше ответы читать.

P.S. Юрий Зотов, может, посоветуете мне что-нибудь ? Ну я даже не знаю... ну чтобы в следующий раз в грязь лицом не ударить?


 
D   (2003-03-21 19:17) [78]

> 18
Скорее, всего
Все то, что было в вопросах, далеко не все знают.
А образование получить не хотите? Работодатели на это тоже внимание обращают.
А программистами и весьма мало знающие люди работают (я, например) и знаний набираются на практике.


 
MBo   (2003-03-21 19:47) [79]

>Далее, integer(@I). Не понимаю. У меня две идеи:
>1) Бредовая. @I - это адрес на I. Тогда integer(@I) - это адрес >на I будет рассматриваться как число. Но так как адрес на I >предугадать невозможно, то точно нельзя будет сказать значение

@I - именно адрес переменной I. Он известен компилятору (если переменная локальна, то адрес относительно указателя стека), 32-х битный, как и Integer, поэтому его можно привести к этому типу (арифметические операции с указателями в Паскале намеренно ограничены) и прибавить 2,
а при приведении результата к типу указателя на Word и разыменовании его (^) получим значение старшего слова
(для платформы X86 именно так хранятся 32-битные числа)
0000000001111111 это 127




 
Страждущий   (2003-03-21 20:12) [80]

MBo, все равно не очень понял !

Можно подробнее.

1) Чему будет равно I после I := High(I) shr 8;

2) После этого чему будет равно Integer(@I) ?

3) Чему будет равно после этого PWord(Integer(@I) + 2) ?

и вообще, здесь непонятно. Если можно - поподробнее. Приведение к типу word я могу понять. Но приведение к типу указателя на word ? Чем он отличается от указателя на integer или string ?


 
JibSkeart   (2003-03-21 20:27) [81]

2Страждущий (21.03.03 20:12)
г). У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?

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

Вообшето все компоненты являются наследниками какого нибуть класса
-------------
А событие OnCreatе есть насколько я помню Наследниках от класса
Формы
хотя имхо его можно засунуть и в свой собственный класс
------------
2 Юрий Зотов
д). Написать модуль, содержащий класс, который позволяет создать лишь один свой экземпляр (контрольное время - 10 минут).

вот это я несовсем понял
------------
(Немогу выделить шрифт другим стилем :(( вылетаемс )


 
MBo   (2003-03-21 21:34) [82]

>Чему будет равно I после I := High(I) shr 8;
ты правильно написал

>После этого чему будет равно Integer(@I)
абсолютное значение этого числа (адреса, а не значение, которое там хранится) до компиляции или запуска программы нам неизвестно, да оно и несущественно
Пусть оно будет, к примеру, 1 000 000

>Чему будет равно после этого PWord(Integer(@I) + 2)

число в скобках=1 000 002, интерпретируемое как адрес, указывает на 3-й от начала байт числа I.
w:=PWord()^ означает, что 2 байта по этому адресу будут записаны в w, т.е. 3 и 4 байты физического расположения I, а это старшее слово





 
Ihor Osov'yak   (2003-03-21 21:45) [83]

2 Страждущий (21.03.03 20:12)
> MBo, все равно не очень понял !

Как иллюстрация к MBo © (21.03.03 21:34) - см. Ihor Osov"yak © (21.03.03 13:20)




 
Knight   (2003-03-21 22:21) [84]

>> Страждущий
Надо тест на ламера?)
(в зипе 28к)


 
Knight   (2003-03-21 22:47) [85]

Может кто тоже захочет проверить себя на знание минимального...

Можете скачать по ссылке:
http://solvichegodsk.narod.ru/Lamer.zip

Не волнуйтесь, вирусов там нет! Если не верите слову благородного рыцаря, загрузите Касперского или ещё кого :)



 
Страждущий   (2003-03-21 23:02) [86]

MBo, спасибо !

Но так до сих пор и не осознал:

1) Значит, строка I := High(I) shr 8; просто чтобы сбить с толку ?

2) число в скобках=1 000 002, интерпретируемое как адрес, указывает на 3-й от начала байт числа I.

В общем, понятно. То есть PWord(Integer(@I) + 2) это тоже самое, что Pointer(Integer(@I) + 2) ? Просто тогда бы была несовместимость с word
То есть, можно перезаписать выражение как
W := PWord(Pointer(Integer(@I) + 2))^; ?

3) w:=PWord()^ означает, что 2 байта по этому адресу будут записаны в w, т.е. 3 и 4 байты физического расположения I

Вот тут самые непонятки. Никак в толк не возьму, почему это так.
Если я правильно написал, то третий и четвертный байт будут равны FF. А это 65535 (DEC)


 
Страждущий   (2003-03-21 23:10) [87]

Так опять ошибся. Вопрос

>1) Значит, строка I := High(I) shr 8; просто чтобы сбить с толку ?

снимается. Что-то даже сам не понял, зачем запостил


 
MBo   (2003-03-21 23:14) [88]

>То есть, можно перезаписать выражение как
>W := PWord(Pointer(Integer(@I) + 2))^; ?
Да, верно


>Если я правильно написал, то третий и четвертный байт будут равны FF. А это 65535 (DEC)

Нет! Это отмечалось И.Осовяком в 13:20 и в моем постинге -
старшее слово физически хранится по младшему адресу, т.е.
$AAAABBBB располагается в памяти как
сдвиг от начала
0 1 2 3 (в байтах)
BB BB AA AA







 
Torry   (2003-03-22 00:11) [89]

Уровень обозначь?
Реальный определим...


 
Страждущий   (2003-03-22 00:25) [90]

MBo, огромное спасибо за помощь ! Теперь все понятно с заданием.

Но возникают вопросы. А это у integer"а так все наоборот или у всех типов ? И почему так ? Нету ссылочки на документацию ?


 
Ihor Osov'yak   (2003-03-22 00:34) [91]

2 Страждущий (22.03.03 00:25)

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



 
Ihor Osov'yak   (2003-03-22 00:37) [92]

> А это у integer"а так все наоборот или у всех типов ? И почему так ?

Во всяком случае для интеловской линейки и их клонов - да для всех типов. Для других архитектур не знаю. Исторически так сложилось.


 
Юрий Зотов   (2003-03-22 02:29) [93]

Попробую ответить в хронологии постов.


> stone © (21.03.03 10:31)

> Это типа ходячая энциклопедия?
До энциклопедии здесь - как до Луны. Практически, это необходимый минимум (да и то далеко не полный) для того, чтобы считаться приличным программистом на Delphi. А приличному программисту такие вещи положено знать наизусть - за исключением параметров процедур и других мелких технических деталей, которые всегда можно посмотреть в справке. Поэтому и было сказано - достаточно показать правильную схему.


> Mike_Goblin © (21.03.03 11:04)

> два значения override и overload. Какой имелся ввиду?
Там же сказано - процедура. Какой же может быть override?

> в. TPersistent. Метод Assign
Для коллекций все же САМОЕ главное, видимо, не Assign, а DefineProperties.

> д. В implementation секции - глобальную переменные
> Instance:TObject и RefCount

А зачем RefСount? Для ЭТОЙ задачи - лишнее.


> Игорь Шевченко © (21.03.03 11:08)
Можно :o)


> Ihor Osov"yak © (21.03.03 11:26)
Зачем лишние операции? Надо вынести Create из try, вот и все.


>Mike_Goblin © (21.03.03 11:41)

> OnCreate - есть у потомков TCustomForm.
И модулей данных.

> В ранних версиях вызывалось из конструктора класса, сейчас
> из AfterConstruction.

Зависит от OldCreateOrder.

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

Не обязательно конструктор, возможно Loaded (зависит от OldCreateOrder). Но все же, думаю, больше всего это нужно для того, что бы прикладник Вася мог просто квакнуть мышкой в Инспекторе и не заморачивать себе голову тонкостями создания и загрузки.

> Внутренние объекты ядра Windows, ну например кисти
> рисования, Handles. См TCanvas

Ядро Windows - это kernel. В справке эти объекты прямо так и называются - kernel objects (и все перечислены). Кисти к ним точно не относятся, а хэндлы - далеко не все. И эти объекты далеко не всегда внутренние (скажем, процессы).

> если DLL не загружена в память другими процессами - то
> вызов LoadLibrary загрузит ее туда.

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

> прочесть справку, я не держу в это голове
Я тоже не сумасшедший. Поэтому запоминаю не детали, а НАЗНАЧЕНИЕ функций. Чтобы при написании кода точно знать, какая из них мне в данном месте лучше всего подходит и сразу открыть хелп где надо, а не блуждать по нему в поисках неизвестно чего. Вопрос и был на НАЗНАЧЕНИЕ функций (причем, наверное, наиболее часто используемых), а не на детали их вызова.


> DiamondShark © (21.03.03 12:45)

> а маразм в вопросе 3 пункт д пропустил.
Что-то Вы сегодня и правда какой-то сердитый, батенька. Почему маразм? По такому принципу, например, довольно часто строятся различные глобальные списки, их менеджеры и пр. Вполне обычная практика, никакого маразма. Возможно, Вы просто еще с этим не сталкивались, так ведь это же еще ни о чем не говорит, не так ли?


> han_malign © (21.03.03 13:11)

> если в моем конструкторе возникает Exeption - значит,
> либо пора делать сепуку программе(ну кончились ресурсы),
> либо харакири себе,


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


> Ihor Osov"yak © (21.03.03 13:20)

Конечно, в вопросе 1 спрятана ловушка - именно перестановка байт. Конечно, там не зря сказано о платформе x86. Строгости ради в вопросе надо было еще упомянуть: "32-битный".


> Ihor Osov"yak © (21.03.03 14:28)

Заготовок не было. Была старческая бессонница. Надо же было чем-то со скуки заняться? Вот и занялся любимым делом стариков - молодежь жизни учить.
:о)


> y-soft © (21.03.03 14:45)

Запой - это не страдание. Это счастье. Мудрые и познавшие Истину СуперГуру таким образом уходят в Мир Внутреннего Равновесия. У йогов это еще называется "нирвана". Тьфу... слово-то какое... куда им, этим тощим в повязках, до наших дядей Васей!
;о)


> All

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

Ну? Есть тут серьезные Component Writer"ы?
:o)



 
Юрий Зотов   (2003-03-22 02:31) [94]

> Страждущий

Я внимательно прочитал Ваши постинги. Могу совершенно точно сказать, что для 18 лет Вы очень даже неплохо выглядите - это чувствуется уже даже по используемой Вами терминологии. Но главное то, что Вы на верном пути. Не всякие там детские игрушки в виде трояна, в котором ничего своего нет, а все надергано из Инета и кое-как слеплено в 400-метровый EXE. А ОСНОВЫ!!! Типы данных! Двоичный код! Работа с памятью! Язык! ООП! И т.д.

Кстати, в работе с памятью у Вас чувствуются пробелы. Очень советую капитально проштудировать тему "Указатели и динамическая память".

И еще - серьезному программисту все же нужно высшее образование. Лучше всего - по этой же специальности, но можно и техническое. Так что ОЧЕНЬ советую не спешить устраиваться на работу (даже программистом), а всерьез подумать о серьезном ВУЗе.

Последнее. Если хотите - присоединяйтесь (только придется догонять):
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1046809017&n=3


 
Tux   (2003-03-22 03:07) [95]

Знаете, Юрий, какой-то рекрутер майкрософт пришел к выводу, что понимание принципов работы с динамической памятью есть способность - это либо дано, либо нет. Наверное, не совру, если скажу, что 8 из 10 делфистов, которые никогда не работали с С/С++, указателей-аресации-разадресации не понимают вовсе. Это по опыту трех десятков собесдований с кандидатами.
* * *
> Mike_Goblin
Кстати, реализацию синглтона на основе счетчика ссылок сишники посчитали бы за дурной тон, поскольку она, придираясь, во-первых, избыточна, во-вторых, в вашей реализации, потоконебезопасна. Приличнее создать static-функцию и проверять статическую переменную-экземпляр синглтона на равенство NULL, при равенстве - создавать, при неравенстве - отдавать указатель, причем на всякий пожарный защищать код CriticalSectionами или т.п.


 
y-soft   (2003-03-22 09:16) [96]

>Юрий Зотов © (22.03.03 02:29)

Запой - это не страдание. Это счастье. Мудрые и познавшие Истину СуперГуру таким образом уходят в Мир Внутреннего Равновесия

Ой, зачем Вы это говорите убежденному трезвеннику и рационалисту. Моя доля - растаскивать упившихся Гуру после вечеринок по домам...:)


 
JibSkeart   (2003-03-22 09:41) [97]

Юрий Зотов © (22.03.03 02:29)

> All

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

Ну? Есть тут серьезные Component Writer"ы?
:o)


Хмм на сколько я помню веть енто событие посылает Винда
Правильно помню ??
и может быть отсюда следует искать ответ ??
Или нет ??
В чем неправ .. просто уже все go out of mind :o)


 
Knight   (2003-03-22 09:51) [98]

Господа!

Никто не будет против если попрошу тут помощи...

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1048190634&n=3

Прога горит до вторника сделать надо, а я пока компонент для работы с базами не писал :(


 
vuk   (2003-03-22 10:33) [99]

>И все же никто так и не ответил на вопрос о том, почему
>OnCreate есть только у форм и модулей данных, а у других
>компонентов - нет.

Ну, на первый взгляд, OnCreate мы видим у компонентов-контейнеров (формы и модули данных), тех для которых есть свои файлы форм и, соответственно, ресурсы в .exe. А OnCreate вызывается после загрузки формы из ресурсов.

P.S. Жалко, что такого Event-а нет у фреймов - приходится постоянно перекрывать AfterConstruction(90% используемых фреймов).


 
Юрий Зотов   (2003-03-22 11:14) [100]

> JibSkeart © (22.03.03 09:41)

> на сколько я помню веть енто событие посылает Винда
> Правильно помню ??

Увы, неправильно. Это событие возбуждается кодом VCL (метод DoCreate). В Винде тоже есть термин "событие", и даже в двух разных контекстах, но ни один из этих контекстов к событиям компонентов Delphi не имеет никакого отношения. Многие события Delphi имеют отношение к СООБЩЕНИЯМ системы - но только не OnCreate, это событие чисто VCL"ное.


> и может быть отсюда следует искать ответ ??

Подскажу - ответ следует искать в порядке создания компонентов и их инициализации из ресурсов.


 
Страждущий   (2003-03-22 11:44) [101]

Мастера ! Осталось ма-а-аленькая непонятка :)

Если есть четырехбайтовая переменная
AA BB CC DD
то в памяти она будет распологаться как

1) DD CC BB AA
или как
2) CC DD AA BB ?

По Ihor Osov"yak © (21.03.03 13:20) я понял, что верно первое:
$007FFFFF ... FF FF 7F 00

А вот прочитав MBo © (21.03.03 23:14) возникли сомнения (из-за использования одинаковых букв)

P.S. А у string тоже так, последний символ идет в памяти первым ?

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

AA BB CC DD
..........^ указатель указывает на DD ? И остальные байты этой переменной идут перед ним ?


 
Страждущий   (2003-03-22 11:47) [102]

Из-за форматирования неправильно немного отразилось, должно быть:

AA BB CC DD
..............^ указатель указывает на DD ? И остальные байты этой переменной идут перед ним ?


 
MBo   (2003-03-22 11:53) [103]

проверь сам:

procedure TForm1.Button2Click(Sender: TObject);
var a:DWord;
begin
PByteArray(@a)[0]:=1;
PByteArray(@a)[1]:=2;
PByteArray(@a)[2]:=3;
PByteArray(@a)[3]:=4;
Caption:=IntToHex(a,8);
end;

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



 
JibSkeart   (2003-03-22 12:09) [104]

Юрий Зотов © (22.03.03 11:14)
Хмм значит уже каша в голове все спуталось :(

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


 
Юрий Зотов   (2003-03-22 13:19) [105]

> Страждущий (22.03.03 11:44)

1. Перестановка байт относится к целым переменным, а не к массивам. Строка - это массив.

2. Адрес переменной любого типа всегда указывает на ее младший байт. Не на байт с младшей частью ЗНАЧЕНИЯ, а на байт с младшим АДРЕСОМ. То есть - на начало УЧАСТКА, по которому данная переменная размещена в памяти.

3. Целая переменная со значением AABBCCDD в памяти хранится так:

- сначала меняем местами слова (точнее, машинные полуслова, потому что МАШИННОЕ (не Паскалевское) слово здесь - 4 байта).
Получаем: CCDDAABB

- теперь в каждом слове меняем местами его байты.
Получаем: DDCCBBAA

Вот это и есть физическое расположение числа в памяти для 32-битного x86. Указатель на него дает адрес ПЕРВОГО (точнее, нулевого) байта - то есть, адрес байта, в котором записано DD.

Но если написать:

type
PInt = ^Integer;
var
I, J: Integer;
begin
I := $AABBCCDD;
J := PInt(@I)^
end;

то J будет равно $AABBCCDD, а не $DDCCBBAA. Это разруливается автоматически (ведь PInt - это ТИПИЗИРОВАННЫЙ указатель, значит и содержимое, на которое он указывает, рассматривается ЦЕЛИКОМ, как 4-х байтовое число, а не как набор из 4-х отдельных байт). А если написать так:

type
PByte = ^Byte;
var
I: Integer;
B: byte;
begin
I := $AABBCCDD;
B := PByte(@I)^
end;

то B будет равно $DD. По той же причине типизированного указателя и автоматической интерпретации того, на что он указывает, как одного ОТДЕЛЬНО взятого байта.

Чтобы увидеть всю эту кухню своими глазами, сделайте такую вещь.

1. Бросьте на форму кнопку и напишите к ней обработчик OnClick:

procedure TForm1.Button1Click(Sender: TObject);
var
I: integer;
begin
I := $AABBCCDD;
Caption := IntToStr(I); // Здесь поставьте BreakPoint
end;


2. В опциях проекта отключите оптимизацию (вкладка Compiler), сделайте проекту Build, запустите и щелкните по кнопке. Приходим на BreakPoint и начинаем наши исследования.

3. Откройте окно Watch List (меню View - Debug Windows - Watches). Дважды щелкните по его верхней пустой строке, а в отрывшемся диалоге введите @I, поставьте Hexadecimal и нажмите OK. Получите шестнадцатиричный адрес переменной I - запишите его на бумажку.

4. Откройте окно CPU (меню View - Debug Windows - CPU). Сделайте правый клик в его левом нижнем поле и в менюшке выберите GoTo Address. В диалоге введите ранее полученный адрес I (не забудьте в его начале написать $ - он же шестнадцатиричный) и нажмите OK. Содержимое левого нижнего поля изменится - это мы перешли на нужный адрес и теперь поле отражает содержимое памяти по этому адресу.

5. Снова сделайте правый клик по этому полю и выберите Display As -> Bytes. Теперь Вы видите память ТОЧНО в ее внутреннем машинном представлении - и там Вы увидите: DD BB CC AA. Это и есть точное внутреннее представление переменной I в памяти. Как видите, в нем переставлены слова, а внутри слов - байты. То, о чем я говорил выше.

6. Если теперь выбрать Display As -> DWords, то мы увидим AABBCCDD - то есть, ЗНАЧЕНИЕ переменной I. Конечно, содержимое памяти не изменилось, изменился только СПОСОБ, которым нам его показывают (в виде цельных 4-х байтовых слов). Можно выбрать и Display As -> Words, тогда увидим содержимое памяти в виде двухбайтовых слов: CCDD AABB. Слова видим переставленными (ведь они действительно переставлены), но байты в них - не переставленными (потому, что нам показывают не отдельные байты, а 2-х байтовые слова целиком).

Вот такие особенности у этих x86.


 
vuk   (2003-03-22 14:26) [106]

>и там Вы увидите: DD BB CC AA

DD CC BB AA


 
Юрий Зотов   (2003-03-22 14:48) [107]

> vuk © (22.03.03 14:26)

Конечно. Опечатка, sorry.


 
Knight   (2003-03-22 15:13) [108]

>> Юрий Зотов

Зайди если не сложно на:

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1048190634&n=3

Очень нужен совет.


 
Страждущий   (2003-03-22 20:50) [109]

Юрий Зотов, огромное Вам человеческое спасибо !

С удовольствием присоединяюсь к вашему обучению для начинающих программистов !


 
Mike_Goblin   (2003-03-23 14:50) [110]

>Tux © (22.03.03 03:07)
Про потокобезопасность согласен, InterlockedIncrement function поможет, а вот про
>Приличнее создать static-функцию и проверять статическую >переменную-экземпляр синглтона на равенство NULL
Вы в ObjectPascal видели статические переменные?


 
Mike_Goblin   (2003-03-23 15:02) [111]

2 Юрий Зотов
по поводу OnCreate
он есть у классов, которые должны редактироваться визуально в конструкторе форм (TCustomForm, TDataModule). Если бы его не было, то товарищ Пупкин должен был бы дописывать код конструктора или AfterConstruction - а это процесс не визуальный (это методы и они не видны в инспекторе объектов), т.е он огорчился бы от невозможности программировать мышью.

>Ну? Есть тут серьезные Component Writer"ы?
>:o)
Да - это Вы :)


 
Юрий Зотов   (2003-03-23 16:52) [112]

> Mike_Goblin © (23.03.03 15:02)

> По поводу OnCreate.

Однако же, мы бы могли помочь бедняге Васе, и сделать такой компонент:

type
TSuperPuperComponent = class(TComponent)
private
FOnCreate: TNotifyEvent;
protected
procedure DoCreate; dynamic;
public
constructor Create(AOwner: TComponent); override;
published
property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
end;

constructor TSuperPuperComponent.Create(AOwner: TComponent);
begin
inherited;
DoCreate
end;

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

Компонент сделан строго по всем классическим канонам. И в Инспекторе появится событие OnCreate. И Васе не надо будет замещать никаких AfterConstruction - он сможет просто квакнуть мышкой и написать: ShowMessage("Привет, Вася!").

Тем не менее, по каким-то причинам в Borland так не сделали. А вот по каким?


 
vuk   (2003-03-23 17:02) [113]

to Юрий Зотов:
>А вот по каким?
На момент вызова не будут загружены свойства, ведь сначала вызывается конструктор компонента и только потом загружаются свойства. В том числе и само значение свойства OnCreate. OnCreate же форм и модулей данных, как я уже написал, вызывается после загрузки формы - тогда, когда все компоненты и обработчики уже инициализированы.




 
Юрий Зотов   (2003-03-24 02:08) [114]

Ну вот, так я и знал, что умный vuk все испортит :о)

Вот именно. Компонент выше формально выполнен безукоризненно, вот только смысла в нем никакого нет - событие OnCreate при таком его возбуждении не произойдет НИКОГДА! Поэтому его и нет ни у каких компонентов, кроме тех, которые имеют свои ресурсы. И возбуждается оно не сразу после создания, а именно после загрузки ресурсов. Потому что только после этого обработчик будет действительно назначен(и, кроме того, уже будут правильно проинициализированы все свойства всех компонентов - иначе в своем обработчике юзер запросто мог бы нарваться на ошибку).


 
VaS   (2003-03-24 09:05) [115]

Юрий Зотов: А Вас не удивили ответы некоторых Мастеров? Мне лично стало в очередной раз грустно - средний уровень делфи-прораммистов низок.


 
vuk   (2003-03-24 10:52) [116]

to Юрий Зотов:
>vuk все испортит
Ну вот. Всем можно свой уровень проверять, а мне нет. :o)

P.S. Засыпался на первом вопросе.


 
Romkin   (2003-03-24 10:55) [117]

2VaS А ты меня по БД протестируй :-)))

У меня возник некоторый вопрос по поводу синглетона. Все, конечно, замечательно здесь написано, вот только у Борланд такого кода, имхо, не встречается. Что мешает, к примеру, создавать синглетон как, например, Printer?
в implementation - переменная FSingleton
interface - function Singleton: TSingleton,
в ней if not assigned(FSingleton) then FSingleton := TSingleton.Create(...);
Result := FSingleton;

И все вроде нормально... Чем плохо?


 
vuk   (2003-03-24 11:05) [118]

to Romkin:
>Чем плохо?
Тем, что не синглетон это, а автоматическое создание экземпляра.


 
Romkin   (2003-03-24 11:09) [119]

И чем мешает? Только не надо о частностях - в конструкторе я ведь могу проверить переменную и выдать исключение, если уже есть объект. Плюс - все как от Борланд ж-) а о session & sessions я вообще молчу :-)))


 
vuk   (2003-03-24 11:17) [120]

to Romkin:
>в конструкторе я ведь могу проверить переменную и выдать
>исключение, если уже есть объект
О! Тут-то собака и порылась! Если Вы возбуждаете исключение в конструкторе, то последствия, надеюсь, понятны - нужно ловить исключения, нужна глобальная общедорступная переменная или функция и т.п. А перекрытие NewInstance/FreeInstance дает простой способ - делается вызов конструктора, но возвращается всегда один и тот же объект. И никаких исключений.

>Плюс - все как от Борланд
Еще раз. Borland не делал синглетон из TPrinter, т.к. создать другие экземпляры можно.


 
REA   (2003-03-24 11:25) [121]

А я не понял в чем смысл этого "синглетона"? Есть глобальная переменная (хорошо бы еще только для чтения, или объект класса SystemObjects или WindowsObjects) и не надо ее трогать. Тут конечно может быть возражение, что не надо память засорять, пока оно не используется, но логичнее (наверно) выделять ресурсы при первом вызове.
Кстати на мое замечание, что Integer это generic тип не отреагировали - раньше он был короче, а позже будет длиннее.

>а). Что такое объекты ядра? Перечислите несколько функций, в которых они используются.
По памяти и не вспомню, что из них объекты ядра (File Handelrs, семафоры, мьютексы, пайпы, waitable timers, Atoms, Timer Queue? Много еще чего наверно.).
Хотя уж точно не GDI и не USER. А что - есть те кто все объекты ядра вспомнили? Надо еще уточнить, что OS=Windows.


 
vuk   (2003-03-24 11:32) [122]

to REA:
>А я не понял в чем смысл этого "синглетона"?
Никогда не сталкивались с ситуацией, когда у класса должен быть только один экземпляр, доступный во многих местах?


 
REA   (2003-03-24 11:40) [123]

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


 
vuk   (2003-03-24 11:46) [124]

to REA:
>Делал глобальную переменную.
Которая не защищена от доступа извне? Тогда реальной гарантии несоздания нескольких экземпляров нет.


 
Romkin   (2003-03-24 11:52) [125]

2vuk Application - что, тоже другие экземпляры кто-то делал?
Насчет исключения в конструкторе - просто программист должен знать, что он и где


 
vuk   (2003-03-24 12:00) [126]

to Romkin:
>Application - что, тоже другие экземпляры кто-то делал?
Но защита от дурака (точнее - от шибко умного) не помешала бы.

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


 
REA   (2003-03-24 12:03) [127]

>Которая не защищена от доступа извне?
По большому счету нет ничего защищенного, а защита просто от незнания внутреннего устройства объекта (маскировка того что переменная глобальная). С другой точки зрения, если не знать, что это синглетон, то можно делать ложные предположения о поведении объекта, что не менее опасно, чем иметь глобальную переменную (которая и описана в документации, как глобальная).


 
Alibaba   (2003-03-24 12:07) [128]

Ну Вы, блин, даете... :)


 
vuk   (2003-03-24 12:17) [129]

to REA:
>можно делать ложные предположения о поведении объекта, что не
>менее опасно, чем иметь глобальную переменную
Предположения, однако, не влияют на правильность работы синглетона, в отличие от наличия глобальной переменной.
А ложные предположения можно делать и в другом случае. Например, почему для создания экземпляра нужно не конструктор вызывать, а что-то другое? :o)


 
REA   (2003-03-24 13:13) [130]

Для создания именно "экземпляра", а не ссылки на экземпляр.
Потому что для вызова функции используются (), а не {} - потому что все так привыкли. Для получения ссылки логичнее использовать специализированную функцию: GetMyGlobalObjectReference, если уж не давать доступ по записи к переменной. А вообще можно было и в языке сделать ReadOnly модификатор переменной.


 
blackman   (2003-03-24 13:32) [131]

просто программист должен знать, что он и где и почем м зачем
Ну Вы, блин, даете... :)


 
vuk   (2003-03-24 13:49) [132]

to REA:
>Для создания именно "экземпляра", а не ссылки на экземпляр.
Понятия "создание ссылки на экземпляр" не существует. А конструктор, кстати, возвращает эту самую ссылку. Какая, скажите мне, клиенту разница, откуда она взялась? Он захотел экземпляр - он его получил.

Кстати, а почему экземпляр у Вас в кавычках?


 
REA   (2003-03-24 15:11) [133]

Вобщем дискуссия зашла в тупик и сильно отклонилась от топика :)
Предлагаю каждому остаться при своем мнении.



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

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

Наверх





Память: 0.91 MB
Время: 0.009 c
1-30456
denis24
2003-03-26 15:35
2003.04.10
замена символа в textbox


6-30494
edst
2003-02-17 09:24
2003.04.10
Interbase + Dial Up + WinRoute


3-30260
esa
2003-03-21 12:50
2003.04.10
шифрование пароля


8-30474
Mr Black
2003-01-05 02:34
2003.04.10
Прозрачность формы


3-30317
sergun
2003-03-23 20:59
2003.04.10
КАК без ПАРАДОКСА загнать картинки в поля типа Graphic





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