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

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

Модерирует : 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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

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

AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Существует ли библиотека обобщений, в которой классы-контейнеры реализуют интерфесы?
e.g.
TList<T>=class(TEnumerable<T>, IList<T>)
...<declarations>
end;
 
---
добавлено: нашлась, существует!  http://code.google.com/p/delphi-coll/

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 11:56 13-01-2013 | Исправлено: AlekXL, 11:59 13-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Spring4Delphi : http://www.spring4d.org/general/rebirth-of-spring4d/
 
но если ее всерьез использовать - от XE2 начинает глючить и падать.
Некоторые из этих багов в ХЕ3 исправили, впрочем. В ХЕ2 не стали, гады, оттягивали...

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

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

Всего записей: 592 | Зарегистр. 06-10-2003 | Отправлено: 07:31 14-01-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HeMet
 
А зачем проект VS пихать в проект Delphi?  
 
Не проще ли сделать нормальную DLL в VS и уже нормально использовать эту DLL в Delphi?
 
Ну или любой иной метод IPC на Windows - заканчивая REST-сервером. Кстати, под XE3 LiveTile на Win8 так и сделан - это REST сервер написанный на VS, который по HTTP работает с Desktop Win-приложением Delphi.

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deks
Полу-академический  интерес. Цель библиотека Detours. Так же по роду хобби приходится периодически заниматься обратной разработкой форматов файлов для различных игр и, соответственно, писать утилиты для работы с ними (разумеется, продукция некоммерческая и всё ради самообразования , и не хочется к небольшой утилите добавлять внешние зависимости, особенно если утилита позиционируется, как универсальная.
 
P.S. С зависимостями от new/delete разобрался, достаточно откомпилить в объектник такой вот код:
 

Код:
 
extern "C" void* new_impl(size_t n);
extern "C" void delete_impl(void* p);
 
void operator delete(void* p)
{
    delete_impl(p);
}
 
void* operator new (size_t n)
{
    return new_impl(n);
}
 

 
А потом в программе сделать перенаправление:

Код:
 
{$L DetoursObjs\detours.obj}
{$L DetoursObjs\creatwth.obj}
{$L DetoursObjs\disasm.obj}
{$L DetoursObjs\image.obj}
{$L DetoursObjs\modules.obj}
{$L DetoursObjs\new_op.obj}
 
...
 
// сишный new
function _new_impl(n: SIZE_T): Pointer; cdecl; external 'msvcrt.dll' name '??2@YAPAXI@Z';
//begin
//  try
//    Result := GetMemory(n);
//  except
//    on EOutOfMemory do
//      Result := nil;
//  end;
//end;
 
// сишный delete
procedure _delete_impl(p: Pointer); cdecl; external 'msvcrt.dll' name '??3@YAXPAX@Z';
//begin
//  FreeMemory(p);
//end;
 
var
  pi: PInteger;
 
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    pi := _new_impl(SizeOf(Integer));
    pi^ := 7;
    Writeln(pi^);
    _delete_impl(pi);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
 

 
Вдруг кому пригодиться.
 
P.S.S. И вообще так интересней изучать языки, если есть некоторая тяга в сторону железа

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 18:25 14-01-2013 | Исправлено: HeMet, 18:34 14-01-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вопрос новичка. Если у меня в переменной A ссылка на аноним, а мне нужна независимая копия с тем же (по значению) контекстом в переменной b .. это возможно сделать?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 18:55 14-01-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
Анонимные функции реализованы через интерфейсы. При её создании происходит захват контекста и он отправляется в поля класса, реализующего интерфейс. Но клонировать анонимные методы, на сколько я знаю нельзя (штатными средствами) — они для этого не спроектированы.  
Поэтому, вероятно, нужно будет сделать метод-фабрику, которой передается контекст, а она возвращает анонимку и вызывать столько раз, сколько нужно копий.

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 19:12 14-01-2013
DeathMAD

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

Код:
  if Assigned(AProc) then
  begin
    IInterface(PPointer(@AProc)^)._AddRef;
    FAnonymousProcedure := PPointer(@AProc)^;
  end;

 
_Release потом не забыть.

Всего записей: 114 | Зарегистр. 13-10-2004 | Отправлено: 01:50 15-01-2013
AlekXL



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

Цитата:
  if Assigned(AProc) then
  begin
    IInterface(PPointer(@AProc)^)._AddRef;
    FAnonymousProcedure := PPointer(@AProc)^;
  end;  

это вряд ли сработает..

Цитата:
Анонимные функции реализованы через интерфейсы.
 
Нет, не через интерфес. Я смотрел в дизассемблере. Через класс.
 
 Этот класс напрямую унаследован  от TInterfacedObject, и внутренне, автоматически определяется компилятором на основе анализа кода анонимного метода. Этот класс имеет по крайней базовый RTTI, имя (через TObject.ClassName оно видно как TSomeClass.SomeMethodAnonymOne - как то так).

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

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

Всего записей: 114 | Зарегистр. 13-10-2004 | Отправлено: 09:59 15-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> функции реализованы через интерфейсы.
> класс напрямую унаследован  от TInterfacedObject
 
не вижу большой разницы.
 
В Delphi можно реализовать интерфейс инaче чем через класс ?

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 12:50 15-01-2013
HeMet

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

Цитата:
if Assigned(AProc) then     
begin       
  IInterface(PPointer(@AProc)^)._AddRef;     
  FAnonymousProcedure := PPointer(@AProc)^;     
end;

По-моему, речь шла о копировании контекста анонимного метода, а у Вас один контекст на обе анонимки. Разве компилятор не сделает тоже самое, если написать FAnonymousProcedure := aProc ?
 

Цитата:
В Delphi можно реализовать интерфейс инaче чем через класс ?

Можно, например прицепив к записям VMT, но это уже хаки. Вот пример библиотеки для работы с большими числами, которая использует интерфейсы на записях http://sergworks.wordpress.com/2012/04/01/interfaces-without-objects/

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 18:14 15-01-2013 | Исправлено: HeMet, 18:27 15-01-2013
DeathMAD

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Там у меня были сложности, с дженериковым объявлением. Нельзя было объявить FAnonymousProcedure. Но да, контекст один и тот же. Можно зайти с другой стороны и попробовать сделать бинарную копию TFrameObject'а.

Всего записей: 114 | Зарегистр. 13-10-2004 | Отправлено: 18:19 15-01-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeathMAD
Вчера пробовал. То в одном месте косяки вылезали, то в другом. Так и не получилось с первого раза добиться полностью работающего варианта. Самое лучшее, что получилось — это склонировать анонимку, но при этом получал AV при освобождении объекта, который она захватывает.  
 
http://blog.barrkel.com/2008/11/somewhat-more-efficient-smart-pointers.html
В коментах к этой статье Барри Келли говорит, что ссылка на контекст находится в локальной переменной метода Invoke.

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 18:27 15-01-2013
SolidSnakeRU

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Достает древний косяк:
Окно структуры приложения - там где классы и т.п. показывает ошибки хотя их нет (например: does not contain a member у мемо не видит метод Add, который есть ).
Какие-то проблемы с проверкой синтаксиса и видимостью модулей что ли, при этом все компилится и работает.
Бывает протыкаешь по модулям и исчезает - вроде ерунда, но достало.
Может кто знает, есть способ фикса?

Всего записей: 248 | Зарегистр. 27-08-2008 | Отправлено: 23:19 17-01-2013 | Исправлено: SolidSnakeRU, 23:20 17-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
выучить J#
устроиться в Embarcadero бесплатно
и переписать парсеры в IDE (которых как говорят несколько, для разных участков кода. Этого я не понял вообще и выпал в осадок.

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



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

Цитата:
> функции реализованы через интерфейсы.
> класс напрямую унаследован  от TInterfacedObject
 
не вижу большой разницы.
 
В Delphi можно реализовать интерфейс инaче чем через класс ?

как раз в анонимах "интерфейс" реализован не через класс. Вернее, не обычным для класса методом виртуальных таблиц. У класса , реализующего аноним, виртуальная таблица анонима НЕ СОВПАДАЕТ с виртуальной таблицей самого класса. Это точно.
Последним членом такого класса будет ссылка на виртуальную таблицу анонима, кажись.
 
 
 
Добавлено:

Цитата:
выучить J#
устроиться в Embarcadero бесплатно
и переписать парсеры в IDE (которых как говорят несколько, для разных участков кода. Этого я не понял вообще и выпал в осадок.

как раз учить j# , этого мертвого последыша не стоит. Лучше переделать с ноля. Какого х. связывать среду с доднетом? Чтобы она запускалась медленней? Нет , ВСЕ в дельфи д.б. либо PUREPASCAL либо ASM.
 
У меня лично большие надежды на то, что паскаль портируют под CLANG/LLVM кодеген. Представляете, каким быстрым и замечательным инструментом станет наш язык?!

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 07:55 18-01-2013 | Исправлено: AlekXL, 08:00 18-01-2013
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1, AlekXL
Просто у них уже были какие то наработки на джаве, вот они и решили сэкономить на переписывании, заюзав модный тогда J#. Сейчас они уже и сами не рады таскать за собой этого зомби. Собственно LLVM как раз и должен решить эту проблему.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 13:25 18-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
..и наработки по Delphi.Net
Иначе бы они завязали бы среду не на .Net, а на JVM
 
Но вообще, чтобы связаться с J# надо было быть или большим оптимистом или большим пофигистом...

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 13:29 18-01-2013
A_V

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

Цитата:
 Если у меня в переменной A ссылка на аноним, а мне нужна независимая копия с тем же (по значению) контекстом в переменной b .. это возможно сделать?

если я правильно понял, то что-то типа такого (для delphi>=2010):

Код:
 
 
type
 TRefProcAdapter<T> = class
   class function MakeCopy(ARefProc: T): T;
 end;
...
 
uses System.Rtti, System.TypInfo;
...
 
class function TRefProcAdapter<T>.MakeCopy(ARefProc: T): T;
type
  PInterface = ^IInterface;
var
  ProcType: TRttiInstanceType;
  RefObj: TObject;
  ResultObj: TObject;
  f: TRttiField;
begin
  Assert(PTypeInfo(TypeInfo(T)).Kind = tkInterface);
  RefObj := PInterface(@ARefProc)^ as TObject;
  ResultObj := RefObj.ClassType.Create;
  ProcType := TRttiContext.Create.GetType(RefObj.ClassInfo) as TRttiInstanceType;
  Assert(Assigned(ProcType));
  for f in ProcType.GetDeclaredFields do
    f.SetValue(ResultObj, f.GetValue(RefObj));
  ResultObj.GetInterface(GetTypeData(PTypeInfo(TypeInfo(T))).Guid, Result);
end;
 
 

 
пример:  

Код:
 
TRefProc = reference to procedure(AParam: Integer);
..
 
procedure TForm3.FormCreate(Sender: TObject);
var
  RefProc1, RefProc2: TRefProc;
  Cntr: Integer;
begin
  Cntr := 0;
  RefProc1 := procedure(AParam: Integer)
              var
                LSelf: TObject;
              begin
                if Cntr = 0 then
                  ShowMessage('Pass');
                Inc(Cntr);
                asm
                  mov eax, [ebp-8];
                  mov LSelf, eax
                end;
                 ShowMessage(LSelf.ClassName);
              end;
  RefProc2 := TRefProcAdapter<TRefProc>.MakeCopy(RefProc1);
  RefProc1(20);
  RefProc2(30);
  RefProc2 := nil;
end;
 

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 14:03 18-01-2013 | Исправлено: A_V, 14:39 18-01-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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

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


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru