Модераторы: volvo877, Snowy, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi - 8. Первые впечатления. Шаг вперёд - 2 шага назад 
:(
    Опции темы
Vit
Дата 13.1.2004, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Сегодня имел возможность ознакомиться с Delphi 8. Впечатления двойственные.

Ну вначале то чего больше нет: а нет всеми любимых WinAPI... Судя по всему теоретически нет так
как сделан новый Дельфи под .net платформу, а посему о Windows имеет только те сведения которые
ему даёт ента самая .net. Может и не всё так страшно и со временем многое прояснится, но пока я
не нашёл возможности вызвать ни одной функции WinAPI.

Дизайн: Борланд ушёл от своего дизайна в сторону MS Visual Studio, а точнее в сторону VB. В
общем большинство кнопок на месте, горячие клавиши вроде тоже, но дизайн изменился. Лучше или
хуже? Не знаю, но для меня пока не привычно. Палитра инструментов переместилась в правый
край (интересно зачем?), форма в дизайне стала очень напоминать форму в VB, инспектор объектов
стал чем-то похожим на соотвесттвующее детище MS. Зачем это сделано - не знаю, ИМХО, к
переходу на .net платформу это всё не имеет никакого отношения, может таким образом
Борланд пытается перетянуть программистов с продуктов MS, облегчив им переход?

Вот как выглядит D8 при загрузке в первый раз без проекта.

user posted image

Добавлено в Добавлено @ 02:31:
А вот какие проекты мы имеем в наличии:

user posted image

Давайте выберем проект и набросаем на форму компонентов, выглядеть это будет так:

user posted image

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


user posted image

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

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

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

- быстродействие - хоть под дебуггером, хоть под средой, хоть в готовом виде скорость
отработки поцедуры практически одинакова (разница порядка 2-3%) и ровно в 2 раза ниже чем
тот же код откомпиллированный в Дельфи 5.

Кстати на Web страничку, открываемую Дельфой по умолчанию мой Norton Antivirus
отреагировал однозначно - особозлобный вирь! Похоже фирма Symantec решила, что пора начинать
борьбу с Борландом, по-видимому они решили реинкарнировать свой C++ под .net платформу
(чем чёрт не шутит?).

Выводы!

Итак на первый взгляд (прошу быть снисходительными - к моменту написания этих строк я видел
эту версию всего пару часов!)

1. Дизайн. Изменился в сторону продуктов MS и сейчас является гибридом дизайна Дельфи и
дизайна VB.

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

3. Редактор кода. Изменился в лучшую сторону, добавились очень удобные фишки.

4. Компоненты. Боюсь оказаться неправым, но набор компонентов определяется не столько самим
Дельфи, сколько .net framework, и набор этот бледный, т.е. его можно кое-как сравнить с
набором компонентов для Дельфи 1, но по сравнению с Дельфи 5/6/7 выглядит очень тускло,
представлены самые основные, базовые компоненты.

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

6. Скорость работы сгенерированных исполняемых файлов - в аккурат в 2 раза меньше тех что
основанны на классических WinAPI.



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 13.1.2004, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Ага, исследуем дальше. Оказывается всё не так плохо. Удалось найти как применять WinAPI -
оказывается есть модули, отличия небольшие - теперь нет указателей, т.е. вместо PChar
используются строки и т.д. Вот так примерно выглядит использованием ShellExecute:

Код
uses ... Borland.Vcl.ShellAPI;

procedure TForm2.Button1Click(Sender: TObject);
begin
 ShellExecute(handle, 'Open', 'TOTALCMD.EXE', nil, 'C:\totalcmd\', sw_restore);
end;



А вот так даётся определение самой функции ShellExecute в модуле у Борланда:

Код
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
 Directory: string; ShowCmd: Integer): HINST; external;
[DllImport(shell32, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'ShellExecute')]


Забавно, не правда ли?


Ещё есть директива компилляции {$Unsafecode On}, которая по логике вещей должна позволять
работать с указателями и прочими радостями классического программирования. На деле её
применение наталкивается на труднопонимаемые ошибки компилляции, резко усугублённые плохой
документацией.

Так скажу сразу - нормального help нет! Т.е. взят некий Html который несомненно содержит
некоторые сведения о C#, немного сдобрен статьями по паскалю и это всё! Ни нормальных
перекрёсных ссылок, ни привычного и очень любимого "See also", и это даже можно было бы
вытерпеть, если бы не страница с мрачным содержимым "No further information is available for this ..."
выскакивающая часто и густо на что бы ты не кликнул F1...


Вот как выглядит это подобие на help при вызове справки по идентификатору "function":

user posted image


Можете сами судить - это справка по Дельфи или по С#? Как по мне, то я хоть и привык к примерам
везде написанным то на С, то на VB, но хоть родной Дельфи Help радовал тем, что справка всё-таки
была по Дельфи, без включения "чужеродных" языков там где в этом не было необходимости.



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 13.1.2004, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



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

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

user posted image

Одно непонятно, в результате получился exe файл размером 9 килобайт. Так,
где-то дурят нашего брата! Опять какие-то библиотеки и пакеты надо поставлять с исполнительным
файлом и похоже в большом количестве. Я понимаю что всякие формы и кнопки зашиты в большом
количестве в самом .net framework и их вызов это считанные байты, но DBNavigator, до боли знакомый
грид, несмотря уже на сам компонент TTable никакого отношения к MS не имеют и никогда не имели.
Чудес не бывает, MS наверняка ничего такого в свой framework не включала, а посему пойду изучать
всяки там опции компилляции и бродить по многочисленным настройкам.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
foRaver
Дата 13.1.2004, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



Да, особо не радует это IDE и чуть-ли не прямая связь с М$...
Я где-то слышал (не подумайте ничего плохого wink.gif ), что М$ прикупили Borland,
может именно поэтому теперь внешне похоже на VS. ?!?

Возможность дальше использовать WinAPI конечно радует, но я если даже и буду использовать Delphi 8, то только
с рядом установленной 7й версией. Внешнй вид на первый взгляд извращённо поганый, но т.к. сам пока не
пробовал, строго судить немогу.

Извини может даже за глупый вопрос, но где можно скачять 8ю версию? На сайте Borland'а пока ничего ненашел.... confused.gif
PM MAIL WWW ICQ YIM   Вверх
Vit
Дата 13.1.2004, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Не знаю


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Kesh
Дата 13.1.2004, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: нет
Всего: 54



А что, мне понравилась фишка, что при работе с .NET кто-то будет еще использовать палитру Win 3.1


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
foRaver
  Дата 13.1.2004, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



Всётаики то, что мне сказали, оказалось правдой. Судите сами.... Перевода на Русский пока ненашелconfused.gif

The acquisition spotlight fell on Microsoft Corp yesterday, as speculation swept Wall St that the company was moving against Borland Software Corp as well as Rational Software Corp to revive its application design and modeling offerings, writes Gavin Clarke.

Redmond, Washington-based Microsoft was reported to be preparing the acquisition of its number-one competitor in the Windows developer space, Borland. Boland itself recently bought design and modeling specialist TogetherSoft SA.

Such a deal would provide Microsoft access to TogetherSoft's resources, after IBM announced its proposed $2.1bn acquisition of independent application design and modeling specialist Lexington, Massachusets-based Rational Software earlier this month.

Microsoft, on Wednesday night, was also rumored to be preparing a counter-bid to IBM's multi-billion offer for Rational.

One ISV source, who wished to remain anonymous, said: "Don't discount the rumor [Microsoft] are mounting a competing bid. It will be an expensive counter bid."

A Microsoft source insisted the company was "in no way, shape or form" going to outbid IBM for Rational. Microsoft, meanwhile, refused to comment on a possible Borland acquisition.

Microsoft has insisted that it would not suffer from the loss of Rational to IBM, as the company has other partners in this area. Rational has been a partner of Microsoft on .NET, integrating tools such as Rose and XDE with Visual Studio.NET.

However, Borland chief executive Dale Fuller summed up the loss to the industry of Rational's independence. Borland was a Rational partner.

"As a customer, it's taken away my ability to use the industry standard development platform [Rational's Rose product]. We will continue to support [Rose] but the tight integration we could have had, we are not going to get," Fuller told a financial analysts' conference.

Microsoft's own application design and modeling portfolio is believed to have been weakened by IBM's acquisition, as this will reduce opportunities for tigher integration between Rational's and Microsoft's products.

Of equal importance to Microsoft is the loss of Rational's services arm. This $90m business was capable of advising organizations over how to design and implement scalable, enterprise-class .NET systems. Those consultants, while serving .NET inside IBM, will now be constrained when selling against Java by IBM's adherence to Java through WebSphere.

The rumors of a strike by Microsoft against Borland and Rational ignited as it emerged Microsoft may have missed out - either by design or by mistake - on the opportunity to buy Rational as recently as August.

In a Securities and Exchange Commission (SEC) filing, published yesterday, Rational said that during the midst of its discussions with IBM, company founder and chief executive Michael Devlin was contacted by telephone by representatives of a company interested in renewing earlier discussions with Rational over a possible "business combination transaction."

Rational did not name that company, referring to it simply as "Company A" but circumstantially that puts Microsoft solidly in the frame. Microsoft has told ComputerWire its executives discussed a possible acquisition of Rational to fill-out its own offerings.

The SEC filing said: "During the period thereafter and leading up to the December 6, 2002 announcement of the proposed merger with IBM, numerous conversations occurred between representatives of Company A and us or representatives of our financial advisor, Goldman Sachs. However, these conversations never resulted in a detailed discussion of proposed terms or Company A submitting a specific indication of interest.

A Microsoft spokesperson said he could not comment on the details of the SEC filing and Rational would not comment on either the filing or a possible Microsoft bid.

PM MAIL WWW ICQ YIM   Вверх
Cashey
Дата 13.1.2004, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата
Так скажу сразу - нормального help нет
Надеюсь в финал релизе этот недостаток исправят. И еще не радует снижение производительности. А по поводу подключения библиотек, не верю я, что Борланд перешел на реалтайм библиотеки поддержки, наверняка есть какая-то опция. В конце-то концов Дельфи это не Фокс Про


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
stab
Дата 13.1.2004, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата
А по поводу подключения библиотек, не верю я, что Борланд перешел на реалтайм библиотеки поддержки, наверняка есть какая-то опция.


А у меня как раз такие подозрения есть sad.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Vit
Дата 13.1.2004, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Снижение производительности - вещь совершенно неизбежная пре переходе на .net платформу и
обусловленно наличием дрополнительного "слоя" между кодом и железом. Кстати производительность
уменьшилась и не так чтоб сильно. Та же Java даёт гораздо большее снижение производительности.

По поводу пакетов и хэлпа - поживём, увидим...



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
stab
Дата 14.1.2004, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



может не все заметели, что оболочка хелпа это ни что иное, как оффлайн просмоторщик MSDN, который идет вместе с MS Visual Studio, ... хм, без комментариев.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
dr.ZmeY
Дата 14.1.2004, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Единственное, что мне нравится, это окно кода... ну поживём увидим, а пока у меня 7-я лицензионная стоит с кучей компонентов...


--------------------
PM MAIL WWW ICQ Skype   Вверх
stab
Дата 14.1.2004, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Vit, скажи чем отличаются VCL Forms Application и Windows Forms Application. Windows Forms -- это родная технология .net, а вот что такое VCL Forms в Delphi 8?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
dr.ZmeY
Дата 14.1.2004, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Допустим, при установке делфи вносит в NET свои компоненты, и это причина малого экзэшника, но тогда как на счёт переносимости программ, и будут ли они, даже со стандартными "кнопками" работать на системах без NET?


--------------------
PM MAIL WWW ICQ Skype   Вверх
Vit
Дата 14.1.2004, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата(cully @ 13.1.2004, 15:40)
Vit, скажи чем отличаются VCL Forms Application и Windows Forms Application. Windows Forms -- это родная технология .net, а вот что такое VCL Forms в Delphi 8?

Пока не понял. VCL жива и живее всех живых, так что с этой стороны всё Ok! Другое дело что в конечном счёте VCL базируется не на WinAPI, а на .net




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 14.1.2004, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: нет
Всего: 232



Цитата
Допустим, при установке делфи вносит в NET свои компоненты

Возможно ли такое ? Имхо, нет - нигде не написано, что стандартные либы .NET расширяемы.

Вообще, .NET "славится" тем, что вместе с Framework идет сотня стандартных библиотек, в которых "есть всё", поэтому для переноса кода с одной платформы на другую достаточно не выходить за рамки стандартных либ.

Это сообщение отредактировал(а) mr.DUDA - 14.1.2004, 00:50


--------------------
user posted image
PM MAIL WWW   Вверх
Sardar
Дата 14.1.2004, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



2foRaver, посмотрел в eMule уже у кучи народа есть, скачается быстро.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Vit
Дата 14.1.2004, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



2 dr.ZmeY - разобрался, там run-time библиотек до хрени, всего целиком метров до 20
потянут. Без них, понятное дело, ничего работать не будет, даже с одними кнопками.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
stab
Дата 14.1.2004, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Еще вопросы. От какого класса наследуются события? Есть ли понятие делегата? Есть ли исходники борландовских модулей (System, SysUtils, Forms, ... сейчас, конечно, это все несколько по другому называется)? Если есть выложи, пожалуйста, на всеобщее обозрение, хоть посмотрим как это выглядит.

з.ы. Простите за огромное кол-во вопросов, но уж очень интересно smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Vit
Дата 14.1.2004, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата
Возможно ли такое ? Имхо, нет - нигде не написано, что стандартные либы .NET расширяемы.



Конечно возможно, а как же иначе?

Цитата
Вообще, .NET "славится" тем, что вместе с Framework идет сотня стандартных библиотек, в которых "есть всё"


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

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





--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
stab
Дата 14.1.2004, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата
... и будут ли они, даже со стандартными "кнопками" работать на системах без NET?

Конечно, нет.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Vit
Дата 14.1.2004, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



2 cully - часа через 2 прийду домой, посмотрю внимательнее, попробую ответить на все вопросы,
пока пожалуйста сформулируйте конкретно, что хотите узнать...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 14.1.2004, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Код
и будут ли они, даже со стандартными "кнопками" работать на системах без NET?


Нет, даже если там кроме begin..end ничего нет .net framework абсолютно необходим для
запуска.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
foRaver
Дата 14.1.2004, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



Sardar, чем же так качать, чтобы быстро через eMule получилосb???
Ладно, подожду пока на сайте Борланда появится... с FTP быстрее качает smile.gif
PM MAIL WWW ICQ YIM   Вверх
Vit
Дата 14.1.2004, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Отвечаю на вопросы по очереди:

Цитата
Vit, скажи чем отличаются VCL Forms Application и Windows Forms Application.



Windows Forms Application - типичный .net, компоненты есть только те что есть в классическом .net.

Вот как выглядит автосгенерированный модуль формы с одной кнопкой:

Код
unit WinForm1;

interface

uses
 System.Drawing, System.Collections, System.ComponentModel,
 System.Windows.Forms, System.Data;

type
 TWinForm1 = class(System.Windows.Forms.Form)
 {$REGION 'Designer Managed Code'}
 strict private
   /// <summary>
   /// Required designer variable.
   /// </summary>
   Components: System.ComponentModel.Container;
   Button1: System.Windows.Forms.Button;
   /// <summary>
   /// Required method for Designer support - do not modify
   /// the contents of this method with the code editor.
   /// </summary>
   procedure InitializeComponent;
   procedure Button1_Click(sender: System.Object; e: System.EventArgs);
 {$ENDREGION}
 strict protected
   /// <summary>
   /// Clean up any resources being used.
   /// </summary>
   procedure Dispose(Disposing: Boolean); override;
 private
   { Private Declarations }
 public
   constructor Create;
 end;

 [assembly: RuntimeRequiredAttribute(TypeOf(TWinForm1))]

implementation

{$REGION 'Windows Form Designer generated code'}
/// <summary>
/// Required method for Designer support -- do not modify
/// the contents of this method with the code editor.
/// </summary>
procedure TWinForm1.InitializeComponent;
begin
 Self.Button1 := System.Windows.Forms.Button.Create;
 Self.SuspendLayout;
 //
 // Button1
 //
 Self.Button1.Location := System.Drawing.Point.Create(104, 144);
 Self.Button1.Name := 'Button1';
 Self.Button1.Size := System.Drawing.Size.Create(104, 48);
 Self.Button1.TabIndex := 0;
 Self.Button1.Text := 'Button1';
 Include(Self.Button1.Click, Self.Button1_Click);
 //
 // TWinForm1
 //
 Self.AutoScaleBaseSize := System.Drawing.Size.Create(5, 13);
 Self.ClientSize := System.Drawing.Size.Create(292, 273);
 Self.Controls.Add(Self.Button1);
 Self.Name := 'TWinForm1';
 Self.Text := 'WinForm1';
 Self.ResumeLayout(False);
end;
{$ENDREGION}

procedure TWinForm1.Dispose(Disposing: Boolean);
begin
 if Disposing then
 begin
   if Components <> nil then
     Components.Dispose();
 end;
 inherited Dispose(Disposing);
end;

constructor TWinForm1.Create;
begin
 inherited Create;
 //
 // Required for Windows Form Designer support
 //
 InitializeComponent;
 //
 // TODO: Add any constructor code after InitializeComponent call
 //
end;

procedure TWinForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
 Close;
end;

end.



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 14.1.2004, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



VCL Forms Application - это приложение VCL - набор компонентов для него точно такой же как для Дельфи 7.
Все функции, классы, методы и т.п. от VCL доступны. Единственное различие от Дельфи 7, как я понял,
только в том, что сама VCL базируется не на вызовах WinAPI, а на соответствующих .net классах. Для программиста
переделывание классического дельфовского приложения из Дельфи 7 в Дельфи 8, как я понимаю, затруднений не
составит.

Вот пример аналогичного кода - модуль формы с кнопкой.

Код
unit Unit3;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls;

type
 TForm3 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form3: TForm3;

implementation

{$R *.nfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
 Close;
end;

end.



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 14.1.2004, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата
От какого класса наследуются события?


С разгону и не поймёшь. Как-то сделано не так как было до сих пор.
Вот как выглядит декларация класса (для VCL):

Код
 TCustomForm = class(TScrollingWinControl, IMDIForm)
 private
   FActiveControl: TWinControl;
   FFocusedControl: TWinControl;
   FBorderIcons: TBorderIcons;
   FBorderStyle: TFormBorderStyle;
   FSizeChanging: Boolean;
   FWindowState: TWindowState;
   FShowAction: TShowAction;
   FKeyPreview: Boolean;
   FActive: Boolean;
   FFormStyle: TFormStyle;
   FPosition: TPosition;
   FDefaultMonitor: TDefaultMonitor;
   FTileMode: TTileMode;
   FDropTarget: Boolean;
   FPrintScale: TPrintScale;
   FCanvas: TControlCanvas;
   FHelpFile: string;
   FIcon: TIcon;
   FInCMParentBiDiModeChanged: Boolean;
   FMenu: TMainMenu;
   FModalResult: TModalResult;
   FDesigner: IDesignerHook;
   FClientHandle: THWndWrapper;
   FWindowMenu: TMenuItem;
   FPixelsPerInch: Integer;
   FObjectMenuItem: TMenuItem;
   FOleForm: IOleForm;
   FClientWidth: Integer;
   FClientHeight: Integer;
   FTextHeight: Integer;
   FDefClientProc: IntPtr;
   FActiveOleControl: TWinControl;
   FSavedBorderStyle: TFormBorderStyle;
   FOnActivate: TNotifyEvent;
   FOnClose: TCloseEvent;
   FOnCloseQuery: TCloseQueryEvent;
   FOnDeactivate: TNotifyEvent;
   FOnHelp: THelpEvent;
   FOnHide: TNotifyEvent;
   FOnPaint: TNotifyEvent;
   FOnShortCut: TShortCutEvent;
   FOnShow: TNotifyEvent;
   FOnCreate: TNotifyEvent;
   FOnDestroy: TNotifyEvent;
   FAlphaBlend: Boolean;
   FAlphaBlendValue: Byte;
   FPopupChildren: TList;
   FPopupMode: TPopupMode;
   FPopupParent: TCustomForm;
   FRecreateChildren: TList;
   FPopupWnds: TPopupWndArray;
   FInternalPopupParent: TCustomForm;
   FInternalPopupParentWnd: HWND;
   FScreenSnap: Boolean;
   FSnapBuffer: Integer;
   FTransparentColor: Boolean;
   FTransparentColorValue: TColor;
   procedure RefreshMDIMenu;
   procedure ClientWndProc(var Message: TMessage);
   function GetCanvas: TCanvas;
   function GetClientHandle: HWND;
   function GetFormStyle: TFormStyle;
   function GetIconHandle: HICON;
   function GetMonitor: TMonitor;
   function GetPixelsPerInch: Integer;
   function GetPopupChildren: TList;
   function GetRecreateChildren: TList;
   function GetScaled: Boolean;
   function GetTextHeight: Integer;
   procedure IconChanged(Sender: TObject);
   function IsAutoScrollStored: Boolean;
   function IsClientSizeStored: Boolean;
   function IsForm: Boolean;
   function IsFormSizeStored: Boolean;
   function IsIconStored: Boolean;
   procedure MergeMenu(MergeState: Boolean);
   procedure ReadIgnoreFontProperty(Reader: TReader);
   procedure IgnoreIdent(Reader: TReader);
   procedure ReadTextHeight(Reader: TReader);
   procedure SetActive(Value: Boolean);
   procedure SetActiveControl(Control: TWinControl);
   procedure SetBorderIcons(Value: TBorderIcons);
   procedure SetBorderStyle(Value: TFormBorderStyle);
   procedure SetClientHeight(Value: Integer);
   procedure SetClientWidth(Value: Integer);
   procedure SetDesigner(ADesigner: IDesignerHook);
   procedure SetFormStyle(Value: TFormStyle);
   procedure SetIcon(Value: TIcon);
   procedure SetMenu(Value: TMainMenu);
   procedure SetPixelsPerInch(Value: Integer);
   procedure SetPosition(Value: TPosition);
   procedure SetPopupMode(Value: TPopupMode);
   procedure SetPopupParent(Value: TCustomForm);
   procedure SetScaled(Value: Boolean);
   procedure SetVisible(Value: Boolean);
   procedure SetWindowFocus;
   procedure SetWindowMenu(Value: TMenuItem);
   procedure SetObjectMenuItem(Value: TMenuItem);
   procedure SetWindowState(Value: TWindowState);
   procedure SetWindowToMonitor;
   procedure WritePixelsPerInch(Writer: TWriter);
   procedure WriteTextHeight(Writer: TWriter);
   function NormalColor: TColor;
 public
   procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
   procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
   procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
   procedure WMIconEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ICONERASEBKGND;
   procedure WMQueryDragIcon(var Message: TWMQueryDragIcon); message WM_QUERYDRAGICON;
   procedure WMNCCreate(var Message: TWMNCCreate); message WM_NCCREATE;
   procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
   procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
   procedure WMDestroy(var Message: TWMDestroy); message WM_DESTROY;
   procedure WMCommand(var Message: TWMCommand); message WM_COMMAND;
   procedure WMInitMenuPopup(var Message: TWMInitMenuPopup); message WM_INITMENUPOPUP;
   procedure WMMenuChar(var Message: TWMMenuChar); message WM_MENUCHAR;
   procedure WMMenuSelect(var Message: TWMMenuSelect); message WM_MENUSELECT;
   procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE;
   procedure WMClose(var Message: TWMClose); message WM_CLOSE;
   procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
   procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
   procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
   procedure WMMDIActivate(var Message: TWMMDIActivate); message WM_MDIACTIVATE;
   procedure WMNextDlgCtl(var Message: TWMNextDlgCtl); message WM_NEXTDLGCTL;
   procedure WMEnterMenuLoop(var Message: TMessage); message WM_ENTERMENULOOP;
   procedure WMHelp(var Message: TWMHelp); message WM_HELP;
   procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
   procedure WMSettingChange(var Message: TMessage); message WM_SETTINGCHANGE;
   procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
   procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
   procedure CMActivate(var Message: TCMActivate); message CM_ACTIVATE;
   procedure CMAppSysCommand(var Message: TMessage); message CM_APPSYSCOMMAND;
   procedure CMBiDiModeChanged(var Message: TMessage); message CM_BIDIMODECHANGED;
   procedure CMDeactivate(var Message: TCMDeactivate); message CM_DEACTIVATE;
   procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
   procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
   procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED;
   procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
   procedure CMMenuChanged(var Message: TMessage); message CM_MENUCHANGED;
   procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED;
   procedure CMIconChanged(var Message: TMessage); message CM_ICONCHANGED;
   procedure CMRelease(var Message: TMessage); message CM_RELEASE;
   procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
   procedure CMUIActivate(var Message); message CM_UIACTIVATE;
   procedure CMParentBiDiModeChanged(var Message: TMessage); message CM_PARENTBIDIMODECHANGED;
   procedure CMParentFontChanged(var Message: TCMParentFontChanged); message CM_PARENTFONTCHANGED;
   procedure CMPopupHwndDestroy(var Message: TCMPopupHWndDestroy); message CM_POPUPHWNDDESTROY;
   procedure CMIsShortCut(var Message: TWMKey); message CM_ISSHORTCUT;
   procedure CMUpdateActions(var Message: TMessage); message CM_UPDATEACTIONS;
 private
   function ActionExecute(Action: TBasicAction): Boolean;
   function ActionUpdate(Action: TBasicAction): Boolean;
   procedure SetLayeredAttribs;
   procedure SetAlphaBlend(const Value: Boolean);
   procedure SetAlphaBlendValue(const Value: Byte);
   procedure SetTransparentColor(const Value: Boolean);
   procedure SetTransparentColorValue(const Value: TColor);
   procedure InitAlphaBlending(var Params: TCreateParams);
 protected
   FFormState: TFormState;
   procedure Activate; virtual;
   procedure ActiveChanged; virtual;
   procedure AlignControls(AControl: TControl; var Rect: TRect); override;
   procedure BeginAutoDrag; override;
   procedure ChangeScale(M, D: Integer); override;
   procedure CloseModal;
   procedure CreateParams(var Params: TCreateParams); override;
   procedure CreateWindowHandle(const Params: TCreateParams); override;
   procedure CreateWnd; override;
   procedure Deactivate; virtual;
   procedure DefineProperties(Filer: TFiler); override;
   procedure DestroyHandle; override;
   procedure DestroyWindowHandle; override;
   procedure DoClose(var Action: TCloseAction); virtual;
   procedure DoCreate; virtual;
   procedure DoDestroy; virtual;
   procedure DoHide; virtual;
   procedure DoShow; virtual;
   function GetClientRect: TRect; override;
   function GetFloating: Boolean; override;
   function GetOwnerWindow: HWND; virtual;
   function HandleCreateException: Boolean; virtual;
   procedure Loaded; override;
   procedure Notification(AComponent: TComponent;
     Operation: TOperation); override;
   procedure Paint; virtual;
   procedure PaintWindow(DC: HDC); override;
   function PaletteChanged(Foreground: Boolean): Boolean; override;
   procedure ReadState(Reader: TReader); override;
   procedure RequestAlign; override;
   procedure SetChildOrder(Child: TComponent; Order: Integer); override;
   procedure SetParentBiDiMode(Value: Boolean); override;
   procedure DoDock(NewDockSite: TWinControl; var ARect: TRect); override;
   procedure SetParent(AParent: TWinControl); override;
   procedure UpdateActions; virtual;
   procedure UpdateWindowState;
   procedure ValidateRename(AComponent: TComponent;
     const CurName, NewName: string); override;
   procedure VisibleChanging; override;
   procedure WndProc(var Message: TMessage); override;
   procedure Resizing(State: TWindowState); override;
   function get_ActiveMDIChild: TForm;
   function get_MDIChildCount: Integer;
   function get_MDIChildren(I: Integer): TForm;
   property ActiveMDIChild: TForm read get_ActiveMDIChild;
   property AlphaBlend: Boolean read FAlphaBlend write SetAlphaBlend;
   property AlphaBlendValue: Byte read FAlphaBlendValue write SetAlphaBlendValue;
   property BorderIcons: TBorderIcons read FBorderIcons write SetBorderIcons stored IsForm
     default [biSystemMenu, biMinimize, biMaximize];
   property AutoScroll stored IsAutoScrollStored;
   property ClientHandle: HWND read GetClientHandle;
   property ClientHeight write SetClientHeight stored IsClientSizeStored;
   property ClientWidth write SetClientWidth stored IsClientSizeStored;
   property TransparentColor: Boolean read FTransparentColor write SetTransparentColor;
   property TransparentColorValue: TColor read FTransparentColorValue write SetTransparentColorValue;
   property Ctl3D default True;
   property DefaultMonitor: TDefaultMonitor read FDefaultMonitor write FDefaultMonitor
     stored IsForm default dmActiveForm;
   property FormStyle: TFormStyle read GetFormStyle write SetFormStyle
     stored IsForm default fsNormal;
   property Height stored IsFormSizeStored;
   property HorzScrollBar stored IsForm;
   property Icon: TIcon read FIcon write SetIcon stored IsIconStored;
   property MDIChildCount: Integer read get_MDIChildCount;
   property MDIChildren[I: Integer]: TForm read get_MDIChildren;
   property ObjectMenuItem: TMenuItem read FObjectMenuItem write SetObjectMenuItem
     stored IsForm;
   property PixelsPerInch: Integer read GetPixelsPerInch write SetPixelsPerInch
     stored False;
   property ParentFont default False;
   property PopupMenu stored IsForm;
   property PopupChildren: TList read GetPopupChildren;
   property Position: TPosition read FPosition write SetPosition stored IsForm
     default poDefaultPosOnly;
   property PrintScale: TPrintScale read FPrintScale write FPrintScale stored IsForm
     default poProportional;
   property Scaled: Boolean read GetScaled write SetScaled stored IsForm default True;
   property TileMode: TTileMode read FTileMode write FTileMode default tbHorizontal;
   property VertScrollBar stored IsForm;
   property Visible write SetVisible default False;
   property Width stored IsFormSizeStored;
   property WindowMenu: TMenuItem read FWindowMenu write SetWindowMenu stored IsForm;
   property OnActivate: TNotifyEvent read FOnActivate write FOnActivate stored IsForm;
   property OnCanResize stored IsForm;
   property OnClick stored IsForm;
   property OnClose: TCloseEvent read FOnClose write FOnClose stored IsForm;
   property OnCloseQuery: TCloseQueryEvent read FOnCloseQuery write FOnCloseQuery
     stored IsForm;
   property OnCreate: TNotifyEvent read FOnCreate write FOnCreate stored IsForm;
   property OnDblClick stored IsForm;
   property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy stored IsForm;
   property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate stored IsForm;
   property OnDragDrop stored IsForm;
   property OnDragOver stored IsForm;
   property OnHelp: THelpEvent read FOnHelp write FOnHelp;
   property OnHide: TNotifyEvent read FOnHide write FOnHide stored IsForm;
   property OnKeyDown stored IsForm;
   property OnKeyPress stored IsForm;
   property OnKeyUp stored IsForm;
   property OnMouseDown stored IsForm;
   property OnMouseMove stored IsForm;
   property OnMouseUp stored IsForm;
   property OnPaint: TNotifyEvent read FOnPaint write FOnPaint stored IsForm;
   property OnResize stored IsForm;
   property OnShortCut: TShortCutEvent read FOnShortCut write FOnShortCut;
   property OnShow: TNotifyEvent read FOnShow write FOnShow stored IsForm;
 public
   constructor Create(AOwner: TComponent); override;
   constructor CreateNew(AOwner: TComponent; Dummy: Integer  = 0); virtual;
   destructor Destroy; override;
   procedure Close;
   function CloseQuery: Boolean; virtual;
   procedure DefaultHandler(var Message); override;
   procedure DefocusControl(Control: TWinControl; Removing: Boolean);
   procedure Dock(NewDockSite: TWinControl; ARect: TRect); override;
   procedure FocusControl(Control: TWinControl);
   procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
   function GetRootDesigner: IDesignerNotify; override;
   function GetFormImage: TBitmap;
   procedure Hide;
   function IsShortCut(var Message: TWMKey): Boolean; virtual;
   procedure MakeFullyVisible(AMonitor: TMonitor = nil);
   procedure MouseWheelHandler(var Message: TMessage); override;
   procedure Print;
   procedure RecreateAsPopup(AWindowHandle: HWND);
   procedure Release;
   procedure SendCancelMode(Sender: TControl);
   procedure SetFocus; override;
   function SetFocusedControl(Control: TWinControl): Boolean; virtual;
   procedure Show;
   function ShowModal: Integer; virtual;
   function WantChildKey(Child: TControl; var Message: TMessage): Boolean; virtual;
   property Active: Boolean read FActive;
   property ActiveControl: TWinControl read FActiveControl write SetActiveControl
     stored IsForm;
   property Action;
   property ActiveOleControl: TWinControl read FActiveOleControl write FActiveOleControl;
   property BorderStyle: TFormBorderStyle read FBorderStyle write SetBorderStyle
     stored IsForm default bsSizeable;
   property Canvas: TCanvas read GetCanvas;
   property Caption stored IsForm;
   property Color nodefault;
   property Designer: IDesignerHook read FDesigner write SetDesigner;
   property DropTarget: Boolean read FDropTarget write FDropTarget;
   property Font;
   property FormState: TFormState read FFormState;
   property HelpFile: string read FHelpFile write FHelpFile;
   property KeyPreview: Boolean read FKeyPreview write FKeyPreview
     stored IsForm default False;
   property Menu: TMainMenu read FMenu write SetMenu stored IsForm;
   property ModalResult: TModalResult read FModalResult write FModalResult;
   property Monitor: TMonitor read GetMonitor;
   property OleFormObject: IOleForm read FOleForm write FOleForm;
   property PopupMode: TPopupMode read FPopupMode write SetPopupMode default pmNone;
   property PopupParent: TCustomForm read FPopupParent write SetPopupParent;
   property ScreenSnap: Boolean read FScreenSnap write FScreenSnap default False;
   property SnapBuffer: Integer read FSnapBuffer write FSnapBuffer;
   property WindowState: TWindowState read FWindowState write SetWindowState
     stored IsForm default wsNormal;
 end;






--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 14.1.2004, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата
Есть ли понятие делегата?


Если б я ещё знал что это такое...

Цитата
Есть ли исходники борландовских модулей (System, SysUtils, Forms
,


Есть.

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

Вот кусок из SysUtils:


Код
function IsValidIdent(const Ident: string; AllowDots: Boolean): Boolean;
var
 I: Integer;
begin
 Result := False;
 if (Length(Ident) = 0) or not (Ident[1] in Alpha) then Exit;
 if AllowDots then
   for I := 2 to Length(Ident) do
   begin
     if not (Ident[I] in AlphaNumericDot) then Exit
   end
 else
   for I := 2 to Length(Ident) do
     if not (Ident[I] in AlphaNumeric) then Exit;
 Result := True;
end;

function IntToStr(Value: Integer): string;
begin
 Result := System.Convert.ToString(Value);
end;

function IntToStr(Value: Int64): string;
begin
 Result := System.Convert.ToString(Value);
end;

function UIntToStr(Value: LongWord): string;
begin
 Result := System.Convert.ToString(Value);
end;

function UIntToStr(Value: UInt64): string;
begin
 Result := System.Convert.ToString(Value);
end;

function IntToHex(Value: Integer; Digits: Integer): string;
begin
 FmtStr(Result, '%.*x', [Digits, Value]);
end;

function IntToHex(Value: Int64; Digits: Integer): string;
begin
 FmtStr(Result, '%.*x', [Digits, Value]);
end;

function StrToInt(const S: string): Integer;
var
 E: Integer;
begin
 Val(S, Result, E);
 if E <> 0 then ConvertErrorFmt(SInvalidInteger, [S]);
end;

function StrToIntDef(const S: string; Default: Integer): Integer;
begin
 if not TryStrToInt(S, Result) then
   Result := Default;
end;

function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
 E: Integer;
begin
 Val(S, Value, E);
 Result := E = 0;
end;

function StrToLongWord(const S: string): LongWord;
var
 E: Integer;
begin
 Val(S, Result, E);
 if E <> 0 then ConvertErrorFmt(SInvalidInteger, [S]);
end;

function StrToLongWordDef(const S: string; Default: LongWord): LongWord;
begin
 if not TryStrToLongWord(S, Result) then
   Result := Default;
end;

function TryStrToLongWord(const S: string; out Value: LongWord): Boolean;
var
 E: Integer;
begin
 Val(S, Value, E);
 Result := E = 0;
end;

function StrToInt64(const S: string): Int64;
var
 E: Integer;
begin
 Val(S, Result, E);
 if E <> 0 then ConvertErrorFmt(SInvalidInteger, [S]);
end;

function StrToInt64Def(const S: string; const Default: Int64): Int64;
begin
 if not TryStrToInt64(S, Result) then
   Result := Default;
end;

function TryStrToInt64(const S: string; out Value: Int64): Boolean;
var
 E: Integer;
begin
 Val(S, Value, E);
 Result := E = 0;
end;

function StrToUInt64(const S: string): UInt64;
var
 E: Integer;
begin
 Val(S, Result, E);
 if E <> 0 then ConvertErrorFmt(SInvalidInteger, [S]);
end;

function StrToUInt64Def(const S: string; const Default: UInt64): UInt64;
begin
 if not TryStrToUInt64(S, Result) then
   Result := Default;
end;

function TryStrToUInt64(const S: string; out Value: UInt64): Boolean;
var
 E: Integer;
begin
 Val(S, Value, E);
 Result := E = 0;
end;

function StringReplace(const S, OldPattern, NewPattern: string;
 Flags: TReplaceFlags): string;
var
 SearchStr, Patt, NewStr: string;
 Offset: Integer;
 SB: StringBuilder;
begin
 if rfIgnoreCase in Flags then
 begin
   SearchStr := UpperCase(S);
   Patt := UpperCase(OldPattern);
 end else
 begin
   SearchStr := S;
   Patt := OldPattern;
 end;
 NewStr := S;
 SB := StringBuilder.Create;
 while SearchStr <> '' do
 begin
   Offset := Pos(Patt, SearchStr);
   if Offset = 0 then
   begin
     SB.Append(NewStr);
     Break;
   end;
   SB.Append(NewStr, 0, Offset - 1);
   SB.Append(NewPattern);
   NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
   if not (rfReplaceAll in Flags) then
   begin
     SB.Append(NewStr);
     Break;
   end;
   SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
 end;
 Result := SB.ToString;
end;

procedure VerifyBoolStrArray;
begin
 if Length(TrueBoolStrs) = 0 then
 begin
   SetLength(TrueBoolStrs, 2);
   TrueBoolStrs[0] := DefaultTrueBoolStr;
   TrueBoolStrs[1] := DefaultTrueBoolStr[1];
 end;
 if Length(FalseBoolStrs) = 0 then
 begin
   SetLength(FalseBoolStrs, 2);
   FalseBoolStrs[0] := DefaultFalseBoolStr;
   FalseBoolStrs[1] := DefaultFalseBoolStr[1];
 end;
end;

function StrToBool(const S: string; StrOnlyTest: Boolean): Boolean;
begin
 if not TryStrToBool(S, Result, StrOnlyTest) then
   ConvertErrorFmt(SInvalidBoolean, [S]);
end;

function StrToBoolDef(const S: string; const Default: Boolean; StrOnlyTest: Boolean): Boolean;
begin
 if not TryStrToBool(S, Result, StrOnlyTest) then
   Result := Default;
end;

function TryStrToBool(const S: string; out Value: Boolean; StrOnlyTest: Boolean): Boolean;

 function CompareWith(const aArray: array of string): Boolean;
 var
   I: Integer;
 begin
   Result := False;
   for I := Low(aArray) to High(aArray) do
     if AnsiSameText(S, aArray[I]) then
     begin
       Result := True;
       Break;
     end;
 end;

var
 LResult: Double;
begin
 if not StrOnlyTest then
 begin
   Result := TryStrToFloat(S, LResult);
   if Result then
   begin
     Value := LResult <> 0;
     Exit;
   end;
 end;

 VerifyBoolStrArray;
 Result := CompareWith(TrueBoolStrs);
 if Result then
   Value := True
 else
 begin
   Result := CompareWith(FalseBoolStrs);
   if Result then
     Value := False;
 end;
end;

const
 cSimpleBoolStrs: array [boolean] of String = ('0', '-1');
 
function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
begin
 if UseBoolStrs then
 begin
   VerifyBoolStrArray;
   if B then
     Result := TrueBoolStrs[0]
   else
     Result := FalseBoolStrs[0];
 end
 else
   Result := cSimpleBoolStrs[B];
end;

function Format(const Format: string; const Args: array of const): string;
begin
 FmtStr(Result, Format, Args);
end;

function Format(const Format: string; const Args: array of const;
 const FormatSettings: TFormatSettings): string;
begin
 FmtStr(Result, Format, Args, FormatSettings);
end;

function Format(const Format: string; const Args: array of const;
 Provider: IFormatProvider): string;
begin
 FmtStr(Result, Format, Args, Provider);
end;

procedure FmtStr(var Result: string; const Format: string;
 const Args: array of const);
var
 Buffer: System.Text.StringBuilder;
begin
 Buffer := System.Text.StringBuilder.Create(Length(Format) * 2);
 FormatBuf(Buffer, Format, Length(Format), Args);
 Result := Buffer.ToString;
end;

procedure FmtStr(var Result: string; const Format: string;
 const Args: array of const; const FormatSettings: TFormatSettings);
var
 Buffer: System.Text.StringBuilder;
begin
 Buffer := System.Text.StringBuilder.Create(Length(Format) * 2);
 FormatBuf(Buffer, Format, Length(Format), Args, FormatSettings);
 Result := Buffer.ToString;
end;

procedure FmtStr(var Result: string; const Format: string;
 const Args: array of const; Provider: IFormatProvider);
var
 Buffer: System.Text.StringBuilder;
begin
 Buffer := System.Text.StringBuilder.Create(Length(Format) * 2);
 FormatBuf(Buffer, Format, Length(Format), Args, Provider);
 Result := Buffer.ToString;
end;

function FormatBuf(var Buffer: System.Text.StringBuilder; const Format: string;
 FmtLen: Cardinal; const Args: array of const): Cardinal;
var
 LFormat: NumberFormatInfo;
begin
 LFormat := NumberFormatInfo(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.Clone);
 with LFormat do
 begin
   CurrencyDecimalSeparator := DecimalSeparator;
   CurrencyGroupSeparator := ThousandSeparator;
   NumberDecimalSeparator := DecimalSeparator;
   NumberGroupSeparator := ThousandSeparator;
   CurrencySymbol := CurrencyString;
   CurrencyPositivePattern := CurrencyFormat;
   CurrencyNegativePattern := NegCurrFormat;
 end;
 Result := FormatBuf(Buffer, Format, FmtLen, Args, LFormat);
end;

function FormatBuf(var Buffer: System.Text.StringBuilder; const Format: string;
 FmtLen: Cardinal; const Args: array of const; const FormatSettings: TFormatSettings): Cardinal;
var
 LFormat: NumberFormatInfo;
begin
 LFormat := NumberFormatInfo(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.Clone);
 with LFormat, FormatSettings do
 begin
   CurrencyDecimalSeparator := DecimalSeparator;
   CurrencyGroupSeparator := ThousandSeparator;
   NumberDecimalSeparator := DecimalSeparator;
   NumberGroupSeparator := ThousandSeparator;
   CurrencySymbol := CurrencyString;
   CurrencyPositivePattern := CurrencyFormat;
   CurrencyNegativePattern := NegCurrFormat;
 end;
 Result := FormatBuf(Buffer, Format, FmtLen, Args, LFormat);
end;

function FormatBuf(var Buffer: System.Text.StringBuilder; const Format: string;
 FmtLen: Cardinal; const Args: array of const; Provider: IFormatProvider): Cardinal;

 procedure Error;
 begin
   raise System.FormatException.Create(SInvalidFormatString);
 end;

var
 s, srclen: Cardinal;
 argIndex: Cardinal;
 precisionStart: Cardinal;
 precisionLen: Integer;
 fmtSpec: System.Text.StringBuilder;
 argStr: string;
begin
 s := 1;
 argIndex := 0;
 srclen := Length(Format);
 fmtSpec := System.Text.StringBuilder.Create;

 while s <= srclen do
 begin
   if Format[s] = '%' then
   begin
     Inc(s);
     if s > srclen then break;
     if Format[s] = '%' then
     begin
       Buffer.Append(Format[s]);
       Inc(s);
       Continue;
     end;

     fmtSpec.Length := 0;
     fmtSpec.Append('{0,');

     if Format[s] = '-' then   // width might be first
     begin
       fmtSpec.Append(Char('-'));
       Inc(s);
     end;

     if Format[s] = '*' then
     begin
       fmtSpec.Append(Args[argIndex]);
       Inc(argIndex);
       Inc(s);
     end
     else
     begin
       while (s < srclen) and System.Char.IsDigit(Format[s]) do
       begin
         fmtSpec.Append(Format[s]);
         Inc(s);
       end;
     end;

     if s > srclen then Error;

     if Format[s] = ':' then
     begin
       Inc(s);

       // something got added, it must be the index
       if fmtSpec.Length > 3 then
       begin
         argStr := fmtSpec.ToString(3, fmtSpec.Length - 3);
         argIndex := Int32.Parse(argStr);
         fmtSpec.Length := 3;
       end

       // nothing got added, the index then defaults to zero
       else
         argIndex := 0;

       //  width follows argIndex
       if Format[s] = '-' then
       begin
         fmtSpec.Append(Char('-'));
         Inc(s);
       end;

       if Format[s] = '*' then
       begin
         fmtSpec.Append(Args[argIndex]);
         Inc(argIndex);
         Inc(s);
       end
       else
       begin
         while (s < srclen) and System.Char.IsDigit(Format[s]) do
         begin
           fmtSpec.Append(Format[s]);
           Inc(s);
         end;
       end;
     end;

     if fmtSpec.Length = 3 then
       fmtSpec.Length := 2;    // remove comma if no width spec was found

     if s > srclen then Error;

     if Format[s] = '.' then
     begin
       Inc(s);
       if Format[s] = '*' then
       begin
         precisionStart := Integer(Args[argIndex]);
         precisionLen := -1;
         Inc(argIndex);
         Inc(s);
       end
       else
       begin
         precisionStart := s - 1;
         while (s < srclen) and System.Char.IsDigit(Format[s]) do
           Inc(s);
         precisionLen := s - precisionStart - 1;
       end;
     end
     else
     begin
       precisionStart := 0;
       precisionLen := 0;
     end;

     fmtSpec.Append(Char(':'));
     case Format[s] of
       'd', 'D',
       'u', 'U': fmtSpec.Append(Char('d'));
       'e', 'E',
       'f', 'F',
       'g', 'G',
       'n', 'N',
       'x', 'X': fmtSpec.Append(Char(Format[s]));
       'm', 'M': fmtSpec.Append(Char('c'));
       'p', 'P': fmtSpec.Append(Char('x'));
       's', 'S':;   // no format spec needed for strings
     else
       Error;
     end;

     if precisionLen > 0 then
       fmtSpec.Append(Format, precisionStart, precisionLen)
     else if precisionLen < 0 then
       fmtSpec.Append(precisionStart);

     fmtSpec.Append(Char('}'));
     Buffer.AppendFormat(Provider, fmtSpec.ToString, [Args[argIndex]]);
     Inc(argIndex);
   end
   else
     Buffer.Append(Format[s]);

   Inc(s);
 end;
 Result := Buffer.Length;
end;

function WideFormat(const AFormat: WideString;
 const Args: array of const): WideString;
begin
 Result := Format(AFormat, Args);
end;

function WideFormat(const AFormat: WideString;
 const Args: array of const; const FormatSettings: TFormatSettings): WideString;
begin
 Result := Format(AFormat, Args, FormatSettings);
end;

function WideFormat(const AFormat: WideString;
 const Args: array of const; Provider: IFormatProvider): WideString;
begin
 Result := Format(AFormat, Args, Provider);
end;

procedure WideFmtStr(var AResult: WideString; const AFormat: WideString;
 const Args: array of const);
begin
 FmtStr(AResult, AFormat, Args);
end;

procedure WideFmtStr(var AResult: WideString; const AFormat: WideString;
 const Args: array of const; const FormatSettings: TFormatSettings);
begin
 FmtStr(AResult, AFormat, Args, FormatSettings);
end;

procedure WideFmtStr(var AResult: WideString; const AFormat: WideString;
 const Args: array of const; Provider: IFormatProvider);
begin
 FmtStr(AResult, AFormat, Args, Provider);
end;

function WideFormatBuf(var ABuffer: System.Text.StringBuilder; const AFormat: WideString;
 AFmtLen: Cardinal; const Args: array of const): Cardinal;
begin
 Result := FormatBuf(ABuffer, AFormat, AFmtLen, Args);
end;

function WideFormatBuf(var ABuffer: System.Text.StringBuilder; const AFormat: WideString;
 AFmtLen: Cardinal; const Args: array of const; const FormatSettings: TFormatSettings): Cardinal;
begin
 Result := FormatBuf(ABuffer, AFormat, AFmtLen, Args, FormatSettings);
end;

function WideFormatBuf(var ABuffer: System.Text.StringBuilder; const AFormat: WideString;
 AFmtLen: Cardinal; const Args: array of const; Provider: IFormatProvider): Cardinal;
begin
 Result := FormatBuf(ABuffer, AFormat, AFmtLen, Args, Provider);
end;

function StrToFloat(const S: string): Extended;
var
 Value: Double;
begin
 if not TryStrToFloat(S, Value) then
   ConvertErrorFmt(SInvalidFloat, [S]);
 Result := Value;
end;

function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended;
var
 Value: Double;
begin
 if not TryStrToFloat(S, Value, FormatSettings) then
   ConvertErrorFmt(SInvalidFloat, [S]);
 Result := Value;
end;

function StrToFloat(const S: string; Provider: IFormatProvider): Extended;
var
 Value: Double;
begin
 if not TryStrToFloat(S, Value, Provider) then
   ConvertErrorFmt(SInvalidFloat, [S]);
 Result := Value;
end;

function StrToFloatDef(const S: string; const Default: Extended): Extended;
var
 Value: Double;
begin
 if TryStrToFloat(S, Value) then
   Result := Value
 else
   Result := Default;
end;

function StrToFloatDef(const S: string; const Default: Extended;
 const FormatSettings: TFormatSettings): Extended;
var
 Value: Double;
begin
 if TryStrToFloat(S, Value, FormatSettings) then
   Result := Value
 else
   Result := Default;
end;

function StrToFloatDef(const S: string; const Default: Extended;
 Provider: IFormatProvider): Extended;
var
 Value: Double;
begin
 if TryStrToFloat(S, Value, Provider) then
   Result := Value
 else
   Result := Default;
end;

function TryStrToFloat(const S: string; out Value: Double): Boolean;
var
 LFormat: NumberFormatInfo;
begin
 LFormat := NumberFormatInfo(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.Clone);
 with LFormat do
 begin
   CurrencyDecimalSeparator := DecimalSeparator;
   CurrencyGroupSeparator := ThousandSeparator;
   NumberDecimalSeparator := DecimalSeparator;
   NumberGroupSeparator := ThousandSeparator;
 end;
 Result := TryStrToFloat(S, Value, LFormat);
end;

function TryStrToFloat(const S: string; out Value: Double;
 const FormatSettings: TFormatSettings): Boolean;
var
 LFormat: NumberFormatInfo;
begin
 LFormat := NumberFormatInfo(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.Clone);
 with LFormat, FormatSettings do
 begin
   CurrencyDecimalSeparator := DecimalSeparator;
   CurrencyGroupSeparator := ThousandSeparator;
   NumberDecimalSeparator := DecimalSeparator;
   NumberGroupSeparator := ThousandSeparator;
 end;
 Result := TryStrToFloat(S, Value, LFormat);
end;

function TryStrToFloat(const S: string; out Value: Double;
 Provider: IFormatProvider): Boolean;
begin
 Result := System.Double.TryParse(S, NumberStyles.Float, Provider, Value);
end;

function TryStrToFloat(const S: string; out Value: Single): Boolean;
var
 LValue: Double;
begin
 Result := TryStrToFloat(S, LValue);
 if Result then
   Value := LValue;
end;

function TryStrToFloat(const S: string; out Value: Single;
 const FormatSettings: TFormatSettings): Boolean;
var
 LValue: Double;
begin
 Result := TryStrToFloat(S, LValue, FormatSettings);
 if Result then
   Value := LValue;
end;


function TryStrToFloat(const S: string; out Value: Single;
 Provider: IFormatProvider): Boolean;
var
 LValue: Double;
begin
 Result := TryStrToFloat(S, LValue, Provider);
 if Result then
   Value := LValue;
end;

function StrToCurr(const S: string): Currency;
begin
 if not TryStrToCurr(S, Result) then
   ConvertErrorFmt(SInvalidFloat, [S]);
end;

function StrToCurr(const S: string; const FormatSettings: TFormatSettings): Currency;
begin
 if not TryStrToCurr(S, Result, FormatSettings) then
   ConvertErrorFmt(SInvalidFloat, [S]);
end;

function StrToCurr(const S: string; Provider: IFormatProvider): Currency;
begin
 if not TryStrToCurr(S, Result, Provider) then
   ConvertErrorFmt(SInvalidFloat, [S]);
end;


function StrToCurrDef(const S: string; const Default: Currency): Currency;
begin
 if not TryStrToCurr(S, Result) then
   Result := Default;
end;

function StrToCurrDef(const S: string; const Default: Currency;
 const FormatSettings: TFormatSettings): Currency;
begin
 if not TryStrToCurr(S, Result, FormatSettings) then
   Result := Default;
end;

function StrToCurrDef(const S: string; const Default: Currency;
 Provider: IFormatProvider): Currency;
begin
 if not TryStrToCurr(S, Result, Provider) then
   Result := Default;
end;

function TryStrToCurr(const S: string; out Value: Currency): Boolean;
var
 LFormat: NumberFormatInfo;
begin
 LFormat := NumberFormatInfo(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.Clone);
 with LFormat do
 begin
   CurrencyDecimalSeparator := DecimalSeparator;
   CurrencyGroupSeparator := ThousandSeparator;
   NumberDecimalSeparator := DecimalSeparator;
   NumberGroupSeparator := ThousandSeparator;
 end;
 Result := TryStrToCurr(S, Value, LFormat);
end;




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 14.1.2004, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Вот нашёл модуль поменьше, привожу целиком:

Код
unit Borland.Vcl.ActnList platform;

{$T-,H+,X+}

interface

uses Classes, Messages, ImgList, Contnrs,
 System.ComponentModel.Design.Serialization;

type

{ TContainedAction }

 TCustomActionList = class;

 TContainedAction = class(TBasicAction)
 private
   FCategory: string;
   FActionList: TCustomActionList;
   class constructor Create;
   function GetIndex: Integer;
   function IsCategoryStored: Boolean;
   procedure SetCategory(const Value: string);
   procedure SetIndex(Value: Integer);
   procedure SetActionList(AActionList: TCustomActionList);
 protected
   procedure Change; override;
   procedure ReadState(Reader: TReader); override;
 public
   destructor Destroy; override;
   function Execute: Boolean; override;
   function GetParentComponent: TComponent; override;
   function HasParent: Boolean; override;
   procedure SetParentComponent(AParent: TComponent); override;
   function Update: Boolean; override;
   property ActionList: TCustomActionList read FActionList write SetActionList;
   property Index: Integer read GetIndex write SetIndex stored False;
 published
   property Category: string read FCategory write SetCategory stored IsCategoryStored;
 end;

 TContainedActionClass = class of TContainedAction;

{ TCustomActionList }

 TActionEvent = procedure (Action: TBasicAction; var Handled: Boolean) of object;
 TActionListState = (asNormal, asSuspended, asSuspendedEnabled);

 [RootDesignerSerializerAttribute('', '', False)]
 TCustomActionList = class(TComponent)
 private
   FActions: TList;
   FImageChangeLink: TChangeLink;
   FImages: TCustomImageList;
   FOnChange: TNotifyEvent;
   FOnExecute: TActionEvent;
   FOnUpdate: TActionEvent;
   FState: TActionListState;
   FOnStateChange: TNotifyEvent;
   class constructor Create;
   function GetAction(Index: Integer): TContainedAction;
   function GetActionCount: Integer;
   procedure SetAction(Index: Integer; Value: TContainedAction);
   procedure SetState(const Value: TActionListState);
   procedure ImageListChange(Sender: TObject);
 protected
   procedure AddAction(Action: TContainedAction);
   procedure RemoveAction(Action: TContainedAction);
   procedure Change; virtual;
   procedure Notification(AComponent: TComponent;
     Operation: TOperation); override;
   procedure SetChildOrder(Component: TComponent; Order: Integer); override;
   procedure SetImages(Value: TCustomImageList); virtual;
   property OnChange: TNotifyEvent read FOnChange write FOnChange;
   property OnExecute: TActionEvent read FOnExecute write FOnExecute;
   property OnUpdate: TActionEvent read FOnUpdate write FOnUpdate;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   function ExecuteAction(Action: TBasicAction): Boolean; override;
   procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
   function IsShortCut(var Message: TWMKey): Boolean;
   function UpdateAction(Action: TBasicAction): Boolean; override;
   property Actions[Index: Integer]: TContainedAction read GetAction write SetAction; default;
   property ActionCount: Integer read GetActionCount;
   property Images: TCustomImageList read FImages write SetImages;
   property State: TActionListState read FState write SetState default asNormal;
   property OnStateChange: TNotifyEvent read FOnStateChange write FOnStateChange;
 end;

{ TActionList }

 TActionList = class(TCustomActionList)
 published
   property Images;
   property State;
   property OnChange;
   property OnExecute;
   property OnStateChange;
   property OnUpdate;
 end;

{ TShortCutList }

 TShortCutList = class(TStringList)
 private
   function GetShortCuts(Index: Integer): TShortCut;
 public
   function Add(const S: String): Integer; override;
   function IndexOfShortCut(const Shortcut: TShortCut): Integer;
   property ShortCuts[Index: Integer]: TShortCut read GetShortCuts;
 end;

{ TCustomAction }

 THintEvent = procedure (var HintStr: string; var CanShow: Boolean) of object;

 TCustomAction = class(TContainedAction)
 private
   FDisableIfNoHandler: Boolean;
   FCaption: string;
   FChecking: Boolean;
   FChecked: Boolean;
   FEnabled: Boolean;
   FGroupIndex: Integer;
   FHelpType: THelpType;
   FHelpContext: THelpContext;
   FHelpKeyword: string;
   FHint: string;
   FImageIndex: TImageIndex;
   FShortCut: TShortCut;
   FVisible: Boolean;
   FOnHint: THintEvent;
   FSecondaryShortCuts: TShortCutList;
   FSavedEnabledState: Boolean;
   FAutoCheck: Boolean;
   FImage: TObject;
   FMask: TObject;
   procedure SetAutoCheck(Value: Boolean);
   procedure SetCaption(const Value: string);
   procedure SetChecked(Value: Boolean);
   procedure SetEnabled(Value: Boolean);
   procedure SetGroupIndex(const Value: Integer);
   procedure SetHelpType(Value: THelpType);
   procedure SetHint(const Value: string);
   procedure SetImageIndex(Value: TImageIndex);
   procedure SetShortCut(Value: TShortCut);
   procedure SetVisible(Value: Boolean);
   function GetSecondaryShortCuts: TShortCutList;
   procedure SetSecondaryShortCuts(const Value: TShortCutList);
   function IsSecondaryShortCutsStored: Boolean;
 protected
   procedure AssignTo(Dest: TPersistent); override;
   procedure SetName(const Value: TComponentName); override;
   procedure SetHelpContext(Value: THelpContext); virtual;
   procedure SetHelpKeyword(const Value: string); virtual;
   function HandleShortCut: Boolean; virtual;
   property SavedEnabledState: Boolean read FSavedEnabledState write FSavedEnabledState;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   function DoHint(var HintStr: string): Boolean; dynamic;
   function Execute: Boolean; override;
   property AutoCheck: Boolean read FAutoCheck write  SetAutoCheck default False;
   property Caption: string read FCaption write SetCaption;
   property Checked: Boolean read FChecked write SetChecked default False;
   property DisableIfNoHandler: Boolean read FDisableIfNoHandler write FDisableIfNoHandler default False;
   property Enabled: Boolean read FEnabled write SetEnabled default True;
   property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0;
   property HelpContext: THelpContext read FHelpContext write SetHelpContext default 0;
   property HelpKeyword: string read FHelpKeyword write SetHelpKeyword;
   property HelpType: THelpType read FHelpType write SetHelpType default htKeyword;
   property Hint: string read FHint write SetHint;
   property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1;
   property ShortCut: TShortCut read FShortCut write SetShortCut default 0;
   property SecondaryShortCuts: TShortCutList read GetSecondaryShortCuts
     write SetSecondaryShortCuts stored IsSecondaryShortCutsStored;
   property Visible: Boolean read FVisible write SetVisible default True;
   property OnHint: THintEvent read FOnHint write FOnHint;
   { Property access for design time support }
   property Image: TObject read FImage write FImage;
   property Mask: TObject read FMask write FMask;
 end;

 TAction = class(TCustomAction)
 public
   constructor Create(AOwner: TComponent); override;
 published
   property AutoCheck;
   property Caption;
   property Checked;
   property Enabled;
   property GroupIndex;
   property HelpContext;
   property HelpKeyword;
   property HelpType;
   property Hint;
   property ImageIndex;
   property ShortCut;
   property SecondaryShortCuts;
   property Visible;
   property OnExecute;
   property OnHint;
   property OnUpdate;
 end;

{ TActionLink }

 TActionLink = class(TBasicActionLink)
 protected
   function IsCaptionLinked: Boolean; virtual;
   function IsCheckedLinked: Boolean; virtual;
   function IsEnabledLinked: Boolean; virtual;
   function IsGroupIndexLinked: Boolean; virtual;
   function IsHelpContextLinked: Boolean; virtual;
   function IsHelpLinked: Boolean; virtual;
   function IsHintLinked: Boolean; virtual;
   function IsImageIndexLinked: Boolean; virtual;
   function IsShortCutLinked: Boolean; virtual;
   function IsVisibleLinked: Boolean; virtual;
   procedure SetAutoCheck(Value: Boolean); virtual;
   procedure SetCaption(const Value: string); virtual;
   procedure SetChecked(Value: Boolean); virtual;
   procedure SetEnabled(Value: Boolean); virtual;
   procedure SetGroupIndex(Value: Integer); virtual;
   procedure SetHelpContext(Value: THelpContext); virtual;
   procedure SetHelpKeyword(const Value: string); virtual;
   procedure SetHelpType(Value: THelpType); virtual;
   procedure SetHint(const Value: string); virtual;
   procedure SetImageIndex(Value: Integer); virtual;
   procedure SetShortCut(Value: TShortCut); virtual;
   procedure SetVisible(Value: Boolean); virtual;
 end;

 TActionLinkClass = class of TActionLink;

{ Action registration }

 TEnumActionProc = procedure (const Category: string; ActionClass: TBasicActionClass;
   Info: TObject) of object;

procedure RegisterActions(const CategoryName: string;
 const AClasses: array of TBasicActionClass; Resource: TComponentClass);
procedure UnRegisterActions(const AClasses: array of TBasicActionClass);
procedure EnumRegisteredActions(Proc: TEnumActionProc; Info: TObject);
function CreateAction(AOwner: TComponent; ActionClass: TBasicActionClass): TBasicAction;

const
 RegisterActionsProc: procedure (const CategoryName: string;
   const AClasses: array of TBasicActionClass; Resource: TComponentClass) = nil;
 UnRegisterActionsProc: procedure (const AClasses: array of TBasicActionClass) = nil;
 EnumRegisteredActionsProc: procedure (Proc: TEnumActionProc; Info: TObject) = nil;
 CreateActionProc: function (AOwner: TComponent; ActionClass: TBasicActionClass): TBasicAction = nil;

implementation

uses SysUtils, Windows, Forms, Menus, Graphics, Controls, Consts,
 System.Runtime.InteropServices;

procedure RegisterActions(const CategoryName: string;
 const AClasses: array of TBasicActionClass; Resource: TComponentClass);
begin
 if Assigned(RegisterActionsProc) then
   RegisterActionsProc(CategoryName, AClasses, Resource) else
   raise Exception.Create(SInvalidActionRegistration);
end;

procedure UnRegisterActions(const AClasses: array of TBasicActionClass);
begin
 if Assigned(UnRegisterActionsProc) then
   UnRegisterActionsProc(AClasses) else
   raise Exception.Create(SInvalidActionUnregistration);
end;

procedure EnumRegisteredActions(Proc: TEnumActionProc; Info: TObject);
begin
 if Assigned(EnumRegisteredActionsProc) then
   EnumRegisteredActionsProc(Proc, Info) else
   raise Exception.Create(SInvalidActionEnumeration);
end;

function CreateAction(AOwner: TComponent; ActionClass: TBasicActionClass): TBasicAction;
begin
 if Assigned(CreateActionProc) then
   Result := CreateActionProc(AOwner, ActionClass) else
   raise Exception.Create(SInvalidActionCreation);
end;

{ TContainedAction }

class constructor TContainedAction.Create;
begin
 GroupDescendentsWith(TContainedAction, TControl);
end;

destructor TContainedAction.Destroy;
begin
 if ActionList <> nil then ActionList.RemoveAction(Self);
 inherited Destroy;
end;

function TContainedAction.GetIndex: Integer;
begin
 if ActionList <> nil then
   Result := ActionList.FActions.IndexOf(Self) else
   Result := -1;
end;

function TContainedAction.IsCategoryStored: Boolean;
begin
 Result := True;//GetParentComponent <> ActionList;
end;

function TContainedAction.GetParentComponent: TComponent;
begin
 if ActionList <> nil then
   Result := ActionList else
   Result := inherited GetParentComponent;
end;

function TContainedAction.HasParent: Boolean;
begin
 if ActionList <> nil then
   Result := True else
   Result := inherited HasParent;
end;

procedure TContainedAction.Change;
begin
 inherited Change;
end;

procedure TContainedAction.ReadState(Reader: TReader);
begin
 inherited ReadState(Reader);
 if Reader.Parent is TCustomActionList then
   ActionList := TCustomActionList(Reader.Parent);
end;

procedure TContainedAction.SetIndex(Value: Integer);
var
 CurIndex, Count: Integer;
begin
 CurIndex := GetIndex;
 if CurIndex >= 0 then
 begin
   Count := ActionList.FActions.Count;
   if Value < 0 then Value := 0;
   if Value >= Count then Value := Count - 1;
   if Value <> CurIndex then
   begin
     ActionList.FActions.Delete(CurIndex);
     ActionList.FActions.Insert(Value, Self);
   end;
 end;
end;

procedure TContainedAction.SetCategory(const Value: string);
begin
 if Value <> Category then
 begin
   FCategory := Value;
   if ActionList <> nil then
     ActionList.Change;
 end;
end;

procedure TContainedAction.SetActionList(AActionList: TCustomActionList);
begin
 if AActionList <> ActionList then
 begin
   if ActionList <> nil then ActionList.RemoveAction(Self);
   if AActionList <> nil then AActionList.AddAction(Self);
 end;
end;

procedure TContainedAction.SetParentComponent(AParent: TComponent);
begin
 if not (csLoading in ComponentState) and (AParent is TCustomActionList) then
   ActionList := TCustomActionList(AParent);
end;

function TContainedAction.Execute: Boolean;
begin
 Result := (ActionList <> nil) and ActionList.ExecuteAction(Self) or
   Application.ExecuteAction(Self) or inherited Execute;
 if not Result then
   if Assigned(Application) then
     Result := Application.DispatchAction(True, self, False);
end;

function TContainedAction.Update: Boolean;
begin
 Result := (ActionList <> nil) and ActionList.UpdateAction(Self) or
   Application.UpdateAction(Self) or inherited Update;
  if not Result then
    if Assigned(Application) then
      Result := Application.DispatchAction(False, self, False);
end;

{ TCustomActionList }

class constructor TCustomActionList.Create;
begin
 GroupDescendentsWith(TCustomActionList, TControl);
end;

constructor TCustomActionList.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FActions := TList.Create;
 FImageChangeLink := TChangeLink.Create;
 FImageChangeLink.OnChange := ImageListChange;
 FState := asNormal;
end;

destructor TCustomActionList.Destroy;
begin
 FImageChangeLink.Free;
 while FActions.Count > 0 do TContainedAction(FActions.Last).Free;
 FActions.Free;
 inherited Destroy;
end;

procedure TCustomActionList.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
 I: Integer;
 Action: TCustomAction;
begin
 for I := 0 to FActions.Count - 1 do
 begin
   Action := TCustomAction(FActions.List[I]);
   if Action.Owner = Root then Proc(Action);
 end;
end;

procedure TCustomActionList.SetChildOrder(Component: TComponent; Order: Integer);
begin
 if FActions.IndexOf(Component) >= 0 then
   (Component as TContainedAction).Index := Order;
end;

function TCustomActionList.GetAction(Index: Integer): TContainedAction;
begin
 Result := TContainedAction(FActions[Index]);
end;

function TCustomActionList.GetActionCount: Integer;
begin
 Result := FActions.Count;
end;

procedure TCustomActionList.SetAction(Index: Integer; Value: TContainedAction);
begin
 TContainedAction(FActions[Index]).Assign(Value);
end;

procedure TCustomActionList.SetImages(Value: TCustomImageList);
begin
 if Images <> nil then Images.UnRegisterChanges(FImageChangeLink);
 FImages := Value;
 if Images <> nil then
 begin
   Images.RegisterChanges(FImageChangeLink);
   Images.FreeNotification(Self);
 end;
end;

procedure TCustomActionList.ImageListChange(Sender: TObject);
begin
 if Sender = Images then Change;
end;

procedure TCustomActionList.Notification(AComponent: TComponent;
 Operation: TOperation);
begin
 inherited Notification(AComponent, Operation);
 if Operation = opRemove then
   if AComponent = Images then
     Images := nil
   else if (AComponent is TContainedAction) then
     RemoveAction(TContainedAction(AComponent));
end;

procedure TCustomActionList.AddAction(Action: TContainedAction);
begin
 FActions.Add(Action);
 Action.FActionList := Self;
 Action.FreeNotification(Self);
end;

procedure TCustomActionList.RemoveAction(Action: TContainedAction);
begin
 if FActions.Remove(Action) >= 0 then
   Action.FActionList := nil;
end;

procedure TCustomActionList.Change;
var
 I: Integer;
begin
 if Assigned(FOnChange) then FOnChange(Self);
 for I := 0 to FActions.Count - 1 do
   TContainedAction(FActions.List[I]).Change;
 if csDesigning in ComponentState then
 begin
   if (Owner is TForm) and (TForm(Owner).Designer <> nil) then
     TForm(Owner).Designer.Modified;
 end;
end;

function TCustomActionList.IsShortCut(var Message: TWMKey): Boolean;
var
 I: Integer;
 ShortCut: TShortCut;
 ShiftState: TShiftState;
 Action: TCustomAction;
begin
 ShiftState := KeyDataToShiftState(Message.KeyData);
 ShortCut := Menus.ShortCut(Message.CharCode, ShiftState);
 if ShortCut <> scNone then
   for I := 0 to FActions.Count - 1 do
   begin
     Action := TCustomAction(FActions.List[I]);
     if (TObject(Action) is TCustomAction) then
       if (Action.ShortCut = ShortCut) or (Assigned(Action.FSecondaryShortCuts) and
          (Action.SecondaryShortCuts.IndexOfShortCut(ShortCut) <> -1)) then
       begin
         Result := Action.HandleShortCut;
         Exit;
       end;
   end;
 Result := False;
end;

function TCustomActionList.ExecuteAction(Action: TBasicAction): Boolean;
begin
 Result := False;
 if Assigned(FOnExecute) then FOnExecute(Action, Result);
end;

function TCustomActionList.UpdateAction(Action: TBasicAction): Boolean;
begin
 Result := False;
 if Assigned(FOnUpdate) then FOnUpdate(Action, Result);
end;

procedure TCustomActionList.SetState(const Value: TActionListState);
var
 I: Integer;
 Action: TCustomAction;
 OldState: TActionListState;
begin
 if FState <> Value then
 begin
   OldState := FState;
   FState := Value;
   if State = asSuspended then exit;
   for I := 0 to FActions.Count - 1 do
   begin
     Action := TCustomAction(FActions.List[I]);
     case Value of
       asNormal:
         begin
           if Action is TCustomAction then
             if OldState = asSuspendedEnabled then
               with Action as TCustomAction do
                 Enabled := SavedEnabledState;
           Action.Update;
         end;
       asSuspendedEnabled:
         if Action is TCustomAction then
           if Value = asSuspendedEnabled then
             with Action as TCustomAction do
             begin
               SavedEnabledState := Enabled;
               Enabled := True;
             end;
     end;
   end;
   if Assigned(FOnStateChange) then
     FOnStateChange(Self);
 end;
end;

{ TActionLink }

function TActionLink.IsCaptionLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsCheckedLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsEnabledLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsGroupIndexLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsHelpContextLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsHelpLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsHintLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsImageIndexLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsShortCutLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

function TActionLink.IsVisibleLinked: Boolean;
begin
 Result := Action is TCustomAction;
end;

procedure TActionLink.SetAutoCheck(Value: Boolean);
begin
end;

procedure TActionLink.SetCaption(const Value: string);
begin
end;

procedure TActionLink.SetChecked(Value: Boolean);
begin
end;

procedure TActionLink.SetEnabled(Value: Boolean);
begin
end;

procedure TActionLink.SetGroupIndex(Value: Integer);
begin
end;

procedure TActionLink.SetHelpContext(Value: THelpContext);
begin
end;

procedure TActionLink.SetHelpKeyword(const Value: string);
begin
end;

procedure TActionLink.SetHelpType(Value: THelpType);
begin
end;

procedure TActionLink.SetHint(const Value: string);
begin
end;

procedure TActionLink.SetImageIndex(Value: Integer);
begin
end;

procedure TActionLink.SetShortCut(Value: TShortCut);
begin
end;

procedure TActionLink.SetVisible(Value: Boolean);
begin
end;

{ TCustomAction }

constructor TCustomAction.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FEnabled := True;
 FImageIndex := -1;
 FVisible := True;
 FSecondaryShortCuts := nil;
end;

destructor TCustomAction.Destroy;
begin
 FImage.Free;
 FMask.Free;
 if Assigned(FSecondaryShortCuts) then
   FreeAndNil(FSecondaryShortCuts);
 inherited Destroy;
end;

procedure TCustomAction.AssignTo(Dest: TPersistent);
begin
 if Dest is TCustomAction then
   with TCustomAction(Dest) do
   begin
     Caption := Self.Caption;
     Checked := Self.Checked;
     Enabled := Self.Enabled;
     HelpContext := Self.HelpContext;
     Hint := Self.Hint;
     ImageIndex := Self.ImageIndex;
     ShortCut := Self.ShortCut;
     Visible := Self.Visible;
     OnExecute := Self.OnExecute;
     OnUpdate := Self.OnUpdate;
     OnChange := Self.OnChange;
   end else inherited AssignTo(Dest);
end;

procedure TCustomAction.SetAutoCheck(Value: Boolean);
var
 I: Integer;
begin
 if Value <> FAutoCheck then
 begin
   for I := 0 to FClients.Count - 1 do
     if TBasicActionLink(FClients[I]) is TActionLink then
       TActionLink(FClients[I]).SetAutoCheck(Value);
   FAutoCheck := Value;
   Change;
 end;
end;

procedure TCustomAction.SetCaption(const Value: string);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FCaption then
 begin
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetCaption(Value);
   end;
   FCaption := Value;
   Change;
 end;
end;

procedure TCustomAction.SetChecked(Value: Boolean);
var
 I: Integer;
 Link: TActionLink;
 Action: TContainedAction;
begin
 if FChecking then exit;
 FChecking := True;
 try
   if Value <> FChecked then
   begin
     for I := 0 to FClients.Count - 1 do
     begin
       Link := TObject(FClients.List[I]) as TActionLink;
       if Assigned(Link) then
         Link.SetChecked(Value);
     end;
     FChecked := Value;
     if (FGroupIndex > 0) and FChecked then
       for I := 0 to ActionList.ActionCount - 1 do
       begin
         Action := ActionList.Actions[I];
         if (Action <> Self) and
            (TObject(Action) is TCustomAction) and
            (TCustomAction(Action).FGroupIndex = FGroupIndex) then
           TCustomAction(Action).Checked := False;
       end;
     Change;
   end;
 finally
   FChecking := False;
 end;
end;

procedure TCustomAction.SetEnabled(Value: Boolean);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FEnabled then
 begin
   if Assigned(ActionList) then
     if ActionList.State = asSuspended then
     begin
       FEnabled := Value;
       exit;
     end
     else
       if (ActionList.State = asSuspendedEnabled) then
         Value := True;
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       TActionLink(Link).SetEnabled(Value);
   end;
   FEnabled := Value;
   Change;
 end;
end;

procedure TCustomAction.SetGroupIndex(const Value: Integer);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FGroupIndex then
 begin
   FGroupIndex := Value;
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetGroupIndex(Value);
   end;
   Change;
 end;
end;

procedure TCustomAction.SetHelpType(Value: THelpType);
var
 I: Integer;
begin
 if Value <> FHelpType then
 begin
   for I := 0 to FClients.Count -1 do
    if TBasicActionLink(FCLients[I]) is TActionLink then
      TActionLink(FClients[I]).SetHelpType(Value);
   FHelpType := Value;
   Change;
 end;
end;

procedure TCustomAction.SetHelpKeyword(const Value: string);
var
 I: Integer;
begin
 if Value <> FHelpKeyword then
 begin
   for I := 0 to FClients.Count -1 do
    if TBasicActionLink(FCLients[I]) is TActionLink then
      TActionLink(FClients[I]).SetHelpKeyword(Value);
   FHelpKeyword := Value;
   Change;
 end;
end;

procedure TCustomAction.SetHelpContext(Value: THelpContext);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FHelpContext then
 begin
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetHelpContext(Value);
   end;
   FHelpContext := Value;
   Change;
 end;
end;

procedure TCustomAction.SetHint(const Value: string);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FHint then
 begin
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetHint(Value);
   end;
   FHint := Value;
   Change;
 end;
end;

procedure TCustomAction.SetImageIndex(Value: TImageIndex);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FImageIndex then
 begin
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetImageIndex(Value);
   end;
   FImageIndex := Value;
   Change;
 end;
end;

procedure TCustomAction.SetShortCut(Value: TShortCut);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FShortCut then
 begin
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetShortCut(Value);
   end;
   FShortCut := Value;
   Change;
 end;
end;

procedure TCustomAction.SetVisible(Value: Boolean);
var
 I: Integer;
 Link: TActionLink;
begin
 if Value <> FVisible then
 begin
   for I := 0 to FClients.Count - 1 do
   begin
     Link := TObject(FClients.List[I]) as TActionLink;
     if Assigned(Link) then
       Link.SetVisible(Value);
   end;
   FVisible := Value;
   Change;
 end;
end;

procedure TCustomAction.SetName(const Value: TComponentName);
var
 ChangeText: Boolean;
begin
 ChangeText := (Name = Caption) and ((Owner = nil) or
   not (csLoading in Owner.ComponentState));
 inherited SetName(Value);
 { Don't update caption to name if we've got clients connected. }
 if ChangeText and (FClients.Count = 0) then Caption := Value;
end;

function TCustomAction.DoHint(var HintStr: string): Boolean;
begin
 Result := True;
 if Assigned(FOnHint) then FOnHint(HintStr, Result);
end;

function TCustomAction.Execute: Boolean;
begin
 Result := False;
 if Assigned(ActionList) and (ActionList.State <> asNormal) then Exit;
 Update;
 if Enabled and FAutoCheck then
   if not Checked or Checked and (GroupIndex = 0) then
     Checked := not Checked;
 Result := Enabled and inherited Execute;
end;

function TCustomAction.GetSecondaryShortCuts: TShortCutList;
begin
 if FSecondaryShortCuts = nil then
   FSecondaryShortCuts := TShortCutList.Create;
 Result := FSecondaryShortCuts;
end;

procedure TCustomAction.SetSecondaryShortCuts(const Value: TShortCutList);
begin
 if FSecondaryShortCuts = nil then
   FSecondaryShortCuts := TShortCutList.Create;
 FSecondaryShortCuts.Assign(Value);
end;

function TCustomAction.IsSecondaryShortCutsStored: Boolean;
begin
 Result := Assigned(FSecondaryShortCuts) and (FSecondaryShortCuts.Count > 0);
end;

function TCustomAction.HandleShortCut: Boolean;
begin
 Result := Execute;
end;

{ TShortCutList }

function TShortCutList.Add(const S: String): Integer;
begin
 Result := inherited Add(S);
 Objects[Result] := TObject(TextToShortCut(S));
end;

function TShortCutList.GetShortCuts(Index: Integer): TShortCut;
begin
 Result := TShortCut(Objects[Index]);
end;

{ TAction }

constructor TAction.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 DisableIfNoHandler := True;
end;

function TShortCutList.IndexOfShortCut(const Shortcut: TShortCut): Integer;
var
 I: Integer;
begin
 Result := -1;
 for I := 0 to Count - 1 do
   if TShortCut(Objects[I]) = ShortCut then
   begin
     Result := I;
     break;
   end;
end;

end.



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Paradox
Дата 14.1.2004, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Цитата
 
Есть ли понятие делегата?


Если б я ещё знал что это такое...

ИМХО что то вроде дружественных функций в С++ смешанные с указателями на ф-ии


--------------------
---
PM MAIL WWW   Вверх
Paradox
Дата 14.1.2004, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Ктати Vit а ведь в Дельфи есть понятие делегирования - не сталкивался разве ?


--------------------
---
PM MAIL WWW   Вверх
stab
Дата 14.1.2004, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата

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


В Delphi роль делегатов выполняли переменные процедурных типов, но с точки зрения защищенности такой подход не самый лучший. В .net для этого придумали делегаты, т.е. класс который инкапсулирует в себе всю работу связанную с вызовом и т.д. методов. Если процедурные типы так и оставили без изменений, то сомнительно называть Delphi .net языком.

з.ы. Я не много не правильно задал вопрос, от класса делегата в .net наследовать нельзя. Точнее наследовать могут только компилеры и посуществу это вообще не класс, а шаблон класса smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 14.1.2004, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Vit, выложи, пожалуйста, описание и реализацию TObject или того, что его заменяет smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Paradox
Дата 14.1.2004, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Цитата
реализацию TObject или того, что его заменяет

По моему в дотнет это System.Object


--------------------
---
PM MAIL WWW   Вверх
Cheba
  Дата 14.1.2004, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: нет
Всего: 62



Вот в комплекте с Delphi 7 есть компилятор для .NET. А нет ли в Delphi 8 компилятора для обычного Win32, или как там его зхвать?
PM MAIL ICQ   Вверх
Vit
Дата 14.1.2004, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата
Ктати Vit а ведь в Дельфи есть понятие делегирования - не сталкивался разве ?


Или не сталкивался, или не владею терминологией.


Цитата
В Delphi роль делегатов выполняли переменные процедурных типов,


Ну, эта штука естественно хорошо знакома.

Цитата
А нет ли в Delphi 8 компилятора для обычного Win32, или как там его зхвать?


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

Цитата
Vit, выложи, пожалуйста, описание и реализацию TObject или того, что его заменяет


Код
type
 TObject = System.Object;
 TCustomAttribute = System.Attribute;
 Exception = System.Exception;
 TGUID = System.Guid;

{ TClass = class of TObject

 For each class type (TMyClass) declared in Delphi source code, the compiler
 will create a corresponding metaclass (@MetaTMyClass) inherited from TClass
 to implement Delphi "class of object" behaviors, such as virtual
 constructors and virtual class methods.  All Delphi metaclasses inherit from
 TClass.  Delphi metaclasses are not CLS compliant and not intended for use
 by other languages.

 Whenever an object instance or a class type is assigned to a class reference
 variable or parameter, the compiler will select the appropriate metaclass
 to pass instead of the actual object instance.

 Instead of constructing an instance of the metaclass each time it is
 referenced, the compiler will define a constant static instance of
 the metaclass.  For most class method calls and class reference assignments,
 that constant static instance will be passed as the Self param of the call.
 This allows TObjectHelper.ClassParent to return the ancestor's actual
 TClass without having to construct a System.Type instance, and without
 having to search for the appropriate TClass.

 If a class type is imported from CLR (and is not a Delphi-generated class),
 it will not have a metaclass.  When a CLR imported class is used in
 a Delphi class reference expression, the compiler will construct an
 instance of a generic TClass, passing the CLR type to the constructor.
 The generic TClass can simulate Delphi metaclass behaviors for CLR classes,
 but not as efficiently as compiler-constructed metaclasses.

 If you extract the System.Type from a Delphi class and use it in a Delphi
 class reference expression, you lose the Delphi-specific behaviors provided
 by the Delphi metaclass associated with the Delphi class.

 TClass uses System.RuntimeTypeHandle to identify the object instance type.
 RuntimeTypeHandles are more memory efficient than instances of
 System.Type, particularly when we don't expect to use them very often.
}

{ Do not place any class declarations before _TClass! }

 _TClass = class;

 TClass = class of TObject;

 _TClass = class
 strict protected
   FInstanceTypeHandle: System.RuntimeTypeHandle;
   FInstanceType: System.Type;
   FClassParent: _TClass;
 protected
   procedure SetInstanceType(ATypeHandle: System.RuntimeTypeHandle);
   procedure SetDelegator(ATypeDelegator: System.Type);
 public
   constructor Create; overload;
   constructor Create(ATypeHandle: System.RuntimeTypeHandle); overload;
   constructor Create(AType: System.Type); overload;
   function ClassParent: TClass;
   function InstanceTypeHandle: System.RuntimeTypeHandle;
   function InstanceType: System.Type;
   function Equals(AObj: TObject): Boolean; override;
   function GetHashCode: Integer; override;
 end;



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 14.1.2004, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



А может кто-нибудь возьмёт на себя труд объяснить простыми словами как события организованы?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
gray_k
Дата 14.1.2004, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Цитата
А нет ли в Delphi 8 компилятора для обычного Win32, или как там его зхвать?

На дне Борланд в Москве, когда задали подобный вопрос топ-менеджер долго уходил от темы, а когда прижали таки прозвучала фраза: "C Delphi8 будет поставлятся Delphi7." ИМХО, всё ясно.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
Kurt
Дата 14.1.2004, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Цитата(gray_k @ 14.1.2004, 15:45)
"C Delphi8 будет поставлятся Delphi7." ИМХО, всё ясно.

Вот. Тут рассказано про этот день Борланд.
В самом конце..
Обратите внимание - "выступление спонсора"..
ИМХО, это и есть покупка Borland..


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
stab
Дата 14.1.2004, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Могу рассказать про то как события в .net организованны, про Delphi 8 не могу, т.к. не щупал еще. Про .net. Делегат это, что-то вроде указателя на функцию (C++) или процедурный тип (Pascal). Объявление делегата на C# выглядит так:

delegate ret-type name (parameters);

delegate служебное слово
ret-type тип возвращаемого значения методов, которые может вызвать делегат
name имя делегата
parameters параметры методов, которые может вызывать делегат

У каждого метода есть сигнатура, если сигнатура метода соответствует сигнатуре делегата, то он может вызвать этот метод. Сигнатура формируется исходя из возвращаемого типа и списка параметров.

Скажем, если дельфевое TNotifyEvent = procedure(Sender: TObject) of object; первести в C#, то получим delegate void TNotifyEvent(object Sender);.

Теперь требуется как-то использовать полученные знания smile.gif Попробуем создать класс, который бы генерировал событие. Сначало на старом Delphi, так сказать, Pre Delphi 8:

Код

TMethodInvokeEvent = procedure(Sender: TObject) of object;

TMyClassWithOneEvent = class
private
 FOnMethodInvoke: TMethodInvokeEvent;
public
 property OnMethodInvoke: TMethodInvokeEvent read FOnMethodInvoke write FOnMethodInvoke;
 procedure SomeMethod;
end;

implementation

procedure TMyClassWithOneEvent.SomeMethod;
begin
if Assigned(FOnMethodInvoke) then FOnMethodInvoke(Self);
end;



Короче, все как обычно. Теперь то же самое только на C#:

Код

public delegate void MethodInvokeEvent(object Sender);

public class MyClassWithOneEvent
{
    public event MethodInvokeEvent MethodInvoke;

    public void SomeMethod()
    {
         if (MethodInvoke != null) MethodInvoke(this);
    }
}


Теперь создадим объект этого класса и назначим обработчик события, а в случае C# (.net) даже несколько обработчиков на одно событие. Delphi:

Код

var
obj: TMyClassWithOneEvent;

procedure TForm1.MethodInvoke(Sender: TObject);
begin
 Windows.Beep(1000, 100);
end;

...

 obj := TMyClassWithOneEvent.Create;
 obj.OnMethodInvoke := MethodInvoke;
 obj.SomeMethod;
 obj.Free;



C#:

Код

public void Form1_MethodInvoke1(object Sender)
{
    Beep(1000, 100);
}

public void Form1_MethodInvoke2(object Sender)
{
    Beep(2000, 100);
}

private void Form1_Load(object sender, System.EventArgs e)
{
    MyClassWithOneEvent obj = new MyClassWithOneEvent();
    obj.MethodInvoke += new MethodInvokeEvent(Form1_MethodInvoke1);
    obj.MethodInvoke += new MethodInvokeEvent(Form1_MethodInvoke2);
    obj.SomeMethod();
}


Фишка в том, что в .net на одно событие мы повесили 2 (два) smile.gif обработчика Form1_MethodInvoke1 и Form1_MethodInvoke2, которые вызываются по очереди. Теоритически если Delphi 8 является .net языком, то в нем должно быть все так же как в C#, только пишется иначе. Вроде расказывать больше нечего, если будут вопросы, милости просим...


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Петрович
Дата 14.1.2004, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Цитата
Фишка в том, что в .net на одно событие мы повесили 2 (два)

Здорово, однако вопрос, а если позже захочется снять один из обработчиков? Как это делается?


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
stab
Дата 14.1.2004, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата
а если позже захочется снять один из обработчиков? Как это делается?


можно так:
Код
obj.MethodInvoke -= new MethodInvokeEvent(Form1_MethodInvoke2);


а можно так:
Код

MethodInvokeEvent h = new MethodInvokeEvent(Form1_MethodInvoke2);
obj.MethodInvoke += h;
obj.MethodInvoke -= h;


что в принципе эквивалентно, т.к. операция срвнение для делегатов перегружена и сравнивает не объекты, а то на что они ссылаются, т.е. методы.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
AntonSaburov
Дата 15.1.2004, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Думаю, что надо и мне слово сказать smile.gif

Я тоже смотрел Delphi 8.
Итак:

1. По поводу вызовов WinAPI - да, так оно и делается, как vit показал. (Можете зайти в форум по .NET - там в разделе "Экспорт класса из DLL на VC++6.0, и его использование в .NET" есть практически такой же примерчик.

2. По поводу VCL - это фактически сделаны обертки вокруг компонентов для .NET. Поэтому можно предполагать, что компонентов будет прибавляться, т.к. на самом деле гибкость компонент в .NET достаточно велика и можно их там наклепать просто море.

3. По поводу BDE - лично мне кажется, что это тоже обертки вокруг копонентов от .NET
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 15.1.2004, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Прочитал весь топик и понял, что теперь работы в форуме .NET явно прибавится smile.gif
Потому как половина, если не 80% из того, что спрашивается - относится исключительно к сфере .NET.

Например:
Цитата
Фишка в том, что в .net на одно событие мы повесили 2 (два)

Это идеи именно от .NET. В принципе эти идеи, как часто водится у Майкрософт, уже были использованы в других продуктах (в той же JAVA).

Цитата
Здорово, однако вопрос, а если позже захочется снять один из обработчиков? Как это делается?

Думаю, что на 99% попаду в точку если напишу так
Код
obj.MethodInvoke -= new MethodInvokeEvent(Form1_MethodInvoke1);

Это уже стандартный синтаксис для C#. Вряд в Delphi по-другому.
PM MAIL WWW ICQ   Вверх
GASTON
Дата 15.1.2004, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.12.2003

Репутация: нет
Всего: нет



Vit
Интересно, а UNICODE добавили?
PM MAIL   Вверх
stab
Дата 15.1.2004, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



Цитата
Интересно, а UNICODE добавили?

В .net стандартный класс String является Unicode строкой, так что должен быть unicode по дефолту.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stron
Дата 15.1.2004, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Раз в Delphi 8, прослеживается Microsoft,
то может они сделали несколько вариантов построения exe-шников??(в зав. от требований систеы??)


--------------------
подписи нет
PM ICQ   Вверх
Vit
Дата 15.1.2004, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Какие варианты имеются ввиду?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Петрович
Дата 15.1.2004, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Цитата
о может они сделали несколько вариантов построения exe-шников??(в зав. от требований систеы??)

На сколько я понимаю в .NET нет таких файлов как exe-шники. Там вроде как приложение компилится в некий P-код (MSIL), который превращается в исполняемый файл уже самим .NET, и то лишь при первом запуске на слиентском компьютере. Этим они и достигают независимости от клиентской платформы.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
stab
Дата 16.1.2004, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



PE-exe есть, но это не более чем контейнер для MSIL, там всего одна инструкция родного x86 кода:
Код

jmp     ds:_CorExeMain



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
AntonSaburov
Дата 16.1.2004, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Цитата
На сколько я понимаю в .NET нет таких файлов как exe-шники. Там вроде как приложение компилится в некий P-код (MSIL), который превращается в исполняемый файл уже самим .NET, и то лишь при первом запуске на слиентском компьютере. Этим они и достигают независимости от клиентской платформы.

Именно так и есть - приложение компилится в некий байт-код, который уже интепретируется самой средой исполнения .NET - вообщем, прямо как JAVA.

Но есть вариант оптимизации - на самом деле код инетпретируется всего один раз. После этого он с помощью JIT (just in time) компилятора создает в памяти уже платформозависимый код, который при следующем вызове выполняет.

Поэтому то, что приложения на .NET исполняются медленнее, чем нативные программы, говорит о том, что компилятор в байт-код и JIT у них не такой уж и супер.

Про независимость от копьютера - думаю, что Майкрософт стремится к этому всеми силами, но только не в смылсе независимости от ОС. Думаю, что Майкрософт хочет поставить Винду (а следующая Винда должна работать именно под .NET) на всевозможные компьютеры.

В пику JAVA.
PM MAIL WWW ICQ   Вверх
stron
Дата 17.1.2004, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Я имел ввиду присоединение библиотек.
Как в vc6 статические библиотеки, динамические.....





--------------------
подписи нет
PM ICQ   Вверх
stron
Дата 17.1.2004, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Это я к расширяемости .Net
И вообще как она расширяется??
Расширяется исполняемая среда или всё пихается в IL файл??


--------------------
подписи нет
PM ICQ   Вверх
Wowa
Дата 19.1.2004, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



ИМХО ориентация Делфи под .NET это такой шаг, который в состоянии вообще все силы и языки в мире программирования переставить местами. Неизвестно, что будет завтра и что будет в спросе.

ИМХО, получается, что теперь работодатели не будут настаивать на знаниии какого-то конкретного языка программирования. Главное - это знание .NET будет.
PM WWW   Вверх
Петрович
Дата 19.1.2004, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Цитата
ИМХО, получается, что теперь работодатели не будут настаивать на знаниии какого-то конкретного языка программирования. Главное - это знание .NET будет.

Это вряд-ли. Существует еще работа в команде, сопровождение программ, и пр.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
foRaver
Дата 21.1.2004, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



На тему этого, предлагаю посмотрет небольшую презентацию Delphi 8 вo Flash. Низнаю, может кому интересно будет...

http://www.borland.com/delphi_net/demos/D8...UIOverview.html

Это сообщение отредактировал(а) foRaver - 21.1.2004, 18:31
PM MAIL WWW ICQ YIM   Вверх
Fedor
Дата 23.1.2004, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



foRaver Даже очень хорошая ссылка... Спасибо smile.gif


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Frikazoid
Дата 24.1.2004, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



А для мобильных устройств и КПК мона чего нить замутить?


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
December
Дата 25.1.2004, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



Цитата
http://www.borland.com/delphi_net/demos/D8...UIOverview.html

Блин, какая же кабанистая эта презентация!!! Сколко она весит?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Cheba
Дата 25.1.2004, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: нет
Всего: 62



8 054 031 байтов. :-)
PM MAIL ICQ   Вверх
Cheba
Дата 6.2.2004, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: нет
Всего: 62



Выдержка из стстьи о Borland CaliberRM:
Цитата
...
Более приоритетные в первую очередь получают новые возможности, в них реализуются наиболее передовые алгоритмы построения ПО. Естественно, приоритеты диктуются рынком, его потребномтями, а не волей аналитиков. На сегодня можно наблюдать следующую градацию:JBuilder, Delphi 8, CBuilder, паралельные продукты для .NET (C++BuilderX, JBuilderX, C#Builder и Delphi 8 for .NET)...

Значит, ли это, что будет и "обычный" Дэлфи, не для .НЕТ?
PM MAIL ICQ   Вверх
December
Дата 6.2.2004, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



Cheba Сказали же, в комплекте с D8 поставляется D7 smile.gif



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Cheba
Дата 7.2.2004, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: нет
Всего: 62



Так какого пишут про Д8? Уж тогда бы так и писали: "Д7, который при Д8 для .НЕТ" wink.gif
PM MAIL ICQ   Вверх
-=::BlackCat::=-
Дата 7.2.2004, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 12.7.2003
Где: растёт анаша?

Репутация: нет
Всего: 6



Народ, а можно будет использовать эти все навороты редактора D8 в D7?


--------------------
-=::BlackCat::=-user posted image

такой дуратцкий аватар потому как мой 100х100, а такие подгрузить нелзя, движок форума чо сам не может его переделать??  гррр, админ, форум косячит  
PM MAIL ICQ   Вверх
December
Дата 7.2.2004, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



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


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Frikazoid
Дата 7.2.2004, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



Так и ё! кто то мне скажет? там есть возможность программить под КПК(Корманные пк)?


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
Georg4
Дата 7.2.2004, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 961
Регистрация: 2.11.2002

Репутация: нет
Всего: 10



Обычно неудачная нечетная версия, да вроде у дельфи то же самое!


--------------------
Никто и никогда не должен решать одну проблему дважды
PM MAIL ICQ   Вверх
Frikazoid
Дата 7.2.2004, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



А по моему это заморочки Линуксоидов и только!


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
TheAviator
Дата 8.2.2004, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 28.9.2003
Где: Николаев-Киев

Репутация: нет
Всего: нет



ГыГ. Шаг в направлении к совместимости это хорошо... Но ИМХО интерфейс у старых Дельфей намного удобней чем у VS.net. Лучше бы Visual Studio под Delphi средой закосили smile.gif
З.Ы. Форма в дельфях раньше была на закладке отдельно от кода, и ее удобнее было редактировать, чем в VS, особенно большую, полноэкранную. А в VS с полноэкранной формой возникают некоторые проблемы... И VCL в виде закладок сверху мне нравится намного больше, чем в VS компоненты ....
PM MAIL WWW ICQ   Вверх
Medved
Дата 9.2.2004, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



А мне наоборот, такой интерфейс (VS) кажется удобней, просто к нему надо привыкнуть.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
<Spawn>
Дата 10.2.2004, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Поставил Дельфи 8(Быстро у нас пираты работают)) ).Пока что все очень нравится, но вот какая проблема. Создаю новый проект(VCL Forms Application), затем пытаюсь скомпилить на что мне выдает следущую ошибку: [Fatal Error] Project1.dpr(13): File not found: 'SysUtils.dcuil'


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 10.2.2004, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Нашел в чем дело - необходимо было указать перед всеми модулями
Код
Borland.Vcl.<ModuleName>

Сама Дельфи этого не делает. Видимо нужно где то что то прописать. Но вот где?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Vit
Дата 10.2.2004, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Моя делает. Думаю, что глюки беты.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 10.2.2004, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Цитата
Думаю, что глюки беты.
Хм, у меня на диске написано "полная cd версия".


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 10.2.2004, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



в Tools>Options>DelphiOptions>Library>Namespace prefixes стоит Borland.Vcl, но видимо это пространство имен не подставляется автоматически... буду еще искать.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 10.2.2004, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Что мне очень понравилось это огромнейший хелп, сделанный в виде MSDN. Класс!!!


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 10.2.2004, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



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


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
-=::BlackCat::=-
Дата 10.2.2004, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 12.7.2003
Где: растёт анаша?

Репутация: нет
Всего: 6



Цитата
Цитата
Думаю, что глюки беты.
Хм, у меня на диске написано "полная cd версия".

я год назад в питере видел DOOM III полная версия стаяло, но ведь кождому ясно что это не так


--------------------
-=::BlackCat::=-user posted image

такой дуратцкий аватар потому как мой 100х100, а такие подгрузить нелзя, движок форума чо сам не может его переделать??  гррр, админ, форум косячит  
PM MAIL ICQ   Вверх
Sergey T.
Дата 26.3.2004, 16:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Допустим, при установке делфи вносит в NET свои компоненты, и это причина малого экзэшника, но тогда как на счёт переносимости программ, и будут ли они, даже со стандартными "кнопками" работать на системах без NET?

Нет - пробовал: создал проект (VCL forms) - без .net не работает. Следует понимать D8 - система для разработки исключительно .net приложений. Так что D8 хорошо, а D7 лучше (по крайней мере пока)
  Вверх
Гость_Dexter
Дата 14.4.2004, 07:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











"В новой Дельфе не будет указателей " - как вообще, даже указателей на струтуры или это касается только Поинтеров.
  Вверх
Vit
Дата 14.4.2004, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Вообще указателей


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
NiJazz
Дата 14.4.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Vit
Цитата
Вообще указателей

А это хорошо или плохо?
PM MAIL   Вверх
Vit
Дата 14.4.2004, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Плюсы:
- программирование становится более простое для обучения
- резко снижается вероятность ошибок типа считывания непонятно чего из памяти или записи по случайному адресу какого то мусора, что резко увеличивает общую устойчивость програм, снижает вероятность разрушения программы и системы в целом при ошибках
- возможность автоматического разрушения объектов и освобождения распределённой памяти, т.е. больше не надо беспокоиться о вызовах Free и Destroy, утечки памяти более будут не актуальны.
- более высокий уровень абстрагирования от железа, под .net уже не играет значения 32 битный процессор или 64 битный или 1024 битный, программа будет работать используя на полную возможности процессора без какой-либо перекомпилляции.

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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Петрович
Дата 16.4.2004, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Цитата
Вообще указателей


А как-же PChar?

Т.е. в D8 нет возможности использования существующих DLL в интерфейсе которых используется PChar?

А как-же WinAPI - его использование в .NET тоже недопускается? Ведь там сплошь и рядом PChar.

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

Меня терзают смутные сомнения по поводу автоматически выполняющихся Free и Destroy.
Иногда в Destroy приходится делать действия которые должны выполняться во вполне определенные моменты времени, а не тогда когда компилятору или RTL покажится удобнее.

Цитата
- более высокий уровень абстрагирования от железа, под .net уже не играет значения 32 битный процессор или 64 битный или 1024 битный, программа будет работать используя на полную возможности процессора без какой-либо перекомпилляции.

А как это связано с отсутствием указателей?



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Vit
Дата 16.4.2004, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата
А как-же PChar?

Т.е. в D8 нет возможности использования существующих DLL в интерфейсе которых используется PChar?



Ну как ты знаешь и когда переходили с 16 на 32 разрядную платформу были специальные thunk для вызова 16 битного кода, здесь по моему что-то подобное. WinAPI вызываются, но параметры передются как string вместо PChar...


Цитата
Меня терзают смутные сомнения по поводу автоматически выполняющихся Free и Destroy.
Иногда в Destroy приходится делать действия которые должны выполняться во вполне определенные моменты времени, а не тогда когда компилятору или RTL покажится удобнее


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


Цитата
А как это связано с отсутствием указателей?


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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Girder
Дата 15.5.2004, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Кстати, скачал с WinUpdate, потдержку дополнительных языковых плагинов для Net.Fram. - прикольно, в Delphi 8 многие пункты(и подсказки) стали на русском.

Это сообщение отредактировал(а) Pegas - 17.5.2004, 23:34


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Medved
Дата 17.5.2004, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



М
 
2Girder Ваш предыдущий топик перенесен сюда: http://forum.vingrad.ru/index.php?showtopic=23084

Впредь придерживайтесь пожалуйста правила форума: http://forum.vingrad.ru/index.php?s=&act=SR&f=27




--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Maverick
Дата 22.5.2004, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Народ, я зверею...... В-первые в жизни не пошел на рынок, а скачал с Delphi 8.0 сайта Borland.... триальную версию.... они сами виноваты, завтра пойду на рынок... Судите сами устанавливаю 4 час.... запрашивает апдейты, апгрейды, дополнительные сервисы.... кроме того, что я 120 метров с их сайта скачал, так еще 40 уже с других.... Причем инструкции на грани фантастики....

Объясните мне чего она еще хочет? Последний .NET скачал, сервис-пак к винде поставил, к интернет-експлоер суперпоследний..... зачем-то IIS просила - поставил..... забодался уже.... А она даже к инсталяции не приступает, просит Visual J# какой-то..... счас его скачаю, а завтра пойду к пиратам.... У всех так было? notify.gif


--------------------
smile
PM ICQ GTalk   Вверх
x77
Дата 22.5.2004, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: нет
Всего: 22



Maverick, я его щас качаю wow.gif

мда...


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
<Spawn>
Дата 22.5.2004, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: нет
Всего: 64



Maverick Ни чего такого не было. Наверное потому, что уже все стояло smile.gif

P.S. У меня пиратская версия
Добавлено @ 13:59
Только вот в вин 2003 у меня некоторые проблемы есть - вылетает с ошибкой при использовании некоторых компонентов. Я думаю может .NET Framework не та версия стоит?

Это сообщение отредактировал(а) <Spawn> - 22.5.2004, 14:02


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
p0s0l
Дата 22.5.2004, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



А насчет D9 что-нить слышали ? Вроде там будет полноценная поддержка WinAPI... Хотя что под этим понимается ? В D8 тоже как я понял, можно юзать WinAPI...


--------------------
С уважением, г-н Посол.
PM   Вверх
Maverick
Дата 23.5.2004, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Злости больше нет..... за ночь докачал еще метров 100..... Но.... Оставляет приятные впечатления... Очень удобный инспектор объектов, окно кода - браво.... Палитра компонентов изуродована зачем-то... Разбираемся.... Ни один из старых проектов не открылся - это минус, но чувствуются горизонты - это плюс...
Добавлено @ 12:02
Похоже придется посещать и другую часть форума.... .NET smile.gif


--------------------
smile
PM ICQ GTalk   Вверх
Girder
Дата 24.5.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Это цветочки, когда начнеш программировать в D8(или переписывать ране написанные под D8) - злости прибавится.

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



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 24.5.2004, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Я так понимаю, пацаны, впечатления... не очень sad.gif

А какие требования по железу?
PM MAIL   Вверх
Vit
Дата 24.5.2004, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: нет
Всего: 207



Цитата
А какие требования по железу?



Такие же как для всего под .net - нужно не меньше 1GHz+256Mb


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Maverick
Дата 24.5.2004, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



У меня дома 1000, 128... на поворотах притормаживает, но терпимо...

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


--------------------
smile
PM ICQ GTalk   Вверх
Girder
Дата 24.5.2004, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Цитата
это было нехорошо уже под 5-ой....

Ну не знаю, хорошо-плохо - мне некоторые вещи проше написать
на ассемблере...

Цитата
Такие же как для всего под .net - нужно не меньше 1GHz+256Mb

Будите смеятся, но у меня дома встал на P233MMX+512Mb
и WinXP(MOfficeXP ...), и D8net.

Т.ч. мой совет >450MHz и >=512Mb.(а 256Mb - будет маловато и для 1Ghz)
Для Celeron,Duron - друдновато дать совет(проше их выкинуть)


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
-=::BlackCat::=-
Дата 25.5.2004, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 12.7.2003
Где: растёт анаша?

Репутация: нет
Всего: 6



как ты умудрился к 233 512 рама прикрутить? withstupid.gif


--------------------
-=::BlackCat::=-user posted image

такой дуратцкий аватар потому как мой 100х100, а такие подгрузить нелзя, движок форума чо сам не может его переделать??  гррр, админ, форум косячит  
PM MAIL ICQ   Вверх
x77
Дата 25.5.2004, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: нет
Всего: 22



-=::BlackCat::=-, подогнал напильником ;)



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Girder
Дата 27.5.2004, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Мамка поддерживает(В свое время купил 256+256 и поставил), а в чем проблемма?

Для Maverick:
-Перевел(переписал) код одной процедуры, раннее написанной на ассемблере, в паскаль.
Теперь программа скомпилированная как в D8, так и в D7 - просто тормоз.

Это сообщение отредактировал(а) Girder - 13.1.2005, 14:34


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Ramzes
Дата 7.6.2004, 03:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, у меня стоит и VS.NET и 8-я Делфя, компоненты в основном совместимые, и компоненты One Studio можно использовать и там и там, но у меня проблема. В Delphi в стандартном и в One объекте Connection не могу вызвать мастер для создания ConnectionString, его что ручками я должен набирать? мастер вызывается только в борландовском объекте. А в VS.NET вызывается в любом.
Подскажите пожалуста как настроить в Delphi 8 ConnectionString для не болдандовских объектов Connection.
  Вверх
Kesh
Дата 22.8.2004, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: нет
Всего: 54



А что, поговаривают скоро .NET 2.0 выйдет... Будет ли она встаиваема в Delphi 8?


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
DeeZ
Дата 26.11.2004, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Валялся у меня виртуальник (*.vcd) D8.
Поставил - поплевался на IDE, полюбовался на редактор кода, поклацал компоненты и снес все это нафиг, файл затер...
Вчера поставил Longhorn build 4074, удивился, что тормозит так и некоторые проги с 5-го раза запускаются...
Сегодня прочитал топик этот и серьезно задумался: для чего мне мозг даден smile
Буду опять D8 искать...
Хотя мне ентот .NET как-то не подуше, нездоровая тенденция просматривается в развитии Windows - все дальше и дальше уводят девелоперов от железа.
PM MAIL   Вверх
Atos
Дата 26.3.2005, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 2.9.2004
Где: Омск

Репутация: нет
Всего: нет



smile Я что-то не понял : "не поддерживает Win32". То есть если я скомпилирую на Delphi8 for .Net exeшник (пусть даже "Hellow, world") , то он, во-первых будет работать в два раза медленнее, чем у старых верси Delphi, а во-вторых, на компьютере без установленных .Net- библиотек вообще не запустится???
PM MAIL   Вверх
rsm
Дата 26.3.2005, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: нет
Всего: 62



Atos
Цитата
без установленных .Net- библиотек вообще не запустится???

Именно так! smile

2005-й Дельфи умеет компилить нормальные WinApi-вские проги, а Дельфи 8-ой нет.

Это сообщение отредактировал(а) rsm - 26.3.2005, 08:54
PM MAIL   Вверх
Cr@$h
Дата 7.4.2005, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Цитата(Vit @ 13.1.2004, 05:38)
работа с базами данных не претерпела
существенных изменений

На ECO и MDA технологию постепенно переходят, наверное. smile

Цитата(Cashey @ 13.1.2004, 19:58)
QUOTE
Так скажу сразу - нормального help нет
Надеюсь в финал релизе этот недостаток исправят.

Цитата(cully @ 14.1.2004, 00:33)
может не все заметели, что оболочка хелпа это ни что иное, как оффлайн просмоторщик MSDN, который идет вместе с MS Visual Studio, ... хм, без комментариев.

Цитата
Что мне очень понравилось это огромнейший хелп, сделанный в виде MSDN. Класс!!!


Они новый формат help'а. a la КАК и MSDN. Раньше был WinHelp, HTMLHelp. Теперь этот формат. И за это им большое спасибо.

Цитата(dr @ 14.1.2004, 00:45)
Допустим, при установке делфи вносит в NET свои компоненты, и это причина малого экзэшника, но тогда как на счёт переносимости программ, и будут ли они, даже со стандартными "кнопками" работать на системах без NET?

В D8 - не будут без .Net.

Цитата(rsm @ 26.3.2005, 08:52)
2005-й Дельфи умеет компилить нормальные WinApi-вские проги, а Дельфи 8-ой нет.

Но это уже совсем другая история...
PM MAIL ICQ   Вверх
Hidrag
Дата 13.4.2005, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: нет
Всего: 25



Прочитал все, но одного так и не догнал: то есть если я пишу к примеру прогу с использованием BDE скажем, или еще каких нибудь не микрософтских компонентов то как переносить такое приложение? Если Делфя сама дополняет ".нет" то как узнать чем? и как дополнить его на другом компе куда собираюсь ставить написаную в поте лица програмулинку? )))


--------------------
user posted image
PM WWW ICQ   Вверх
Cr@$h
Дата 13.4.2005, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Кроме дотНЕТА ничего требоваться не должно.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

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

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.3553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.