Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.005 c
2-1304500935
adigozelov
2011-05-04 13:22
2011.08.14
TBarcode


15-1302671702
TUser
2011-04-13 09:15
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.


6-1240473036
MultIfleX
2009-04-23 11:50
2011.08.14
win pcap





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский