Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

array [] of procedure() of object [D7, WinXP]


Страницы:   1 2

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]

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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо