Это еще не мануал по языковым изменениям и пр., как прошлогодний с Тибуроном. Это просто мои первые впечатления после того, как я немножко поигрался с новой версией RAD Studio.
CodeGear Embarcadero, как я понял, есть одна занятная привычка: они не заморачиваются. Годовой релиз, по их мнению — это ровно два КРУПНЫХ нововведения в языке и компиляторе, пяток мелких, повысить версии поддерживаемых БД/протоколов (возможно, добавить пару новых — если настроение с утра будет подходящим), подогнать VCL под свежие возможности Винды и прикола ради выполнить десяток-другой запросов из QC по поводу IDE. А вместе, в общем и целом, набирается достаточная база для того, чтобы на протяжении одного-двух месяцев наполнять блоги delphifeeds.com демонстративными постами и разъезжать по миру с конференциями и демонстрациями. Ах да, еще есть CodeRage, на котором обязательно надо рассказать разработчикам, как теперь они могут быстро и просто по-новому делать то, что они делали вот уже много лет как собственными усилиями.
На самом деле я сейчас произнёс не более чем длинную скептическую тираду =) Потому что всё это перечисление не имеет никакого смысла, пока я не уточню, что же ИМЕННО выбрали в качестве "крупных нововведений" в этом году коджировцы. И вот тогда уже можно о чём-то говорить. Самое интересное вот в чём: релиз RAD Studio выходит раз в год, релиз Visual Studio вместе с новым .NET Framework — раз года в три. Каждый релиз последней, соответственно, приносит нам примерно в 3 раза больше фич, чем типичный релиз первой. Иногда и того меньше (фичи C# 4, к примеру, по сравнению с C# 3 тянут как раз на годик работы коджировцев). Но вот в чём загвоздка: эти фичи доработаны. То есть ты смотришь на них, читаешь один-два поста в блогах MSDN и сразу думаешь: "Ага, отлично, вот это я могу приткнуть сюда, а вон то так и просится вон в тот мой класс месячной давности". И все рады и довольны. Коджировцы же, в свою очередь, работают несколько иначе. После того, как Хейлсберг, гениальный представитель стыка тысячелетий, ушёл в MS, последние версии Delphi исповедуют принцип "А теперь возьмём вон ту фичу C#, сделанного нашим же идеологом с учётом прошлых граблей, и реализуем её в нативном Делфи, как он и хотел бы". Но поскольку они не Хейлсберг, то фича реализовывается... ммм... не до конца. Их можно понять, у них меньше людей, времени ровно год, а не три, бюджет поджимает... но всё-таки каждый август я, читая delphifeeds, восклицаю "Wow!", а через некоторое время, немножко покодив на свежем релизе, чешу затылок и думаю "Твою мать..."
Хотите конкретики? OK, поясняю, что я имею в виду. Возьмём в качестве примера 2009 год и дженерики. Ясное дело, дженерики — это был гигантский прорыв в Делфи, их многие годы ждали, без них было дико неудобно программировать кучу специфических вещей, с этим никто и не спорит. Но вот что интересно... дженерики-то ввели, а обеспечить их должную поддержку на требуемом уровне так и не получилось (не успели?). К примеру, в IDE простейший рефакторинг "Rename" при попытке подсунуть ему обобщённый тип начинал заикаться и материть разработчика непечатными словами. IDE считала ошибками безобиднейшие конструкции DeCAL2009, из-за чего я практически не мог пользоваться рефакторингом во время кодинга на Делфи: ну не жует она код, в котором есть "красные подчеркивания"! Хотя все конструкции корректны, и компилятор спокойно обрабатывал весь код без единого варнинга даже. Дальше, если у нас уже есть модуль Generics.Collections с обобщёнными классами и интерфейсами, то почему бы не переделать на него VCL? Почему-то до сих пор банальнейший TListView своё свойство Items представляет как специфический класс TListItems, а не просто а-ля TList<TListIem>, хотя функционал у них идентичен. Обратная совместимость — это замечательно, но в итоге библиотека хромает на обе ноги. В конце концов, чтобы решить проблемы обратной совместимости, можно вспомнить, как в незапамятные времена добрые люди придумали интерфейсы.
К чему я веду, собственно... Любая новая возможность в C# появляется интегрированной: типичные сценарии её использования продуманы и встроены в FCL, IDE ведёт себя так, словно фича была здесь всегда, и дополнительно предлагается кучка новых классов/структур/интерфейсов/методов старых классов, которые удобно используют эти новые возможности. Delphi же исторически предназначен для сторонних разработчиков, традиция писать под него сотни новых компонентов и библиотек не переведётся, пока существует на свете сам Delphi. Поэтому любая новая возможность Делфи вводится в компилятор, обеспечивается простейшей базовой поддержкой, документируется с парой примеров — и гуляйте, ребята, пишите монструозные библиотеки с её юзаньем, улучшайте программистам жизнь, мы своё дело сделали.
И это удручает.
Простая ведь штука, на самом-то деле. Просто определённый вид пометки любой сущности с возможностью конкретизации этой пометки несколькими параметрами. Самое интересное в том, что сам атрибут по факту ничего не делает: для того, чтобы воспользоваться его возможностями, нужно написать где-нибудь код, который в run-time берет информацию о требуемом объекте, проверяет наличие у него некоторого атрибута, и в случае его присутствия уже делает своё чёрное дело, чего, собственно, и хотел человек, навесивший на объект этот атрибут. Часто это не слишком-то удобно на самом деле, но уж как есть. С помощью атрибутов отлично реализуется парадигма АОП (аспектно-ориентированного программирования), что, собственно, и сделали ребята из RemObjects, родив для Delphi Prism замечательный фреймворк под названием Cirrus. А когда у тебя есть АОП-фреймворк — у тебя есть краткий и не морозящий мозги способ реализовать логирование, многопоточность, запись сущностей в БД, контрактное программирование и кучу прочих прелестей, которые иначе вылились бы в гору лишних мусолящих взгляд строчек в твоем исходнике. Шикарно, на самом-то деле. Главное, чтобы такой фреймворк кто-нибудь написал — или продемонстрировал общие принципы его создания.
Вот тут и кроется проблема, затронутая мною в предисловии. Да, в Делфи теперь есть шарповские атрибуты, они аналогичным образом наследуются от TCustomAttribute, имеют всё тот же интуитивный синтаксис и подчиняются тем же законам использования. Вот только в среде они обозначены лишь четырьмя страничками справки. Я не нашёл в VCL и RTL ни одного сделанного руками коджировцев атрибута. Ни тебе Serializable, ни Log, ни Obsolete. Возможно, атрибуты были использованы, чтобы дать нам свежие возможности RTTI, не знаю; в справочной системе об этом нет ни слова, в модуле Rtti мною не было найдено ни одного атрибута. В общем и целом, пока какая-то добрая душа не реализует полный фреймворк, аналогичный Cirrus`у, использовать атрибуты бесполезно. Потому что любой мой собственный исходник будет в итоге велосипедом.
Хочется большего и прямо сейчас — идём на delphifeeds, читаем один практический пример. Нет, лучше еще один.
Да, кстати. Атрибуты не полностью скопированы с C#. В справочной системе я, к примеру, не нашёл способа, как применить атрибут к возвращаемому значению функции. То, для чего в Шарпе предназначены атрибутные префиксы, а-ля [return: MinimumInteger(10)]. Про подобные префиксы устранения неоднозначности в Делфи (а их же тьма-тьмущая: assembly, return, type, method, param...) в справке не сказано ни слова.
Теперь про RTTI. Здесь у меня нет ни единой претензии. Подобной универсальной системы ждали все, и ждали довольного долго, и теперь работа с RTTI в Делфи ничем не уступает дотнетовскому или джавовскому отражению. Просто скопирую сюда код из статьи, совмещающий демонстрацию использования RTTI и атрибутов:
Вот модулем Rtti я теперь с удовольствием буду пользоваться на каждом шагу. И всем рекомендую.
Чтобы кастомизировать процесс создания метаинформации для RTTI, можно использовать новые директивы {$RTTI} и {$WEAKLINKRTTI}. Они дают всю необходимую гибкость.
Дальше идёт директива delayed. Степень полезности — средняя, но применение найти можно. Короче говоря, это отложенный вызов функции из библиотеки. Если вы собираетесь экспортировать функцию из дллки, в которой по какой-то причине этой функции может и не быть (проблемы версий), пишете delayed, а в рантайме уже проверяете, какую реализацию использовать: библиотечную, точно зная, что при данных условиях вызов функции не навернется, или собственную. Таким образом был реализован механизм естественного ввода (жестов и тачей) в VCL Weaver`а: на Windows 7 используем системные функции, а на предыдущих ОС — собственный движок. Исходник из delphifeeds:
Главная польза, наверное — отсутствие пяти строк дополнительного кода везде, где раньше с этой целью использовали динамическую загрузку DLL.
Последняя фича действительно очень и очень востребована — это кастинг интерфейсов обратно в объект, на который он ссылается. Если вы создали экземпляр некоторого объекта, реализующего некоторый интерфейс, а потом присвоили ссылку на этот объект переменной интерфейсного типа, вы можете воспользоваться старыми добрыми операторами as и is, чтобы привести эту переменную обратно к объектному типу. Да что там, даже старый паскалевский небезопасный кастинг (с использованием имени типа) здесь сработает. Все правила остаются в силе — если запрошенный класс не реализует данный интерфейс, as выбросит исключение, is вернёт false, а небезопасный кастинг просто присвоит итоговой переменной nil. Всё просто.
Работает такой кастинг только для дельфийских объектов. COM`у — нет =) Почему — читайте здесь
Предисловие, или отвлечённые размышления про Embarcadero и Microsoft
У ребят изНа самом деле я сейчас произнёс не более чем длинную скептическую тираду =) Потому что всё это перечисление не имеет никакого смысла, пока я не уточню, что же ИМЕННО выбрали в качестве "крупных нововведений" в этом году коджировцы. И вот тогда уже можно о чём-то говорить. Самое интересное вот в чём: релиз RAD Studio выходит раз в год, релиз Visual Studio вместе с новым .NET Framework — раз года в три. Каждый релиз последней, соответственно, приносит нам примерно в 3 раза больше фич, чем типичный релиз первой. Иногда и того меньше (фичи C# 4, к примеру, по сравнению с C# 3 тянут как раз на годик работы коджировцев). Но вот в чём загвоздка: эти фичи доработаны. То есть ты смотришь на них, читаешь один-два поста в блогах MSDN и сразу думаешь: "Ага, отлично, вот это я могу приткнуть сюда, а вон то так и просится вон в тот мой класс месячной давности". И все рады и довольны. Коджировцы же, в свою очередь, работают несколько иначе. После того, как Хейлсберг, гениальный представитель стыка тысячелетий, ушёл в MS, последние версии Delphi исповедуют принцип "А теперь возьмём вон ту фичу C#, сделанного нашим же идеологом с учётом прошлых граблей, и реализуем её в нативном Делфи, как он и хотел бы". Но поскольку они не Хейлсберг, то фича реализовывается... ммм... не до конца. Их можно понять, у них меньше людей, времени ровно год, а не три, бюджет поджимает... но всё-таки каждый август я, читая delphifeeds, восклицаю "Wow!", а через некоторое время, немножко покодив на свежем релизе, чешу затылок и думаю "Твою мать..."
Хотите конкретики? OK, поясняю, что я имею в виду. Возьмём в качестве примера 2009 год и дженерики. Ясное дело, дженерики — это был гигантский прорыв в Делфи, их многие годы ждали, без них было дико неудобно программировать кучу специфических вещей, с этим никто и не спорит. Но вот что интересно... дженерики-то ввели, а обеспечить их должную поддержку на требуемом уровне так и не получилось (не успели?). К примеру, в IDE простейший рефакторинг "Rename" при попытке подсунуть ему обобщённый тип начинал заикаться и материть разработчика непечатными словами. IDE считала ошибками безобиднейшие конструкции DeCAL2009, из-за чего я практически не мог пользоваться рефакторингом во время кодинга на Делфи: ну не жует она код, в котором есть "красные подчеркивания"! Хотя все конструкции корректны, и компилятор спокойно обрабатывал весь код без единого варнинга даже. Дальше, если у нас уже есть модуль Generics.Collections с обобщёнными классами и интерфейсами, то почему бы не переделать на него VCL? Почему-то до сих пор банальнейший TListView своё свойство Items представляет как специфический класс TListItems, а не просто а-ля TList<TListIem>, хотя функционал у них идентичен. Обратная совместимость — это замечательно, но в итоге библиотека хромает на обе ноги. В конце концов, чтобы решить проблемы обратной совместимости, можно вспомнить, как в незапамятные времена добрые люди придумали интерфейсы.
К чему я веду, собственно... Любая новая возможность в C# появляется интегрированной: типичные сценарии её использования продуманы и встроены в FCL, IDE ведёт себя так, словно фича была здесь всегда, и дополнительно предлагается кучка новых классов/структур/интерфейсов/методов старых классов, которые удобно используют эти новые возможности. Delphi же исторически предназначен для сторонних разработчиков, традиция писать под него сотни новых компонентов и библиотек не переведётся, пока существует на свете сам Delphi. Поэтому любая новая возможность Делфи вводится в компилятор, обеспечивается простейшей базовой поддержкой, документируется с парой примеров — и гуляйте, ребята, пишите монструозные библиотеки с её юзаньем, улучшайте программистам жизнь, мы своё дело сделали.
И это удручает.
Языковые возможности
Декларативное программирование, в отличие от императивного, не так плотно вошло в нашу жизнь. На самом деле миллионы человек ежедневно пользуются его плодами, бродя по HTML-страничкам (да-да, несмотря на то, что HTML — язык разметки документа, его также смело можно назвать и попросту декларативным ЯП). Но вот активное использование этой концепции в других областях, кроме Веб-разметки, скриптинга и пр., а также с более продвинутыми возможностями, встречалось очень редко. До тех пор, пока команда разработчиков .NET не предложила всем атрибуты.Простая ведь штука, на самом-то деле. Просто определённый вид пометки любой сущности с возможностью конкретизации этой пометки несколькими параметрами. Самое интересное в том, что сам атрибут по факту ничего не делает: для того, чтобы воспользоваться его возможностями, нужно написать где-нибудь код, который в run-time берет информацию о требуемом объекте, проверяет наличие у него некоторого атрибута, и в случае его присутствия уже делает своё чёрное дело, чего, собственно, и хотел человек, навесивший на объект этот атрибут. Часто это не слишком-то удобно на самом деле, но уж как есть. С помощью атрибутов отлично реализуется парадигма АОП (аспектно-ориентированного программирования), что, собственно, и сделали ребята из RemObjects, родив для Delphi Prism замечательный фреймворк под названием Cirrus. А когда у тебя есть АОП-фреймворк — у тебя есть краткий и не морозящий мозги способ реализовать логирование, многопоточность, запись сущностей в БД, контрактное программирование и кучу прочих прелестей, которые иначе вылились бы в гору лишних мусолящих взгляд строчек в твоем исходнике. Шикарно, на самом-то деле. Главное, чтобы такой фреймворк кто-нибудь написал — или продемонстрировал общие принципы его создания.
Вот тут и кроется проблема, затронутая мною в предисловии. Да, в Делфи теперь есть шарповские атрибуты, они аналогичным образом наследуются от TCustomAttribute, имеют всё тот же интуитивный синтаксис и подчиняются тем же законам использования. Вот только в среде они обозначены лишь четырьмя страничками справки. Я не нашёл в VCL и RTL ни одного сделанного руками коджировцев атрибута. Ни тебе Serializable, ни Log, ни Obsolete. Возможно, атрибуты были использованы, чтобы дать нам свежие возможности RTTI, не знаю; в справочной системе об этом нет ни слова, в модуле Rtti мною не было найдено ни одного атрибута. В общем и целом, пока какая-то добрая душа не реализует полный фреймворк, аналогичный Cirrus`у, использовать атрибуты бесполезно. Потому что любой мой собственный исходник будет в итоге велосипедом.
Хочется большего и прямо сейчас — идём на delphifeeds, читаем один практический пример. Нет, лучше еще один.
Да, кстати. Атрибуты не полностью скопированы с C#. В справочной системе я, к примеру, не нашёл способа, как применить атрибут к возвращаемому значению функции. То, для чего в Шарпе предназначены атрибутные префиксы, а-ля [return: MinimumInteger(10)]. Про подобные префиксы устранения неоднозначности в Делфи (а их же тьма-тьмущая: assembly, return, type, method, param...) в справке не сказано ни слова.
Теперь про RTTI. Здесь у меня нет ни единой претензии. Подобной универсальной системы ждали все, и ждали довольного долго, и теперь работа с RTTI в Делфи ничем не уступает дотнетовскому или джавовскому отражению. Просто скопирую сюда код из статьи, совмещающий демонстрацию использования RTTI и атрибутов:
var
LContext: TRttiContext;
LType: TRttiType;
LAttr: TCustomAttribute;
begin
{ Create a new Rtti context }
LContext := TRttiContext.Create
{ Extract type information for TSomeType type }
LType := LContext.GetType(TypeInfo(TSomeType));
{ Search for the custom attribute and do some custom processing }
for LAttr in LType.GetAttributes() do
if LAttr is TSpecialAttribute then
WriteLn(TSpecialAttribute(LAttr).FValue);
{ Destroy the context }
LContext.Free;
end;
LContext: TRttiContext;
LType: TRttiType;
LAttr: TCustomAttribute;
begin
{ Create a new Rtti context }
LContext := TRttiContext.Create
{ Extract type information for TSomeType type }
LType := LContext.GetType(TypeInfo(TSomeType));
{ Search for the custom attribute and do some custom processing }
for LAttr in LType.GetAttributes() do
if LAttr is TSpecialAttribute then
WriteLn(TSpecialAttribute(LAttr).FValue);
{ Destroy the context }
LContext.Free;
end;
Вот модулем Rtti я теперь с удовольствием буду пользоваться на каждом шагу. И всем рекомендую.
Чтобы кастомизировать процесс создания метаинформации для RTTI, можно использовать новые директивы {$RTTI} и {$WEAKLINKRTTI}. Они дают всю необходимую гибкость.
Дальше идёт директива delayed. Степень полезности — средняя, но применение найти можно. Короче говоря, это отложенный вызов функции из библиотеки. Если вы собираетесь экспортировать функцию из дллки, в которой по какой-то причине этой функции может и не быть (проблемы версий), пишете delayed, а в рантайме уже проверяете, какую реализацию использовать: библиотечную, точно зная, что при данных условиях вызов функции не навернется, или собственную. Таким образом был реализован механизм естественного ввода (жестов и тачей) в VCL Weaver`а: на Windows 7 используем системные функции, а на предыдущих ОС — собственный движок. Исходник из delphifeeds:
function CloseDesktop; external user32 name 'CloseDesktop';
function CloseTouchInputHandle; external user32 name 'CloseTouchInputHandle' delayed;
function CloseWindow; external user32 name 'CloseWindow';
...
if OSVersion = WINDOWS_7 then
CloseTouchInputHandle
else
MyInternalSimplerClose;
function CloseTouchInputHandle; external user32 name 'CloseTouchInputHandle' delayed;
function CloseWindow; external user32 name 'CloseWindow';
...
if OSVersion = WINDOWS_7 then
CloseTouchInputHandle
else
MyInternalSimplerClose;
Главная польза, наверное — отсутствие пяти строк дополнительного кода везде, где раньше с этой целью использовали динамическую загрузку DLL.
Последняя фича действительно очень и очень востребована — это кастинг интерфейсов обратно в объект, на который он ссылается. Если вы создали экземпляр некоторого объекта, реализующего некоторый интерфейс, а потом присвоили ссылку на этот объект переменной интерфейсного типа, вы можете воспользоваться старыми добрыми операторами as и is, чтобы привести эту переменную обратно к объектному типу. Да что там, даже старый паскалевский небезопасный кастинг (с использованием имени типа) здесь сработает. Все правила остаются в силе — если запрошенный класс не реализует данный интерфейс, as выбросит исключение, is вернёт false, а небезопасный кастинг просто присвоит итоговой переменной nil. Всё просто.
Работает такой кастинг только для дельфийских объектов. COM`у — нет =) Почему — читайте здесь
August 26 2009, 18:09:36 UTC 2 years ago
согласен по поводу различий работ MS и Embarcadero, эт и правд печально...
Видимо я сильно привык к VS, что интерфейс RAD Studio мне дико неудобен...
Anonymous
August 27 2009, 09:53:46 UTC 2 years ago
Куча ляпов, непродуманностей, просто сырых и незаконченных задумок.
August 27 2009, 13:05:24 UTC 2 years ago
August 27 2009, 20:30:04 UTC 2 years ago
August 27 2009, 20:57:05 UTC 2 years ago
Но тем не менее мне нравится, удобно (sic!) работать и там, и там, и уж тем более я ни в коем случае не назвал бы интерфейс "сделанным через *опу", непродуманным и незаконченным. Потому и требую фактов.
Anonymous
August 30 2009, 20:08:52 UTC 2 years ago
Anonymous
August 31 2009, 21:19:28 UTC 2 years ago
Дизайнер форм.
При первом запуске свежепроинсталлированного Delphi 2007 увидел знакомую оболочку Visual Studio. Вообще-то я любил Delphi и за его оригинальный интерфейс в том числе. Лично мне крайне неудобно разрабатывать большие формы, насыщенные контролами, в режиме Embedded designer. Ладно, выключил режим Embedded designer. Получил дизайнер в отдельном окне, но вместе с этим получил:
1. При нажатии F12 можно переключиться из исходного кода в окно дизайнера, но наоборот уже не получится – окно кода активируется, но окно дизайнера остаётся сверху. Оно что, со свойством StayOnTop?! Чтобы попасть в окно кода нужно ЗАКРЫВАТЬ окно дизайнера.
2. То же самое происходит если в Object Inspector кликнуть на событии. Да, в окне кода формируется заготовка под метод обработки события, но это всё остаётся ПОД окном дизайнера, приходится дополнительно его закрывать.
Убейте меня, я не понимаю, что двигало людьми, заложившими такое поведение IDE.
Ладно, в конце-концов мне подсказали выбрать layout “Classic undocked”, потерял некоторые вкусности в интерфейсе, но зато вернул обычное поведение Delphi.
Anonymous
August 31 2009, 21:20:40 UTC 2 years ago
1. Под-дерево классов в окне Structure по умолчанию показывается РАЗВЁРНУТЫМ. То есть фактически виден список, в котором вперемешку присутствуют названия классов и их методы. Найти взглядом в этом всём название класса весьма затруднительно. Разработчики из Embarcadero любят скроллить большие списки?
2. Когда из окна исходного кода кликаем мышкой в окно Structure, то активным становится НЕ ТОТ КЛАСС, на котором кликнули, а тот, который был выделен в окне, когда оно в последний раз было активным. Этим болеют все IDE Delphi уже изрядное количество лет, но можно наконец пофиксить?
Anonymous
August 31 2009, 21:22:25 UTC 2 years ago
1. Панель компонентов испокон веков была сверху. Почему её снесло на бок и никак не удаётся вернуть наверх? Ладно, у разработчиков новое видение интерфейса. Но можно было оставить возможность вернуть старое поведение? Или хотя бы встроить возможность сортировать вкладки по алфавиту?
2. Когда открыт дизайнер форм, то бывает, что в панели компонентов показываются не собственно компоненты, а какой-то список, состоящий преимущественно из заголовков “Delphi projects…”. Наверное очень нужный и полезный. Когда нужно поместить в дизайнер именно компонент, то приходится несколько раз пощёлкать мышкой попеременно в панель компонентов и дизайнер, пока не уберётся упомянутый список и покажутся компоненты.
Project Manager.
1. Как сделать так, чтобы Project Manager показывал только список файлов проекта, без папок? Мне не улыбается сворачивать-разворачивать папки, чтобы добраться до исходников. В Delphi 7 путь к исходнику просто отображался рядышком и не напрягал.
2. Если окно Project Manager достаточно узкое, а имена файлов достаточно длинные и не умещаются в окне целиком (особенно это заметно если файлы ещё показаны в составе папок, в которых расположены, см. выше), то при выделении файла происходит скроллинг всего окна так, что имя выделенного файла становится видно полностью, а файлы с более короткими названиями скрываются за левой границей окна. Соответственно, после каждого такого действия приходится скролить окно в исходное положение. Есть контролы-деревья, в которых реализовано это поведение. Разработчики Embarcadero с ними не знакомы? Или у них мониторы размером километр на километр, что проблем с недостатком места нет?
3. Кстати, кто подскажет? У меня в groupproj десяток проектов-bpl и собственно проект-exe. Показывается конечно деревом. Однажды мне это дерево развернуло полностью и с тех пор при открытии этого groupproj дерево показывается развёрнутым. Когда открываю другие свои проекты – дерево свёрнуто. Что я сделал не так? Как заставить дерево проектов не разворачиваться при открытии?
Object Inspector.
Тут на мою личную маленькую радость всё по-старому, но с одним приколом. Бывает, что когда перехожу из окна дизайнера форм в окно Object Inspector, его «клинит» совершенно очаровательным образом. Активируется то свойство, в район которого я ткнул мышкой, но на месте его значения показывается значение _другого_ свойства. Насколько я смог уловить, это значение того свойства, которое было выделено, когда я в последний раз уходил из Object Inspector в окно дизайнера. Пару раз передёрнуть скролл в Object Inspector и всё становится на свои места. Это я не могу передать ни словами, ни смайликом. Как вам увидеть, например, имя компонента в значении свойства Left?
Anonymous
August 31 2009, 21:23:58 UTC 2 years ago
Я уже не буду писать про группировку окон, например Object Inspector и Structure. Embarcadero превратил это в увлекательный тест на смекалку, который я, каюсь, прошёл не с первого раза :)
Также почти ничего не напишу про несчастье, которое происходит с Help либо после очередного апдейта, либо после установки одного из набора компонент, которые я использую. Несчастье выглядит так: нажимаю F1, получаю диалог «Namespace not defined» и подробнейший стек вызовов, даже с номерами строк каких-то исходников… Вообще-то я хотел почитать Help…
И совсем не стоит наверное упоминать про проблемы с Environment Variables. Не получается заставить IDE узнавать пременную в переменной. Если объявить Var1 = X:\Dir1, а потом попробовать объявить Var2 = $(Var1)\subdir1, то IDE не понимает, что значение $(Var2) должно быть X:\Dir1\ subdir1.
Однажды мне очень понравилось вдруг обнаружить в Options своего проекта в свойстве Packages АБСОЛЮТНО ВСЕ установленные пакеты. Это по крайней мере странно, учитывая что я изначально прописал туда только необходимые. К счастью это больше не повторялось, поэтому после чего это получается, сказать не могу.
Это почти всё. Менее редкое и раздражающее оставил без внимания.
Предвосхищая некоторые вопросы.
1. Апдейты стоят все.
2. Компоненты использую соответствующих версий.
3. На совет «Не используй левые компоненты и эксперты» отвечу «В Delphi 7 использовал ещё более левые компоненты и эксперты и к подобным плачевным последствиям это не приводило».
4. «Пойди на форум и реши все свои проблемы». Хм. Во-первых. Я понимаю, когда на форуме пытаются выяснить как реализовать то-то и то-то. Но выяснять на форуме как заставить IDE не глючить… Это выше моего понимания. С Delphi 7 мне и в голову не приходило что с IDE могут быть какие-то проблемы. Во-вторых. Я купил Delphi 2007 чтобы разрабатывать ПО и решать проблемы своих клиентов. Но никак не проблемы Embarcadero с разработкой и тестированием.
Вот такие факты. Выводы?
Большинство выводов я лучше оставлю при себе, чтобы не разжигать старые добрые “holy wars” :)
Отмечу одно. По моему мнению положение с проектированием, разработкой и тестированием в Embarcadero – _у_д_р_у_ч_а_ю_щ_е_е_. Поэтому мне и пришлось произнести ту фразу «на французском».
August 31 2009, 21:29:38 UTC 2 years ago
Я отвечу вам на каждый из этих пунктов завтра днём развёрнуто, точно так же последовательно. Даю слово.
Сразу скажу, часть претензий я уже сейчас знаю, как решить, часть — по крайней мере на данную минуту — нет. Но последних вроде бы на глазок меньше.
September 1 2009, 18:07:47 UTC 2 years ago
Ну а группировка — вопрос уже чисто субъективный, да :) Решается один раз с применением меню View и сохранением файла собственного Layout'a.
И опять ничего я не смогу вам ответить про восстановление IDE из панели задач. В самом деле, ответ "У меня всё работает" выглядит по меньшей мере глупо, а гугл не дал никаких описаний, хоть как-то похожих на описанную вами проблему. Увы.
Завершая весь этот диалог =)
Я уже писал в блоге про одно исторически сложившееся положение. VS — это вещь в себе, как и любые творения Майкрософта. Она идеально заточена под использование с предусмотренными МС языками, в её же ОС, с её же технологиями и принципами. Да, есть возможность расширения и дополнения любой разработки МС, однако ими пользуются редко, и в итоге выглядит это дело как-то... неорганично. В отличие от самодостаточной стандартной комплектации.
Borland, а вслед за ней и CodeGear, и Embarcadero идут по совершенному иному пути. Даются базовые возможности, даются средства для расширения — и работайте на собственное же благо. Вам даётся полная свобода в использовании средств, удобных и заточенных именно для вас. Это касается чего угодно: языка, библиотек, компонентов, экспертов IDE. Потому-то Интернет так и богат сейчас компонентами, библиотеками, модулями, пакетами для Delphi от третьих лиц. Я не знаю другой технологии или языка, у которых было бы настолько масштабное производство популярного кода и средств не от автора.
Собственно, так и с IDE. Парочка визардов и расширений, немного прямых рук и подкручивания настроек — и она становится конфеткой. В моем случае это CnWizards и DDevExtensions, у кого-то Castalia, GExperts... да мало ли их? Главное — найти свою удобную конфигурацию.
September 1 2009, 17:50:54 UTC 2 years ago
1. Два варианта:
а) Опять DDevExtensions. С первых же версий 2005 в них появилась возможность старой Tool Palette.
б) RAD Studio 2010, в которой возможность отображать панель в старом виде встроена изначально. Причём можно использовать две панели параллельно. Welcome.
2. Это список доступных типов проектов и файлов, он же File -> New -> Other.
Вообще обычно он там отображается именно, когда работа не идёт в окне дизайнера, то есть при неоткрытом проекте, при активном окне кода и т.д. Отчего но в вашем случае появляется вдруг ни с того ни с сего рядом с дизайнером, ума не приложу =)
Project Manager:
1.
2. Аналогично, ориентируясь на установленную у меня D2010 с DDevExtensions (не могу гарантировать, кто именно из них ответственнен за исправление) — прокрутка вправо при выделении файла с длинным именем попросту отсутствует. Лист дерева выделяется, скролл остаётся в том же положении, часть имени скрывается за правой границей.
3. Пасую =( Обращаюсь за помощью к более осведомленным экспертам, увы.
Object Inspector
Честно скажу — бывало. Поймать удаётся крайне редко, в D2007 у меня 100% встречались подобные ситуации. Насчет D2009 четко не скажу, но вроде бы тоже за год 1-2 раза столкнулся с багом. С D2010 я слишком мало работал еще, чтобы что-то комментировать, но пока что все действия с окном происходят абсолютно ожидаемо.
Воркэраунд, к сожалению, отсутствует.
September 1 2009, 17:20:15 UTC 2 years ago
а) Использовать Delphi Class Explorer, он удобнее и функциональнее для поиска свойств и методов классов.
б) Включить в настройках сортировку по алфавиту, а не по упоминанию в исходнике.
в) Установить DDevExtensions. Его последняя бета добавляет в окно Structure строку поиска.
2. Возможно, я что-то делаю не так, или произошёл багфикс в процессе эволюции 2007-2009-2010.
Но процесс "клик по классу в Structure -> клик по окну кода -> клик по другому классу в Structure" привёл меня именно к выделенному классу №2. Занятно.
September 1 2009, 17:12:26 UTC 2 years ago
1. Здесь проблема не в StayOnTop, а в MainFormOnTaskbar. Главной формой приложения Delphi является в случае отключенного Embedded designer именно окно кода со всем прилегающим. Чтобы работала совместимость с Vista+, включено свойство MainFormOnTaskbar, которое делает главным окном приложения не некое скрытое окно, как испокон веков было в Delphi, а непосредственно его главную форму. Но это автоматически влияет и на его Z-позицию, что и наблюдается воочию.
Вам не обязательно закрывать дизайнер. Его достаточно просто свернуть.
Кстати, никаких вкусностей Classic undocked от вас не скрывает. Просто внешний вид становится более похожим на D7.
А насчет удобства разработки в принципе... Первое, что я делаю, устанавливая новую версию RAD Studio — переношу туда файл собственноручно настроенной раскладки расположения окон. Я его назвал Compact layout, он изумительно помогает как в дизайнере, так и при наборе кода и является миксом из удачных решений D7, RAD Studio и VS. Внешний вид:
September 2 2009, 10:40:52 UTC 2 years ago
September 2 2009, 11:50:12 UTC 2 years ago
Всю свою сознательную жизнь на разных языках работаю с коллекциями и контейнерами. До 2009 года упорно не понимал, почему давно есть vector<int> и List<int>, но до сих пор не найти TList<Integer>.
Про всякие там умные указатели, алгоритмы и метапрограммирование я даже не говорю.
А про избыточность возможностей расскажите шарперам, у которых на атрибутах построена половина работы с БД, ORM, сериализация и АОП ;)
September 2 2009, 11:55:30 UTC 2 years ago
Может быть потому, что слишком долго общался с ассемблером.
September 2 2009, 12:12:54 UTC 2 years ago
Холивар "old-school" против концепций высокого уровня вечен и никогда не найдет верного ответа, потому что его, собственно, не существует.
Скажу только, что корпоративный сайт или простейшую учетную базу покупателей вы вряд ли будете писать на asm/C. Нет, я не спорю, что возможно, я утверждаю, что не пожелаете.