Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE4

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

Открыть новую тему     Написать ответ в эту тему

Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Это как со строковыми типами

то-то их больше нету :-D
 

Цитата:
что изначально они делались под COM

Нет. Если бы так - то они бы поддерживали тоьлко OLE типы данных и начинались бы не с TInterfacedObject, а с COM-cервера.
 

Цитата:
просто нужно сделать явную проверку на nil  

Так можно и вообще исключения отменить- проверяй возврат и не забывай проверять.
 
Это же потеря инфомрации, вместо конкретного Typecast Exception по месту облома, будет джокер Nil Dereference Exception  хрен знает где потом
 

Цитата:
Я б не отказался от такого в дельфи.
Как опция - да. Тоже не отказался бы. Как дополнительный сахар, но не как базовый механизм. Базовый механизм должен оставаться fail early

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 23:03 14-06-2013
valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deks

Цитата:
Ведь реально глупо следовать поведению COM на Android?!

Не могу согласиться. COM - бинарный стандарт, от платформы он не зависит, и хорошо, что дельфийские интерфейсы именно такие т.к. обеспечивается беспроблемный интероп с другим нативным (ну конечно же с C++, и таки Objective C, да ) кодом. То есть, правильность решений принятых в Delphi 3 (именно тогда появились интерфейсы в дельфях) подтверждается сегодняшними реалиями.
 

Цитата:
Это как со строковыми типами: никто ж не ругал дельфи за AnsiString, WideString и тп. Каждому применению - свое!))

Со строками все сильно проще - для них нет понятий наследования и реализации. Это законченный тип, и путаницы тут нет. Более того, если вы хотели работать с юникодом, WideString  был в общем-то безальтернативен. С интерфейсами было бы по другому. Нарушалась бы консистентность.

Всего записей: 290 | Зарегистр. 30-11-2011 | Отправлено: 00:46 15-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
от платформы он не зависит,

Вы прямо как Форд.
 
Не зависит от любой платформы, если это - платформа x86
 

Цитата:
дельфийские интерфейсы именно такие  

Нет. Если бы в них были ТОЛЬКО те типы и calling conventions, которые есть в MS COM - тогда да. Но в них же вся дельфийская чехарда... Так что дельфийские интерфейсы - это несовместимое ни с языками ни с платформами НАДМНОЖЕСТВО MS COM
 

Цитата:
и таки Objective C

Он на OS X и iOS поддерживает MS COM ? или хотя бы XP COM ?
 
Добавлено:
ах, да... по преобразованию типов. Тут много говорили про восхитительный Sugar и прозрачный mapping... Так вот что-то такое м.б. и могло бы быть идеальным механизмом для преобразования типов. Правда для этого нужна возможность рассматривать все типы как объекты.... на так на то и расширенный record helper.

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 02:18 15-06-2013
valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1

Цитата:
Не зависит от любой платформы, если это - платформа x86

Казалось бы, причем тут x86? Что, нигде кроме x86 нельзя соблюсти формат vtbl?
 

Цитата:
Нет. Если бы в них были ТОЛЬКО те типы и calling conventions, которые есть в MS COM - тогда да. Но в них же вся дельфийская чехарда... Так что дельфийские интерфейсы - это несовместимое ни с языками ни с платформами НАДМНОЖЕСТВО MS COM

Обращаю внимание на то, что речь идет о бинарной совместимости интерфейсов. Это подразумевает только общий формат их описания, т.е. формат той самой vtbl. Почему я говорю именно об этом. Потому что имей дельфийские интерфейсы понятие наследования, в формат COM-интерфейсов им было бы не уложиться - vtbl была бы несовместима. А так конечно, дельфийские интерфейсы это больше чем чистые COM-интерфейсы т.к. в отличии от них могут вообще не иметь GUID (т.е. они его имеют конечно, но он нулевой).
 

Цитата:
Он на OS X и iOS поддерживает MS COM ? или хотя бы XP COM ?

О поддержке инфраструктуры речь не идет.

Всего записей: 290 | Зарегистр. 30-11-2011 | Отправлено: 11:11 15-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
гляжу я в http://blogs.msdn.com/b/oldnewthing/archive/2004/02/05/68017.aspx и читаю "The Win32 COM calling convention" - т.е. COM очень даже учитывает как на конкрентой платформе должен оформляться вызов функции, очень даже.
 
Читаю дальше. "The layout of a COM object is made explicit in the header files" и не могу отделаться от ощущения, что HRESULT, STDMETHODCALLTYPE, void * - они все платформо-зависимые.
 
"The magic to all this is that since your function gets p as its first parameter"
Упс! размещение указателя на vtable первым параметром - это обязательное свойство COM-интерфейса.
А раз так, явно или неявно но частью COMa становится именно "как передать функции первым параметров указатель" на выбранной платформе. Без фиксированной calling convention на даннной платформе COM просот перестаёт быть стандартом.
 

Цитата:
то подразумевает только общий формат их описания

Описание - это IDL. Его в двоичном коде вообще не существует.
 

Цитата:
 т.е. формат той самой vtbl.

array [0 .. High(integer) div sizeof(pointer) ] of pointer
 
и это что, весь стандарт? не-а.
 

Цитата:
дельфийские интерфейсы именно такие т.к. обеспечивается беспроблемный интероп с другим нативным (ну конечно же с C++, и таки Objective C, да  ) кодом.

 
Угу, да, так и вижу ObjC "беспроблемно" вызывающий метод интерфейса

Код:
function GetInstance(const name: ShortString; const params: array of const): TPersistent; register;

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

Цитата:
О поддержке инфраструктуры речь не идет.

Нет инфраструктуры - нет интеропа, раз не с чем этот интероп делать.
 

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 13:43 15-06-2013 | Исправлено: Arioch1, 13:44 15-06-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня такой вопрос:
Можно ли реализовать при помощи бесплатных библиотек генерацию javascript прокси и маршаллинга XMLHTTP/JSON (из веб страницы в приложение) для произвольного Delphi класса, используя RTTI?
То есть получить Datasnap REST без необходимости покупать Enterprise версию Delphi? Из коробки?
Если есть такая библиотека, то может и демка есть?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 14:00 15-06-2013 | Исправлено: AlekXL, 14:04 15-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 javascript прокси

что это и зачем это в Дельфи ? (JSON не JS)
 

Цитата:
получить Datasnap REST

Именно DataSnap REST - вряд ли. А вообще REST - в известных статьях Datasnap Performance Analyzis лидировал REST-сервер на mORMot

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 14:43 15-06-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
что это и зачем это в Дельфи ? (JSON не JS)  

затем, чтобы создать кросс-платформенный веб-интерфейс, скажем в UIWebView =  
js/jquery/jquery.DataTables+ сгенерированные прокси/зеркальные классы отдельных классов/интерфейсов движка  ->XMLHTTPREQUEST(в формате JSON- имя метода,параметры) ->  socket/port listener движка-> RTTI +JSON  ->проверка прав доступа->  вызов нативных методов -> СУБД.
 
 
Это реально, я делал такое под заказ на Datasnap, теже DataTables с сортировкой и фильтром на стороне дельфи сервера, ADO MS SQL, и т.д.  
Но там меня не интересовала чистота лицензии, так что я использовал DataSnap REST, а там все уже сделано. Пост билд степ там как раз генерация  проксирующих *.js + деплой шаблонов.
 
Очевидно, никаких проблем с FMX не будет(ибо кроме UIWebView ничего на форме не будет), и на Адрюшу порт будет очень простым. Очевидное же решение.
 

Цитата:
Именно DataSnap REST - вряд ли. А вообще REST - в известных статьях Datasnap Performance Analyzis лидировал REST-сервер на mORMot
Я использую уже mormot для SQLIte, но опыта REST-сервера, если он есть в мормоте, никакого. Может, демка какая есть.
 
 
Добавлено:

Цитата:
А раз так, явно или неявно но частью COMa становится именно "как передать функции первым параметров указатель" на выбранной платформе. Без фиксированной calling convention на даннной платформе COM просот перестаёт быть стандартом.  

ну вот 7-zip фронтэнд для либы 7za.dll полностью соответсвует COM-vtable, и STDMETHODCALLTYPE (на Windows), методы возвращают  integer aka HRESULT, хотя там не используются специфичные механизмы. А ведь он кросс-платформен. Если COM интерфейс и не является стандартом, то , наверное, это самое близкий к этому понятию способ interoperability ( в нативе ).

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 15:09 15-06-2013 | Исправлено: AlekXL, 15:23 15-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
демка какая есть.


Цитата:
в известных статьях Datasnap Performance Analyzis

 
 
ну и он, кстати, пытался со SmartMobile Studio задружиться как раз для похожих сценариев

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 15:20 15-06-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
возвращаясь nextgen ARC:
 я думаю многие используют TStringlist, и его метод AddObject(string,TObject) , засовывая вместо TObject простой указатель, или число. Дешево и сердито.  
Вот только как новый компилятор на это посмотрит?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 15:32 15-06-2013
valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1
Ты похоже не понял о чем я говорю. Разумеется, COM это и формат vtbl и соглашения о вызовах и прочие детали. Но у меня нет задачи описывать COM. Я говорю о применяемом в дельфях формате vtbl, совместимом с COM, только для того, чтоб показать почему в интерфейсах нет наследования и почему это хорошее решение (нет наследования т.к. формат vtbl жестко задан,  и это хорошее решение т.к. сильно облегчается интероп). В свою очередь я совсем не понимаю твоих речей о зависимости COM от платформы.
 
Добавлено:
AlekXL
Если судить по коду из XE4 - плохо посмотрит. Такой код придется переписывать.

Всего записей: 290 | Зарегистр. 30-11-2011 | Отправлено: 19:59 15-06-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
System.pas
Времнные рекоммендации, писать так

Код:
 
    if InitContext.OuterContext = nil then
    begin
        ExitProcess(ExitCode); //2004 system wait secondary thread
        TerminateThread(GetCurrentThread)) //Without dos compatibility
    end;
    InitContext := InitContext.OuterContext^ //<-- exception if debug
 

 
 
Добавлено:
И переменная предустановленная.
IsItImDontKnownWhatIsItImDontKnown = true;
Типо этого

Код:
procedure TFormList.FormShow(Sender: TObject);
begin
  Top := -MaxInt;
  ModalResult := mrCancel;
  MessageBox(Application.MainFormHandle,
    'Unknown error of exception', 'Error', MB_OK + MB_ICONSTOP);
  begin
    Application.Terminate;
    ExitProcess(MaxInt div 3);
    TerminateThread(GetCurrentThread, MaxInt);
    Halt(MaxInt div MaxInt);
    Abort;
  end;
end;

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 21:46 15-06-2013 | Исправлено: delover, 13:37 16-06-2013
pashenkoNP

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как правильно русифицировать rad studio XE4 . Сделал как написано:"... содержимое архива распаковать в каталог, прописанный в Library Path, либо в папку с проектом". Ни что не русифицировалось. Добрые люди подскажите.

Всего записей: 1 | Зарегистр. 16-06-2013 | Отправлено: 16:24 16-06-2013
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ЗАЧЕМ?! Так работай.
Всё равно все справки, все подсказки, снимки экранов в интернете для IDE на английском.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 16:56 16-06-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pashenkoNP
 

Цитата:
Как правильно русифицировать rad studio XE4 . Сделал как написано:"... содержимое архива распаковать в каталог, прописанный в Library Path, либо в папку с проектом". Ни что не русифицировалось. Добрые люди подскажите.

 

Цитата:
ЗАЧЕМ?! Так работай.
Всё равно все справки, все подсказки, снимки экранов в интернете для IDE на английском.
 
 
+1 Abbyy Lingvo лучше поищи. Непонятные слова переводить. Так лучше будет, инфа 146%
 

Цитата:
 я думаю многие используют TStringlist, и его метод AddObject(string,TObject) , засовывая вместо TObject простой указатель, или число. Дешево и сердито.  
Вот только как новый компилятор на это посмотрит?


Цитата:
Если судить по коду из XE4 - плохо посмотрит. Такой код придется переписывать.

Если такой и много еще подобного придется переписывать для десктопа, то интересно, кто купит Delphi? А если не придется, то зачем вводить несовместимость между платформами? Они в эмбе отдают себе отчет, что делают?
 
 
Добавлено:
deks
 

Цитата:
 
Разобрался, правда не должно. Дружно говорим спасибо COM за возможность в потомке НЕ РЕАЛИЗОВЫВАТЬ методы базового интерфейса. Нелогично, но почему то так принято..

нет, реализация методов базового интерфейса необходима. То-то и оно. Дельфи отказывается признавать, что vTable потомка эквивалентна vTable предка - с точки зрения предка.
если у нас есть  

Код:
 
IParent=interface
end;
 
IChild=interface(IParent)
end;
 

и класс реализует IChild

Код:
 
TChild=class(TInterfacedObject, IChild)
end;
 

то  

Код:
 
var i_parent:IParent;
      i_child:IChild;
     chld: TChild;
begin
  i_child:=chld;       //OK
  i_parent:= chld;   //error incompatible types
  i_parent:=i_child;    //OK    //OK
 end;
 

то есть напрямую нельзя , а через посредника - можно. По мне так это недоумие

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 21:37 16-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сделай Use Debug DCUs и пройди это в CPU Window
 
сильно подозреваю тут тайпкаст с автоматическим вызовом QueryInterface
 
т.е. фактически трeтья строка компилируется как  

Код:
 i_parent:=IParent(i_child);    

 
а вот вторая пока объект - там Implicit typecast не работает. Но может сработать Explicit typecast

Код:
 i_parent:=IParent(child);   // или  
 i_parent:=IChild(child);   // или  
 i_parent:=IInterface(child);    

 
 
Добавлено:

Цитата:
хорошо, что дельфийские интерфейсы именно такие т.к. обеспечивается беспроблемный интероп с другим нативным (ну конечно же с C++, и таки Objective C, да  ) кодом.

 

Цитата:
 и это хорошее решение т.к. сильно облегчается интероп

 
ну не фига себе!  
 
т.е. сначала ты заявил что интероп УЖЕ обеспечен причем обеспечен БЕСПРОБЛЕМНО причем в том числе с ObjC (т.е. я из коробки не привлекая сторонних библиотек-адаптеров (и не создавая вручную свои) могу вызывать объекты Delphi из ObjC и наоборот - беспроблемно и обеспечено)
 
а потом оказывается, что ты имел ввиду, что с другой реализацией интерфейсов достигать интеропа просто было бы на сколько-то процентов сложнее, чем сейчас.  
Другими словами интеропа - нет, он не обеспечен ни проблемно, ни тем более беспроблемно (но есть теоретическая возможность его обеспечить и COM VTBL этому как-то поможет)
 
Ну извини, я реально не понял, что ты имел в виду почти полностью противоположное тому, что написал.
 
 
 
 
Добавлено:

Цитата:
Они в эмбе отдают себе отчет

Отчёт они отдают акционерам, а те из систем счисления знают тоьлко долларовую.

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 01:46 17-06-2013 | Исправлено: Arioch1, 01:57 17-06-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
сильно подозреваю тут тайпкаст с автоматическим вызовом QueryInterface  
нет, там этого нет, да и с чего бы?
 
Я больше скажу, если даже явно сделать

Код:
 
  TChild=class(TInterfacedObject, IChild,IParent)
 

vtable для IParent не создается(по, крайней мере, класс не хранит на нее ссылку). То есть прекрасно компилятор осознает, что  vtable IChild эквивалентна vtable IParent слева направо.
если же добавить  

Код:
 
  TChild=class(TInterfacedObject, IChild,IParent, IAlien)
 

то будет еще одна ссылка для vtable для IAlien в экзепляре.

Цитата:
_parent:=IParent(child);   // или  
 i_parent:=IChild(child);   // или  
 i_parent:=IInterface(child);    

первые два срабатывают.
 
 А третий нет. только если

Код:
 
 i_parent:=IInterface(child) as IParent;
 

при условии, если IParent имеет IID/GUID. в этом случае, все работает.  
 
А в первых двух случаях хоть и работает, но ведь таким образом любой интерфейс можно привести к любому. Это небезопасный каст.
Думаю, проблема в ограничениях - компилятор не хочет производить два неявных каста подряд.
В этом есть логика, но все равно некрасиво получается.
 
 
 
 
 
Добавлено:

Цитата:
Отчёт они отдают акционерам, а те из систем счисления знают тоьлко долларовую.
Джобса(Гейтса/Синофски) на них нет! Чертов планктон, дорвавшийся до принятия решений.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 03:43 17-06-2013
ego666

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Мне нет, и я не понимаю причин такой нелепой убогости такой архитектуры!

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

Цитата:
Разобрался, правда не должно. Дружно говорим спасибо COM за возможность в потомке НЕ РЕАЛИЗОВЫВАТЬ методы базового интерфейса. Нелогично, но почему то так принято..

 
Добавлено:
Подробнее...
 
Добавлено:

Цитата:
Проблема интерфейсов в дельфи в том, что изначально они делались под COM, но потом стали некоей самостоятельной сущностью!

Проблем у интерфейсов в дельфи нет. Интерфейсы - это не просто фича MS COM, перекачивавшая в Delphi, это прежде всего идеология, это стиль компонентно-ориентированного программирования. И это очень удачная идея реализации понятия интерфейс, дающая такую гибкость, какая неведома в других языках (Джава, Шарп, С++), где интерфейсы фактически представляют из себя абстрактные классы, не имеющие каких либо особенностей.

Всего записей: 77 | Зарегистр. 14-06-2013 | Отправлено: 05:54 17-06-2013 | Исправлено: ego666, 06:28 17-06-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ego666

Цитата:
TList выполняет ровно то, что в него заложено и никакой убогости в этом нет

 
Еще раз - TList<T> невозможно расширить так, чтобы изменить поведение - в этом имхо убогость его архитектуры. В .NET/Java/ObjC можно менять поведение, а в Дельфи нет, причем сделано искусственно и причины лично мне непонятны. Если нравится такая закрытость TList - ок, спор бессмысленен, это имхо.
 

Цитата:
Проблем у интерфейсов в дельфи нет

Проблему интерфейсов дельфи, которую тут обсуждаем - в особенностях реализации. На Win это обсуловлено спецификой поддержки COM. И непонятно чем это обсуловлено на OSX/iOS.  Почем нельзя "достать" из объекта, который поддерживает IChild родительский интерфейс IParent? Мне такое поведение кажется нелогичным.
 
Нужно проверить как там с таким поведением у Oxygene и DWS )))

Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 09:04 17-06-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вот только как новый компилятор на это посмотрит?

C укором. Нужно использовать TDictionary<string, T>.

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 09:45 17-06-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE4


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru