Текущий архив: 2006.12.31;
Скачать: CL | DM;
ВнизВызвать обработчик, имя которого неизвестно в дизайн-тайме Найти похожие ветки
← →
TrainerOfDolphins © (2006-12-08 16:25) [0]День добрый!
Есть ли способ из кода вызвать обработчик, указатель на который содержится в свойстве типа, например, TNotifyEvent?
Заранее спасибо.
← →
Desdechado © (2006-12-08 16:26) [1]имя свойтсва известно?
вызывай его
← →
Anatoly Podgoretsky © (2006-12-08 16:33) [2]> TrainerOfDolphins (08.12.2006 16:25:00) [0]
Это не возможно, Дельфи не интерпритатор, все обработчики должны быть созданы в Дизайн тайм и до компиляции.
← →
TrainerOfDolphins © (2006-12-08 16:35) [3]
> имя свойтсва известно?
> вызывай его
Предположим есть
SomeDBGrid.OnDblClick:=UnknownHandler;
как вызвать UnknownHandler через свойство OnDblClick?
Если можно, конкретней, пожалуйста... :)
← →
TrainerOfDolphins © (2006-12-08 16:38) [4]
> Это не возможно, Дельфи не интерпритатор, все обработчики
> должны быть созданы в Дизайн тайм и до компиляции.
Но я же могу переприсваивать обработчики в коде. Могу запоминать обработчик в переменную...
← →
Anatoly Podgoretsky © (2006-12-08 16:39) [5]> TrainerOfDolphins (08.12.2006 16:35:03) [3]
Открой исходника VCL и поиск по if Assigned(F далее смотришь что там.
← →
novill © (2006-12-08 16:44) [6]> [0] TrainerOfDolphins © (08.12.06 16:25)
Метод с подходящими параметрами написан?
Имя или адрес его перед присваиванием известны?
Задавай!
← →
TrainerOfDolphins © (2006-12-08 16:48) [7]
> Открой исходника VCL и поиск по if Assigned(F далее смотришь
> что там.
там много таких мест.
← →
novill © (2006-12-08 16:48) [8]> [5] Anatoly Podgoretsky © (08.12.06 16:39)
А чем написанное там мешает такой работе?
← →
Elen © (2006-12-08 16:57) [9]
> как вызвать UnknownHandler через свойство OnDblClick?
> Если можно, конкретней, пожалуйста... :)
Когда-то мне попалась на глаза статья одного Хацкера. Он предлагал примерно такой вариант - (сразу скажу что говорю примерно) Выделить в начале обработчика IP вызвавшей функции и JMP на нее, но это ИМХО геммор особенно в Делфях, хотя он настаивал что можно везде.
← →
Anatoly Podgoretsky © (2006-12-08 16:58) [10]> TrainerOfDolphins (08.12.2006 16:48:07) [7]
Ну и что, что много, все смотреть не надо, достаточно одного, любого
← →
Anatoly Podgoretsky © (2006-12-08 16:58) [11]> novill (08.12.2006 16:48:08) [8]
Ничем, наоборот помогает.
← →
TrainerOfDolphins © (2006-12-08 17:00) [12]Чувствую, надо конкретней. А то сеанс телепатии начинается :).
Значится так.
Предположим есть два обработчика.procedure Handler1 (Sender:object);
begin
{алгоритм1}
end;
procedure Handler2 (Sender:object);
begin
{алгоритм2}
end;
Есть код, в котором в зависимости от некоторого условия определённому событию ставится в соответствие один из обработчиков.begin
if {условие}
then Grid.OnDblClick:=Handler1
else Grid.OnDblClick:=Handler2;
end;
Как из кода вызвать то, что "содержится" в Grid.OnDblClick?
Если есть такой способ, привидите, плиз, хотя бы примерный код, хоть принцип.
← →
Elen © (2006-12-08 17:02) [13]
> Как из кода вызвать то, что "содержится" в Grid.OnDblClick?
Хоть понял что спросил? - "Как вызвать из кода код который сейчас выполняется".
← →
Игорь Шевченко © (2006-12-08 17:03) [14]
> begin
> if {условие}
> then Grid.OnDblClick:=Handler1
> else Grid.OnDblClick:=Handler2;
> end;
> Как из кода вызвать то, что "содержится" в Grid.OnDblClick?
Grid.DblClick ?
← →
TrainerOfDolphins © (2006-12-08 17:04) [15]
> Метод с подходящими параметрами написан?
> Имя или адрес его перед присваиванием известны?
> Задавай!
куда задавать?
← →
Elen © (2006-12-08 17:04) [16]
> Grid.DblClick ?
Ага. И зациклится сразу. Автор ты что с дельфинами перепил?
← →
Elen © (2006-12-08 17:06) [17]
> begin
> if {условие}
> then Grid.OnDblClick:=Handler1
> else Grid.OnDblClick:=Handler2;
> end;
>
> Как из кода вызвать то, что "содержится" в Grid.OnDblClick?
>
Кстати можно вызов прописать прямо в Then или в Else. Зачем определять что откуда вызывается?
← →
Игорь Шевченко © (2006-12-08 17:07) [18]Elen © (08.12.06 17:04) [16]
Ты б матчасть что ли учило. Чудо.
← →
TrainerOfDolphins © (2006-12-08 17:07) [19]
> Хоть понял что спросил?
я то понял... Чувствую, что хреново спросил. Меня понять, что ли не могут...
← →
umbra © (2006-12-08 17:09) [20]см. [14]
← →
TrainerOfDolphins © (2006-12-08 17:17) [21]
> Кстати можно вызов прописать прямо в Then или в Else. Зачем
> определять что откуда вызывается?
Вопрос, конечно, конструктивный.
Тем не менее, если бы так можно было бы, было бы гибче...
Тем более, что меня просто интересует этот вопрос. Зачем мне это - это уже дело третье. Долго расказывать...
← →
TrainerOfDolphins © (2006-12-08 17:20) [22]
> umbra © (08.12.06 17:09) [20]
> см. [14]
OnDblClick - это я для примеру и для простоты. А если, скажем, BeforeDelete?
← →
umbra © (2006-12-08 17:23) [23]
> А если, скажем, BeforeDelete?
>
даже для OnMouseMove сработает :) Лишь бы обработчик был назаначен.
← →
Stanislav © (2006-12-08 17:26) [24]TrainerOfDolphins © (08.12.06 17:00) [12]
Не проще переписать логику?
Примерно так:
Procedure Handler (sender:TObject);
begin
if {условие}
Handler1 (Sender);
else Grid.OnDblClick:=Handler2 (Sender);
end;
Procedure onGrid1dblclick (sender:TObject);
begin
Handler(Sender);
end;
← →
Stanislav © (2006-12-08 17:27) [25]т.е.
Procedure Handler (sender:TObject);
begin
if {условие}
Handler1 (Sender);
else Handler2 (Sender);
end;
← →
TrainerOfDolphins © (2006-12-08 17:39) [26]Я просто поражаюсь себе!
:). Таких простых вопросов я ещё не задавал....
Всё оказывается тривиально до безобразия.
Оказывается можно написать Grid.OnClick(Grid), и это будет равносильно вызову обработчика. Н-да.
Спасибо, господа! Прощения за отобранное у Вас время :)
← →
Anatoly Podgoretsky © (2006-12-08 18:56) [27]> Игорь Шевченко (08.12.2006 17:07:18) [18]
А стихами?
Учило - Чудило
← →
Anatoly Podgoretsky © (2006-12-08 18:56) [28]> TrainerOfDolphins (08.12.2006 17:17:21) [21]
Ну не рассказывай. Твое право.
← →
Anatoly Podgoretsky © (2006-12-08 18:57) [29]> TrainerOfDolphins (08.12.2006 17:20:22) [22]
Генотип принципиально не хочем смотреть, тоже твое право.
Страницы: 1 вся ветка
Текущий архив: 2006.12.31;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.045 c