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

Вниз

array [] of procedure() of object   Найти похожие ветки 

 
Fosgen ©   (2009-12-24 03:04) [0]

Вот собственно интересует структура и синтаксис создания сабжа.
Вариант с объявлением типа procedure() of object, и последующим объявлением array of такого типа - не предлагать - не катит.

Уперся в то что Дельфя не хочет признавать идентификаторы тех самых procedure of object за корректные элементы массива.

С просто procedure или function - проканывает объявление типа и потом размещение идентификаторов в массиве.
С именами методов - не получается.
Кто-нибудь знает решение?


 
Германн ©   (2009-12-24 06:39) [1]


> Fosgen ©   (24.12.09 03:04)
>
> Вот собственно интересует структура и синтаксис создания
> сабжа.
>

А смысл?


 
Джо ©   (2009-12-24 06:57) [2]

Так чем
type
 TProc = procedure of object;
 TProcArray = array of TProc;
не устраивает-то?


 
KilkennyCat ©   (2009-12-24 07:04) [3]


> Джо ©   (24.12.09 06:57) [2]

наверное, формой записи.


 
Германн ©   (2009-12-24 07:27) [4]


> Джо ©   (24.12.09 06:57) [2]
>
> Так чем
>

Имхо, понятно чем :)
Но смысл такого массива?


 
RWolf ©   (2009-12-24 09:22) [5]


> Но смысл такого массива?

EventListeners: TProcArray например


 
Fosgen ©   (2009-12-24 09:24) [6]

Уточняю для тех, кто не читает первый пост ("Вариант с объявлением типа procedure() of object, и последующим объявлением array of такого типа - не предлагать - не катит").

Тем что у меня массив КОНСТАНТ. Мне его не надо заполнять рантайм.

А в таком раскладе Дельфи не признает приведеный синтаксис. Ругается на массив констант (идентификаторов методов класса). И думаю, догадаетесь что объявление массива типом - тоже не поможет.

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

И мне вообще интересно - это что - нормальное поведение - Если нет ответа, задавать вопросы "Зачем?" "А смысл?"
Для меня - есть смысл.


 
Медвежонок Пятачок ©   (2009-12-24 09:43) [7]

тогда какая разница, что именно хардкодить?

статический массив или просто рисовать несколько вызовов без массива.


 
Медвежонок Пятачок ©   (2009-12-24 09:45) [8]

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

тогда массив будет целочисленным и вызовы можно будет реализовать циклом


 
Медвежонок Пятачок ©   (2009-12-24 09:48) [9]

это что - нормальное поведение - Если нет ответа, задавать вопросы "Зачем?" "А смысл?"

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


 
Fosgen ©   (2009-12-24 10:12) [10]


> статический массив или просто рисовать несколько вызовов
> без массива.


Мне придется делать каждый раз кучу проверок или реализовывать через нехилый case каждый вызов обработчика. При том что я его просто могу прописать в соответствующую property и вызывать одной строкой, нахрен вышеописанный гемор?
Основная проблема в "прописать" ТРЕБУЕМЫЙ обработчик. НЕ любой, а именно строго конкретный.


> можно поставить соответствие между набором предопределенных
> методов и битовой маской


Пример кода, пожалуйста, как Вы это видите?


> так как иногда не надо искать ответ на вопрос как удалить
> гланды через анус.


Сначала убедитесь что это именно ТАК.


 
Медвежонок Пятачок ©   (2009-12-24 10:22) [11]

Основная проблема в "прописать" ТРЕБУЕМЫЙ обработчик.

И как ты себе представляешь это?
Вот представь, что ты компилятор.
Тебе подсовывают код, в котором статически заданы адреса кучи процедур, которые ты даже еще не начинал компилировать.

Твои действия?


 
Sha ©   (2009-12-24 10:22) [12]

Возможно, я не понял, что требуется.
В таком случае нельзя ли доходчиво объяснить, что именно не устраивает в следующем коде:

type
 TProc = procedure of object;
 TProcArray = array of TProc;
var
 pa: TProcArray;
procedure TForm1.MemoEnter(Sender: TObject);
var
 i: integer;
begin;
 i:=Length(pa);
 SetLength(pa,i+1);
 TNotifyEvent(pa[i]):=MemoEnter2;
 TNotifyEvent(pa[i])(TObject(i));
 end;

procedure TForm1.MemoEnter2(Sender: TObject);
begin;
 Memo.Lines.Add(IntToStr(integer(Sender)));
 end;


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


 
Медвежонок Пятачок ©   (2009-12-24 10:23) [13]

Возможно, я не понял, что требуется.

Он хочет задекларировать массив, одновременно с заполнением его адресами процедур.


 
Sha ©   (2009-12-24 10:26) [14]

> Медвежонок Пятачок ©   (24.12.09 10:23) [13]
> Он хочет задекларировать массив, одновременно с заполнением его адресами процедур.

а как же тогда понимать это:

> Fosgen ©   (24.12.09 09:24) [6]
> Тем что у меня массив КОНСТАНТ. Мне его не надо заполнять рантайм.


 
Медвежонок Пятачок ©   (2009-12-24 10:27) [15]

Сначала убедитесь что это именно ТАК.

можешь поверить мне на слово, что это именно так и есть.


 
Медвежонок Пятачок ©   (2009-12-24 10:29) [16]

а как же тогда понимать это:

> Fosgen ©   (24.12.09 09:24) [6]
> Тем что у меня массив КОНСТАНТ. Мне его не надо заполнять рантайм.


Очень просто.
Ему хочется иметь свойство - массив.  В массиве будет список обработчиков. Обработчики уже есть. Но массив он хочет объявить уже заполненным.

Чтобы потом в рантайме пройтись по нему и вызвать все подряд что в нем есть.

Т.е наивная попытка наколоть судьбу и сократить код.


 
Sha ©   (2009-12-24 10:33) [17]

Вот же блин!
Несколько раз читал, и каждый раз не надо читал как мне надо


 
Fosgen ©   (2009-12-24 10:34) [18]

Удалено модератором


 
Fosgen ©   (2009-12-24 10:38) [19]

Удалено модератором


 
Медвежонок Пятачок ©   (2009-12-24 10:44) [20]

ну если упорствуешь, то есть способ для тебя.
попробуй угадай по каким адресам распихает компилер твои процедуры и заполни свой массив интегерами (так как элементы должны быть константами)
а на рантайме приводи интегеры к нотифайевенту.

и удалишь таким образом свои гланды через анус


 
Медвежонок Пятачок ©   (2009-12-24 10:47) [21]

только угадывание адресов и правка интегеров в исходнике потребуется перед каждым нажатием F9.

но это же ерунда, согласись. чего не сделаешь ради искусства?


 
Fosgen ©   (2009-12-24 11:00) [22]

Удалено модератором


 
Sha ©   (2009-12-24 11:03) [23]

> Fosgen ©   (24.12.09 11:00) [22]
> Понятно.
> Тут рулят придурки.

Eсли прочитать справку или погуглить на тему TMethod,
то сразу станет понятно, почему бессмысленно объявлять
массив констант-методов.

Как называют тех, кто не хочет этого делать, тебе видней.


 
Медвежонок Пятачок ©   (2009-12-24 11:04) [24]

Ладно, последняя попытка.

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

при этом зубная щетка не меняет своего положения на протяжении всего строительства.


 
KilkennyCat ©   (2009-12-24 11:17) [25]


> Медвежонок Пятачок ©   (24.12.09 11:04) [24]

вот из-за таких ассоциаций нас потом придурками обзывают. (я вчера в одной беседе тоже примером строительство дома привел).


 
Sha ©   (2009-12-24 11:51) [26]

Если все методы принадлежат одному объекту,
то можно попробовать датную часть метода назначать в рантайме:
</const
 a: array[0..1] of pointer= (@TForm1.MemoEnter0, @TForm1.MemoEnter1);
procedure TForm1.MemoEnter(Sender: TObject);
var
 i: integer;
begin;
 i:=Random(2);
 TMethod(MemoEnterX).Code:=a[i];
 TMethod(MemoEnterX).Data:=Self;
 MemoEnterX(TObject(i));
 end;

procedure TForm1.MemoEnter0(Sender: TObject);
begin;
 Memo.Lines.Add("MemoEnter0 "+IntToStr(integer(Sender)));
 end;

procedure TForm1.MemoEnter1(Sender: TObject);
begin;
 Memo.Lines.Add("MemoEnter1 "+IntToStr(integer(Sender)));
 end;
CODE>


 
Медвежонок Пятачок ©   (2009-12-24 12:01) [27]

тогда уж проще по именам получать адреса в рантайме.
или написать обертки для методов в виде orinal процедур и получить в них  ссылку на экземпляр (или передавать ее в обертку)


 
Sha ©   (2009-12-24 12:44) [28]

Не проще.

[26] решает задачу (мы все-таки имеем массив констант)
в одном важном частном случае,
который на практике встречается во много раз чаще других.

А то, что вместо одного оператора присваивания придется написать два,
так это фигня.


 
Медвежонок Пятачок ©   (2009-12-24 12:50) [29]

ну будет массив констант - строк.
дизайнер же точно так же хранит в дфм имена обработчиков.
в делфи это скалярные свойства, в донете это коллекции.


 
icWasya ©   (2009-12-24 13:34) [30]

Procedure() of object - это пара указателей, во первых на код метода, а во вторых на экземпляр объекта, которому этот метод принадлежит.
Все объекты в Дельфи создаются только динамически.
Как Вы собираетесь во время компиляции собираетесь создать такой массив констант?



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

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

Наверх




Память: 0.55 MB
Время: 0.012 c
2-1304524929
Drowsy
2011-05-04 20:02
2011.08.14
Массив виртуальных функций класса.


15-1303194418
OW
2011-04-19 10:26
2011.08.14
ничего себя тенденция на сайты второго уровня


15-1303483359
mr.Ulugbek
2011-04-22 18:42
2011.08.14
Не работает INDY 8 SQUID Proxy.


15-1303293901
uzver
2011-04-20 14:05
2011.08.14
Вопрос по C Sharp, если можно.


2-1304106723
novichek
2011-04-29 23:52
2011.08.14
idHttp RSConnectionClosedGracefully