Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.28;
Скачать: CL | DM;

Вниз

Вопрос о распространнёности Delphi в мире.   Найти похожие ветки 

 
vuk   (2002-02-14 21:07) [40]

to VuDZ:
При желании все это легко реализуется. Я серьезно.
Я понимаю, что с STL это сделать гораздо проще(за счет шаблонов), но не надо преподносить как истину невозможность сделать это средствами OP и без шаблонов. :o)

P.S. У шаблонов, к стати говоря, не только плюсы имеются.


 
VuDZ   (2002-02-14 21:18) [41]

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


 
kaif   (2002-02-14 21:36) [42]

Продвинутость C/C++ в США определяется только тем, что Государственный Комитет по C/C++ это здание размером с ООН. Страх перед государством, завтрашним днем, а также государственная политика США, не желающего зависеть от совершенно частной компании Borland приводят к тому, что C++ столь распространен в США. Понятно, что компании, "осваивающие" денежки государственных заказов вынуждены писать на С++. Напротив, независимые компании, средний и мелкий бизнес (а они как в США, так и в России создают около 90% рабочих мест) часто предпочитают работать на Delphi и рейтинги показывают, что продукты Borland (Delphi, C++ Builder и Java Builder) - самые покупаемые в мире.
Мало кто знает, что InterBase был принят военным ведомством США как основная и наиболее оптимальная СУБД по параметрам надежности, цены и качества. Хотя тут на форуме с трудом найдешь человека, который бы считал InterBase за "серьезный" продукт. Просто народ в России о себе много воображает, а серьезных программ не пишет. И думает, что если бы на C++ работал, то писал бы...
Если кто считает 1с за серьезную систему, то он просто с ней в жизни не сталкивался, значит. Один их интерпретатор, делающий 100тыс жалких циклов на моём компьютере в 650MHz чего стоит! А если считать критерием засилие продукта, то Visual Basic и MP3 player-ы - самый серьезный продукт на Земле!


 
vuk   (2002-02-14 21:36) [43]

>одно дело использовать то, что позволяет язык, его идеология, а
>другое дело изобретать велосипед.
Позвольте, если я на OP напишу класс все это дело реализующий, ну или не это, а там всякие коллекции-итераторы, то это будет средством для данного языка неестественным? Ерунда какая-то у Вас получается... Или Вы считаете, что эти вещи естественны только тогда, когда реализованы при помощи шаблонов?
У разных языковых средств разные подходы к решению схожих проблем и что в одном случае будет неестественным, в другом будет делаться легко и непринужденно. Хотите пример?

function CreateForm( ClassRef : TFormClass ) : TForm;
begin
Result := ClassRef.Create(Application);
end;

Смысл, надеюсь, понятен? Если нет, то поясню, что функция создает экземпляр класса, который ей передается в качестве параметра.
Сколько у Вас займет построение того же самого (по смыслу) на C++?




 
Suntechnic   (2002-02-14 21:53) [44]

>kaif © (14.02.02 21:36)
Вот тот, первый абзац твоего выступления, это была выдержка из доклада Лернида Ильича Брежнева XXIV съезду КПСС? Копирайт бы хоть поставил :)


 
VuDZ   (2002-02-14 21:53) [45]

sorry, я наверно в конец отупел к концу дня, так как не понял смысл этого примера... поясните, плиз


 
wicked   (2002-02-14 22:02) [46]

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


 
VuDZ   (2002-02-14 22:03) [47]

Вы это имели в виду:

class A
{
public :
A(int _i) {
i = _i;
};
~A(){
};
int i;
};

template <class T>
void func (T *&tt)
{
tt = new T(0xff);
}

void main()
{
A *a = NULL;
func(a);
}


 
VuDZ   (2002-02-14 22:04) [48]

PS а почему не сохраняется форматирование кода?


 
wicked   (2002-02-14 22:05) [49]

2 VuDZ ©
похоже.... но я не играю в language wars.... я вырос на pascal... так что он для меня почти родной язык... а всё остальное можно написать на ассемблере.... :)


 
VuDZ   (2002-02-14 22:07) [50]

слушай, объясни человеческим языком что делал тот кусок кода.
вызывает конструктор некоторого (или любого?) класса? или как...


 
vuk   (2002-02-14 22:07) [51]

Попробую... Мы хотим создать экземпляр класса, но какого конкретно, на момент компиляции мы не знаем - это определяется только в момент выполнения.
В C++ необходимо будет реализовывать фабрики классов, каждая из которых может создавать объекты определенного класса. Далее, я думаю, Вам должно быть понятно.

В Object Pascal это делается иначе, поскольку есть такая вещь, как ссылки на класс (метаклассы). Если есть ссылка на класс, можно свободно вызывать через нее методы класса и конструкторы. Вызов нужного конструктора обеспечивается за счет механизма виртуальных конструкторов. Кстати, на основе этого механизма вся VCL построена.
Как кто-то однажды сказал, в OP "любой класс сам себе фабрика", но это не совсем точно, поскольку возможности несколько шире.


 
wicked   (2002-02-14 22:10) [52]

vuk ©
браво.... вот что значит трезвая голова против пьяной....


 
VuDZ   (2002-02-14 22:18) [53]

мда, пива было много, но вроде я что-то понял (чуть больше эпсилона :> )
так а чем приведённый мной код не устраивает условию?


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

и чем это отличается от С++ ?


 
Suntechnic   (2002-02-14 22:21) [54]

>vuk © (14.02.02 22:07)
Всё правильно ты заметил про фабрики классов в С++, которые реализуют точно такой же механизм как ты описал в своём примере. В С++ понятие виртуальный конструктор отсутствует, но всё это запросто реализуется с использованием фабик классов(их именно и имеют ввиду когда говорят о виртуальных конструкорах в С++). Разница принципиальная лишь в том, что в Object Pascal за тебя это уже кто-то написал, а в С++ ты сам волен это сделать. Этот флейм (С++ vs. Object Pascal) стар как мир и ничего нового вы тут не придумаете, так что советовал бы вам на этом и закончить.
...я всегда говорил и опять повторяю, главное это башка на плечах, а используемый язык это дело вкуса... написать можно всё что угодно и на чём угодно...


 
vuk   (2002-02-14 22:23) [55]

to VuDZ:
>так а чем приведённый мной код не устраивает условию?
Класс на момент компиляции известен.


 
wicked   (2002-02-14 22:24) [56]

2 Suntechnic ©

> ....используемый язык это дело вкуса... написать можно всё что
> угодно и на чём угодно...

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


 
VuDZ   (2002-02-14 22:24) [57]

Так-с... я пшёл перечитывать классику, а то что-то я торможу
всех с наступившим и приятного вечера :>


 
vuk   (2002-02-14 22:30) [58]

to Suntechnic:
>Разница принципиальная лишь в том, что в Object Pascal за тебя
>это уже кто-то написал, а в С++ ты сам волен это сделать.
Разница принципиальная только в том, что это разные языки. А механизм ссылок на класс не имеет ничего общего с фабриками классов. Даже сходства нет. Просто это пример задачи которая решается в разных языках разными способами. О чем и шла речь. И никакого флейма. :o)

>...я всегда говорил и опять повторяю, главное это башка на
>плечах, а используемый язык это дело вкуса... написать можно
>всё что угодно и на чём угодно...
Вот под этим готов подписаться! :o)


 
Suntechnic   (2002-02-14 22:41) [59]

>vuk © (14.02.02 22:30)
Ну ты нудный :)

>А механизм ссылок на класс не имеет ничего общего с фабриками классов.

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


 
Vuk   (2002-02-14 22:49) [60]

>Так может всё-таки есть что-то общее или какое-то сходство?
Ага. Решаемая в данном случае задача. ;o) Но это к языку не относится.

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


 
Suntechnic   (2002-02-14 22:57) [61]

>Vuk © (14.02.02 22:49)
Ну а я тебе о чём? :)


 
copyr25   (2002-02-14 23:04) [62]

Во Fellomena, заварила кашу:))


 
Oleg Gashev   (2002-02-14 23:05) [63]

Какая разница на чем писать? Главное, чтоб руки из мозгов росли:))

А мне на Delphi удобнее.

Chess Software Development Project: http://EcwChess.narod.ru


 
VuDZ   (2002-02-14 23:10) [64]

а мне на асме... приятней и понятней... и ни каких классов...


 
False_Delirium   (2002-02-15 02:11) [65]

Глава Sun Microsystems после поездки в Москву на пресс-коференции заявил : "Русские программисты в алгоритмизации оставили далеко позади все остальные страны. В то время как для повышения производительности мы улучшали вычислительные ресурсы(благо еть такая возможность), они разрабатывали новые алгоритмы."


 
VuDZ   (2002-02-15 03:38) [66]

продолжаем-с флейм:
class CBase
{
public:
virtual void Init(int n) = 0;
virtual ~CBase(){};
};

class CA : public CBase
{
void Init(int n)
{
printf("Class A - %i\n", n);
}
virtual ~CA(){};
};
class CB : public CBase{
void Init(int n)
{
printf("Class B - %i\n", n);
}
virtual ~CB(){};
};

CBase* create(void)
{
switch(rand()%2)
{
case 0: return new CA();
case 1: return new CB();
}
return NULL;
}

void Do(void){
CBase *ptr = create();
ptr->Init(rand());
}

void main()
{
Do();
Do();
Do();
Do();
Do();
Do();
Do();
getch();
}


для более сложных вариантов надо использовать нечто вроде CRuntimeClass, IsKindOf()


 
Andrey   (2002-02-15 11:38) [67]

Хотя переичсление "Серьезных программ" на Delphi вроде закончилось, мне хотелось бы вспомнить еще один проэкт
ЛИГА:ЗАКОН http://www.liga.kiev.ua/about/
написаный на Delphi

Приведу небольшую цитату:
"Сегодня системы ЛИГА:ЗАКОН успешно используют в Администрации Президента Украины, в Кабинете Министров Украины, в Национальном Банке Украины, в Государственной налоговой администрации, в различных министерствах и других органах исполнительной государственной власти и местного самоуправления Украины. Среди наших абонентов - многие иностранные представительства, посольства, многочисленные коммерческие структуры."

Организация в которой я работаю тоже пользуется Лигой. Мне только один раз удалось "свалить" Лигу и то только тогда когда я задался целью это сделать.


 
VuDZ   (2002-02-15 11:57) [68]

ну, то на сколько легко завалить софт есть показатель привизны/прямоты рук программёров,а не языка...


 
Andrews   (2002-02-15 12:00) [69]

> All

Не забывайте что отечественные пользователи и программисты всегда используют самые лучшие и новейшие версии программных продуктов, потому что они не платят за них деньги, на тех. поддержку им по большому счету наплевать и единственным критерием выбора остается качество и удобство работы (+ crack). Так что если Delphi попадет в число "этих" продуктов это говорит о многом...


 
vuk   (2002-02-15 15:14) [70]

to VuDZ:
Это Вы к чему? :-/ В Вашем примере случайным образом создается либо экземпляр CA либо экземпляр CB. То есть все варианты создаваемых классов на момент компиляции, опять-таки, будут известны.


 
VuDZ   (2002-02-15 16:17) [71]

кхм. то есть Вы хотите вызывать неизвестный конструктор неизвестного класса, описание которого нигде нету - то есть невозможно создать _любой_ класс. Просто потому, что неизвестно
какой конструктор вызывать - объект может иметь их несколько, и вообще неизвестно какие аргументы у этого конструктора.
По конкретнее если можно, а мы обмозгуем-с :>


 
Юрий Зотов (M)   (2002-02-15 17:11) [72]

VuDZ © (15.02.02 16:17)

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

В примере vuk"а это параметр ClassRef. Вы передаете функции ссылку на любой класс, экземпляр которого Вы хотите создать, она вызывает конструктор именно этого класса и возвращает ссылку уже на экземпляр этого класса.

В более общем виде можно написать даже так:

function CreateAnyComponent
(AClass: TComponentClass; AOwner: TComponent): TComponent;
begin
Result := AClass.Create(AOwner)
end;

И пример использования:
EditForm := CreateAnyComponent(TForm, Application);
StringEditor := CreateAnyComponent(TEdit, EditForm);
TextEditor := CreateAnyComponent(TMemo, EditForm);


 
vuk   (2002-02-15 17:32) [73]

to VuDZ:
>то есть Вы хотите вызывать неизвестный конструктор неизвестного
>класса
Почти. Имеется в виду возможность вызова конкретного конструктора неизвестного класса. В Object Pascal есть виртуальные конструкторы (а также виртуальные метода класса). У них, как и у виртуальных методов экземпляра, при введении формируются ограничения на состав параметров.
Например, у TComponent есть такой виртуальный конструктор:

constructor Create( AOwner : TComponent ); virtual;

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

Поэтому, если ссылка на класс, определена так:
TComponentClass = class of TComponent;
то можно быть уверенным, что имея такую ссылку, можем вызывать вышеописанный конструктор.

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



 
VuDZ   (2002-02-15 18:09) [74]

спасибо за объяснение.
я думаю ещё повоюем-с :>
(война - это единственное развлечение королей. доступное простым людям :> )
всего хорошего


 
vuk   (2002-02-15 18:12) [75]

to VuDZ:
Какая ж это война-то? Мне казалось просто пообщались и все...


 
VuDZ   (2002-02-15 18:14) [76]

ну да :)

PS война в хорошм смысле слова :), что бы выяснить некоторые моменты и пр.


 
iZEN   (2002-02-16 11:10) [77]

/** vuk © (14.02.02 22:07):
<...>Мы хотим создать экземпляр класса, но какого конкретно, на момент компиляции мы не знаем - это определяется только в момент выполнения.<...>
В Object Pascal это делается иначе, поскольку есть такая вещь, как ссылки на класс (метаклассы). Если есть ссылка на класс, можно свободно вызывать через нее методы класса и конструкторы. Вызов нужного конструктора обеспечивается за счет механизма виртуальных конструкторов.<...>
Как кто-то однажды сказал, в OP "любой класс сам себе фабрика", но это не совсем точно, поскольку возможности несколько шире.
*/

Я могу дополнить: "в OP "любой класс сам себе фабрика" только на этапе компиляции и последующего исполнению -- потом это уже не имеет значения, поскольку приложение откомпилировано, скомпоновано и "заморожено" в EXE-файл(использование для этого DLL требует разработки собственного "уникального" механизма Plug-in или же "Добро пожаловать в COM").

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

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

Пусть у нас имеется интерфейс:

public interface Figure {
public void draw(Canvas cnv);
}


Java-разработчику влом создавать классы фигур(точка, линия, окружность, овал, прямоугольник, полигон), реализующие интерфейс Figure. Поэтому он выпустил приложение БЕЗ графической библиотеки.
Что ж, если мне известен интерфейс Figure, то я могу без труда реализовать его для любой своей фигуры, а в программе указать её class-файл с кодом.

public class Circle implements Figure {
...
draw(Canvas cnv) {
cnv.drawOval(...);
}
...
}


А вот отрывок кода программы того программиста:

/** Редактор */
public class GraphEditor {
/*
* Метод, где в принципе неизвестен тип реальной фигуры
* на этапе компиляции
*/
private void paint(Figure f) {
f.draw(this.getCanvas());
}

/* "Точка входа" в приложение */
public static void main(String[] args) {
Editor ed = new Editor(..);

// Типичное использование авторских фигур:
//Oval ov = new Oval(..);
//Square sq = new Square(..);
//ed.paint(ov);//Вывод Овала
//ed.paint(sq);//Вывод Квадрата

/* Внимание! Динамическая загрузка класса и выполнение кода. */
try {
/*
* Загружаем любой новый класс,
* имя которого указано в параметрах командной строки.
* Например: args[0] содержит "mypackage.Circle"
*/
Class c = Class.forName(args[0]);

/*
* Создаём экземпляр класса...
*/
Object o = c.newInstance();

/*
* Нисходящее приведение типа к интерфейсу Figure...
*/
Figure etc = (Figure)o;

/*
* Рисуем фигуру...
*/
ed.paint(etc);//Вывод фигуры без перекомпиляции!!!

catch(Exception noex) {//Не обрабатываем для простоты
}
}
}


Я привёл только "вершину айсберга". В Java есть развитый Reflection API, методы которого могут "вытрясти" всю подноготную любого класса(представленного без исходника) и дать возможность "попользоваться" им по полной программе БЕЗ ПЕРЕКОМПИЛЯЦИЙ приложения.
Попробовали бы Вы проделать то же самое в приложении на ObjectPascal -- придётся свою Delphi писать...


 
Nemesis   (2002-02-16 13:02) [78]

>iZEN (16.02.02 11:10)
А это правда, что в Microsoft отказались от поддержки Java в XP?


 
iZEN   (2002-02-16 13:39) [79]

Да, правда!
Последняя MS JVM -- это урезаный аналог версии SunJRE1.1.4, использовалась до Windows 2000 включительно.
Так как сейчас на дворе уже не 1997 год, то использование Java1 не имеет большого значения даже в IE (из-за скудного набора API Java1 и низкого быстродействия). То есть MS давно отказалась от продвижения Java, а Java2 JVM они так и не выпустили.

Они[MS] её[Java] позиционируют в .Net как новый J++, легко переводящийся в C#, со всеми вытекающими отсюда ограничениями среды .Net и Java1.
А на сайте java.sun.com можно загрузить JRE последней версии под WindowsXP, ссылка: http://java.sun.com/getjava/download.html. Я пока не пробовал устанавливать JRE1.4 под WinXP, но версия JRE1.3.1 работает на ура (работают Java1/Java2-апплеты в IE6 и приложения в JAR-Executable запускаются из Проводника как EXE)..

Вот ещё цитаты :), Compulenta.ru:
1. "Компания Microsoft объявила о выходе бета-версии Java Language Conversion Assistant, программы для преобразования Java-кода в код C# для использования его на платформе .NET. Продукт полностью автоматизирован, интегрируется в Visual Studio .NET, следовательно, наследует все возможности этой среды разработки."
2. "Компания Halcyon Software ( http://www.halcyonsoft.com) объявила о выходе бета-версии iNET - первой коммерческой реализации технологии .Net на языке Java. В iNET входит утилита IL2JAVA, которая конвертирует программы из байт-кода (IL) .Net в байт-код Java, а также полную библиотеку классов .Net. "Разрабатываете под .Net, внедряете повсюду", - перефразировал слоган Java глава Halcyon Дон Си"


 
Nemesis   (2002-02-16 14:08) [80]

Вот так они (MS) борятся с тими, кто им неподвласны ...
Это и есть продвижение на рынок своих продуктов за счет чужих (Java). И где тут честный бизнес!



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

Текущий архив: 2002.03.28;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.009 c
1-90925
User_
2002-03-14 08:50
2002.03.28
Есть TListBox. Есть 2 строки в нем.


1-90832
Denvor
2002-03-15 21:45
2002.03.28
Excel2000


1-90852
vovaS
2002-03-11 18:52
2002.03.28
Как считать выражение с заданной точностью?


1-90935
AlexMey
2002-03-14 11:57
2002.03.28
Есть ли в Delphi возможность работы с регулярными выражениями?


7-91091
CS
2001-12-19 09:29
2002.03.28
LPT-порт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский