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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi - 8. Первые впечатления. Шаг вперёд - 2 шага назад 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

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

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

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

3. Оффтопить

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

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

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


 




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


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

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