Форум: "Основная";
Текущий архив: 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