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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А ЧО, люди еще пользуются Индями? Есть же ICS..

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ли в Дельфи как нибудь без явного платформозависимого кода объявить тип - указатель на метод, без указателя на экземпляр?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 18:09 03-07-2013
NickNNN



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL, а задача какая вообще стоит?
 
Когда мне нужно было передать в процедуру ссылку на другую процедуру, я передавал ссылку на объект, а на событие объекта вешал нужную мне процедуру.

Всего записей: 156 | Зарегистр. 25-11-2008 | Отправлено: 18:28 03-07-2013
VadimLou



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
type TShowMessage = procedure(const s: string);
var ShowMessageProc = TShowMessage;
...
begin
  ShowMessageProc := @ShowMessage;
...
  ShowMessageProc('Hello AlekXL');
...

Всего записей: 702 | Зарегистр. 22-07-2004 | Отправлено: 09:21 04-07-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VadimLou это не то. Я же написал: указатель НА МЕТОД, на не на простую процедуру.
NickNNN

Цитата:
Когда мне нужно было передать в процедуру ссылку на другую процедуру, я передавал ссылку на объект, а на событие объекта вешал нужную мне процедуру.  
В том, что ты написал, нет смысла.  
--
я поясню: мне нужен указатель на функцию-член в стиле крестов
 
 
 
 

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 11:20 04-07-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
 
Не оно: _http://docwiki.embarcadero.com/RADStudio/XE4/en/Run-Time_Operations_on_Types#Invoking_Methods ?

Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 11:36 04-07-2013
valgreesh



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

Код:
 
Type
 
 TStrFuncProc = Function(Self : Pointer; Const AParam : String) : String;
 
 TObj = Class
 
  Function StrFunc(Const AParam : String) : String;
 
 End;
 
Function TObj.StrFunc(Const AParam : String) : String;
Begin
 
 Result := Format('Self: %p, Param : "%s"', [Pointer(Self), AParam]);
 
End;
 
...
 
Var
 
 StrFunc : TStrFuncProc;
 
Begin
 
 StrFunc := @TObj.StrFunc;
 
 ShowMessage(StrFunc(NIL, 'Hello'));
 
---------------------------
project1
---------------------------
Self: 00000000, Param : "Hello"
---------------------------
OK    
---------------------------
 

 
Вариант 2:

Код:
 
Type
 
 TStrFuncProc = Function(Const AParam : String) : String Of Object;
 
 TObj = Class
 
  Function StrFunc(Const AParam : String) : String;
 
 End;
 
Function TObj.StrFunc(Const AParam : String) : String;
Begin
 
 Result := Format('Self: %p, Param : "%s"', [Pointer(Self), AParam]);
 
End;
 
...
 
Var
 
 StrFunc : TStrFuncProc;
 
Begin
 
 TMethod(StrFunc).Data := NIL;
 TMethod(StrFunc).Code := @TObj.StrFunc;
 
 ShowMessage(StrFunc('Hello'));
 
---------------------------
project1
---------------------------
Self: 00000000, Param : "Hello"
---------------------------
OK    
---------------------------
 

Всего записей: 292 | Зарегистр. 30-11-2011 | Отправлено: 12:51 04-07-2013
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
http://docwiki.embarcadero.com/RADStudio/XE4/en/Procedural_Types#Method_Pointers
Но в современных делфях указатели на методы можно объявлять и как анонимы, т к они совместимы: http://docwiki.embarcadero.com/RADStudio/XE4/en/Anonymous_Methods_in_Delphi#Using_Anonymous_Methods

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:50 04-07-2013 | Исправлено: Frodo_Torbins, 13:57 04-07-2013
VadimLou



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
 
1)
 
var
  AMethodCode: Pointer;
begin
  AMethodCode := @TMyObject.MyMethod;
 
2)
 
var
  AMethodCode: Pointer;
  AMethod: TMethod;
begin  
  AMethod := TMethod(MyObject.MyMethod);
  AMethodCode := AMethod.Code;

Всего записей: 702 | Зарегистр. 22-07-2004 | Отправлено: 16:18 04-07-2013
AlekXL



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

Цитата:
AlekXL
http://docwiki.embarcadero.com/RADStudio/XE4/en/Procedural_Types#Method_Pointers
Но в современных делфях указатели на методы можно объявлять и как анонимы, т к они совместимы: http://docwiki.embarcadero.com/RADStudio/XE4/en/Anonymous_Methods_in_Delphi#Using_Anonymous_Methods

это не то. Явно ты не знаешь, как указатели на методы реализованы в крестах.
 
valgreesh твой код пригоден, конечно. но
1) не поддерживает полиморфизм
2) грязноват. Непонятно, как будет работать с ARC.
хотелось бы на этапе компиляции выяснять, является ли метод виртуальным, и если да, то пихать VMTOFFSET вместо адреса. А в рантайме уже какой-нибуть оберткой решать, как сделать вызов: напрямую, статически, либо через VMT, либо вообще динамически.
Пока писал, понял, что виртуальный вызов можно сделать через диспетчеризацию message или dispId: вызов виртуальный(вернее, динамический), никаких тебе грязных указателей. Лучше всего, наверное, именно dispId, поскольку он, насколько я знаю, сейчас нигде не используется в стд библиотеках. Только где примерный код такой диспетчеризации?
 
upd
код диспетчеризации в Vcl.OleAuto, оказывается. И действительно, если диспетчеризуемый метод виртуальный, то TAutoEntry.Flags содержит флаг afVirtual=$08;
и вместо прямого адреса дается смещение в VMT. Конечно, automated методы работают за счет своего RTTI, но в отличие от стандартного eRTTI, здесь информация хранится только о членах, объявленных в области automated.
К тому же этот код работает и на win32, и на ios simulator(стало быть, nextgen ARM компилятор тоже должен его поддерживать)
 
deks

Цитата:
http://docwiki.embarcadero.com/RADStudio/XE4/en/Run-Time_Operations_on_Types#Invoking_Methods  

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

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 09:42 05-07-2013 | Исправлено: AlekXL, 13:06 05-07-2013
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
Справка говорит, что Automated - Win32 Only: http://docwiki.embarcadero.com/RADStudio/XE4/en/Classes_and_Objects#Automated_Members_.28Win32_Only.29
Остаются только message, но и с ними не все ясно. Я бы сделал ставку на интерфейсы.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:28 05-07-2013
AlekXL



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

Цитата:
Справка говорит, что Automated - Win32 Only: http://docwiki.embarcadero.com/RADStudio/XE4/en/Classes_and_Objects#Automated_Members_.28Win32_Only

 справка неверна. Работает и под MacOS и под IOS simulator
 

Цитата:
Остаются только message, но и с ними не все ясно. Я бы сделал ставку на интерфейсы.
 
message методы накладывают строгие ограничения на сигнатуру
интерфейсы?
Их есть у меня, но мне нужна диспетчеризация. А у интерфейсов, кажется, такой функции нет. Кроме IDispatch, но там все медленно.
 

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

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
А какая именно диспетчеризация нужна?
Что касается Automated, то слишком уж он не надежен. Если справка говорит, что он Win32 Only, значит в одной из следующих версий его запросто могут убрать. А архитектуры компиляторов под IOS simulator и IOS Device сильно отличаются.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 15:09 05-07-2013
AlekXL



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

Цитата:
А какая именно диспетчеризация нужна?
 

диспетчеризация ordinalValue -> handlerMethod

Цитата:
 
Что касается Automated, то слишком уж он не надежен. Если справка говорит, что он Win32 Only, значит в одной из следующих версий его запросто могут убрать.
 

automated считается устарелым со времен Delphi 3. И -- нет ничего более постоянного, чем временное.
 Вот, строки сильно изменились, до юникода, да еще стали zero-based, и в immutable хотят превратить некоторые вандалы. Указатели больше нельзя запихивать в integer переменную. Встроенный ассемблер урезали, а потом вообще ликвидировали в NextGen. Все это были нужные, ни разу не устарелые, надежные, цитируя вас, языковые особенности. И где они?
 А automated живет. Если уж он по факту реализован в NextGen, зачем его убирать?
 

Цитата:
 
 А архитектуры компиляторов под IOS simulator и IOS Device сильно отличаются.
отличается финальный бэкенд-кодеген. Но, насколько я знаю, промежуточный код LLVM един. Или у тебя другие сведения? Что вообще ты понимаешь под архитектурой компилятора? Уж явно не различие в типе выходного машинного кода, ведь это ни разу не архитектура компилятора.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 16:04 05-07-2013
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
Цитата:
отличается финальный бэкенд-кодеген. Но, насколько я знаю, промежуточный код LLVM един. Или у тебя другие сведения?
Где то читал (вспомнил где), что компиляторы для MacOS X и IOS simulator - это классические компиляторы. Ничего общего с LLVM кроме парсера делфи у них нету. Подтверждение можно найти тут: Options Supported by DCCIOS32 and Not Supported by DCCIOSARM Обрати внимание на "Pentium-safe FDIV".

Цитата:
диспетчеризация ordinalValue -> handlerMethod
Подробнее, пожалуйста. Чем к примеру GUID -> handlerMethod не устраивает?

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:40 05-07-2013 | Исправлено: Frodo_Torbins, 16:41 05-07-2013
AlekXL



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

Цитата:
Подробнее, пожалуйста. Чем к примеру GUID -> handlerMethod не устраивает?

вот представь, как Windows message handling на GUIDах реализовывать, и тогда все сразу станет тебе понятно.  
Это просто не то.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 19:32 05-07-2013
Frodo_Torbins

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

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:37 06-07-2013
AlekXL



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

Цитата:
AlekXL
Как то так.

пфф... сложно,некрасиво.
 К тому же уже подтверждено, что automated поддерживается на ios-Device компиляторе.  
Так что вопрос исчерпан.
как писал HeMet:

Цитата:
Вы ругаетесь на говнокод от дотнетчиков, а сами пишите про «нетривиальный код», который, видимо, написан из расчета, что каждый кто к нему прикоснулся должен страдать.


Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 20:25 06-07-2013 | Исправлено: AlekXL, 20:30 06-07-2013
MetalFan

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Может кому пригодиться XE Distiller для XE4.
Адаптировал сорцы для сборки под XE4 и соотв.работы с оной.
Сорцы, собранный екзешник

Всего записей: 22 | Зарегистр. 16-05-2003 | Отправлено: 13:37 09-07-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MetalFan
Вам спасибо.
 
Всё очень плохо с ФастРепорт. Я и сам могу RemObject скрипт случить с RaveReport. Остаются кубы, с которыми вроде не плохо справляется EhLib. Моё мнение MS офис печатает получше...
 
Добавлено:
Постараюсь, чтоб в моих приложениях даже духа этого не было.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 15:29 10-07-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