![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
array [] of procedure() of object [D7, WinXP]
Fosgen © (2009-12-24 03:04:00)Вот собственно интересует структура и синтаксис создания сабжа.
Вариант с объявлением типа procedure() of object, и последующим объявлением array of такого типа - не предлагать - не катит.
Уперся в то что Дельфя не хочет признавать идентификаторы тех самых procedure of object за корректные элементы массива.
С просто procedure или function - проканывает объявление типа и потом размещение идентификаторов в массиве.
С именами методов - не получается.
Кто-нибудь знает решение?
icWasya (2009-12-24 13:34:00) [1]Procedure() of object- это пара указателей, во первых на код метода, а во вторых на экземпляр объекта, которому этот метод принадлежит.
Все объекты в Дельфи создаются только динамически.
Как Вы собираетесь во время компиляции собираетесь создать такой массив констант?
Медвежонок Пятачок (2009-12-24 12:50:00) [2]ну будет массив констант - строк.
дизайнер же точно так же хранит в дфм имена обработчиков.
в делфи это скалярные свойства, в донете это коллекции.
Sha (2009-12-24 12:44:00) [3]Не проще.
[26] решает задачу (мы все-таки имеем массив констант)
в одном важном частном случае,
который на практике встречается во много раз чаще других.
А то, что вместо одного оператора присваивания придется написать два,
так это фигня.
Медвежонок Пятачок (2009-12-24 12:01:00) [4]тогда уж проще по именам получать адреса в рантайме.
или написать обертки для методов в виде orinal процедур и получить в них ссылку на экземпляр (или передавать ее в обертку)
Sha (2009-12-24 11:51:00) [5]Если все методы принадлежат одному объекту,
то можно попробовать датную часть метода назначать в рантайме:
</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>
KilkennyCat (2009-12-24 11:17:00) [6]
> Медвежонок Пятачок © (24.12.09 11:04) [24]
вот из-за таких ассоциаций нас потом придурками обзывают. (я вчера в одной беседе тоже примером строительство дома привел).
Медвежонок Пятачок (2009-12-24 11:04:00) [7]Ладно, последняя попытка.
ты вышел в чистое поле и хочешь построить дом.
перед постройкой ты берешь свою зубную щетку и пытаешься подвесить ее в воздухе в такой точке, чтобы когда дом будет построен, и в него будут внесены все вещи, твоя зубная щетка чудесным образом оказывается в стакане стоящем на полочке в ванной.
при этом зубная щетка не меняет своего положения на протяжении всего строительства.
Sha (2009-12-24 11:03:00) [8]> Fosgen © (24.12.09 11:00) [22]
> Понятно.
> Тут рулят придурки.
Eсли прочитать справку или погуглить на тему TMethod,
то сразу станет понятно, почему бессмысленно объявлять
массив констант-методов.
Как называют тех, кто не хочет этого делать, тебе видней.
Fosgen (2009-12-24 11:00:00) [9]Удалено модератором
Медвежонок Пятачок (2009-12-24 10:47:00) [10]только угадывание адресов и правка интегеров в исходнике потребуется перед каждым нажатием F9.
но это же ерунда, согласись. чего не сделаешь ради искусства?
Медвежонок Пятачок (2009-12-24 10:44:00) [11]ну если упорствуешь, то есть способ для тебя.
попробуй угадай по каким адресам распихает компилер твои процедуры и заполни свой массив интегерами (так как элементы должны быть константами)
а на рантайме приводи интегеры к нотифайевенту.
и удалишь таким образом свои гланды через анус
Fosgen (2009-12-24 10:38:00) [12]Удалено модератором
Fosgen (2009-12-24 10:34:00) [13]Удалено модератором
Sha (2009-12-24 10:33:00) [14]Вот же блин!
Несколько раз читал, и каждый раз не надочитал как мне надо
Медвежонок Пятачок (2009-12-24 10:29:00) [15]а как же тогда понимать это:
> Fosgen © (24.12.09 09:24) [6]
> Тем что у меня массив КОНСТАНТ. Мне его не надо заполнять рантайм.
Очень просто.
Ему хочется иметь свойство - массив. В массиве будет список обработчиков. Обработчики уже есть. Но массив он хочет объявить уже заполненным.
Чтобы потом в рантайме пройтись по нему и вызвать все подряд что в нем есть.
Т.е наивная попытка наколоть судьбу и сократить код.
Медвежонок Пятачок (2009-12-24 10:27:00) [16]Сначала убедитесь что это именно ТАК.
можешь поверить мне на слово, что это именно так и есть.
Sha (2009-12-24 10:26:00) [17]> Медвежонок Пятачок © (24.12.09 10:23) [13]
> Он хочет задекларировать массив, одновременно с заполнением его адресами процедур.
а как же тогда понимать это:
> Fosgen © (24.12.09 09:24) [6]
> Тем что у меня массив КОНСТАНТ. Мне его не надо заполнять рантайм.
Медвежонок Пятачок (2009-12-24 10:23:00) [18]Возможно, я не понял, что требуется.
Он хочет задекларировать массив, одновременно с заполнением его адресами процедур.
Sha (2009-12-24 10:22:00) [19]Возможно, я не понял, что требуется.
В таком случае нельзя ли доходчиво объяснить, что именно не устраивает в следующем коде:
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:22:00) [20]Основная проблема в "прописать" ТРЕБУЕМЫЙ обработчик.
И как ты себе представляешь это?
Вот представь, что ты компилятор.
Тебе подсовывают код, в котором статически заданы адреса кучи процедур, которые ты даже еще не начинал компилировать.
Твои действия?