Не могу заставить созданные в runtime компоненты обрабатывать событие:
Есть объект в котором создаются компоненты:
cOkno=object
private
sp_stage:TList;//Список этих компонетовpublic
procedure CreateAll;
end;
procedure cOkno.CreateAll;
var s1:pTStage; // видоизмененный TShapebegin
......
for i:=0 to max do
begin
new(s1);
s1^:=TStage.Create(nil);
s1.Parent:=pfrmChild.BPanel1; //pfrmChild - форма в которой они создаются (MDiChild)
s1.id:=i;
s1.OnMouseMove:=StageMouseMove; //<<-- не реагирует
sp_stage.add(s1);
end;
.......
end;
Обработчик события пробывал засовывать и в TfrmChild, и в cOkno, все равно не реагирует.
А>>Обработчик события пробывал засовывать и в TfrmChild, и в cOkno, все равно не реагирует. A>Довольно оригинальный подход Или вы используете KOL?
KOL — нет.
Мозги уже кипят, вот и рождается "оригинальность", так еще и ночь была
A>Создавать так наследников от TShape нельзя. И это компилируется? Даже не знаю, что посоветовать
Компилится и работает! Кроме событий
A>Ну хотя бы так создавайте A>
A>s1:= TShape.Create(TfrmChild);
A>
Попробую
A>Странный идентификатор pfrmChild. У вас там случайно не так написано: A>
A>pfrmChild = ^TfrmChild
A>TfrmChild = class(TForm)
A>
Да именно так , как вы догадались?
Re[2]: Обработка события компонентами
От:
Аноним
Дата:
18.11.04 05:54
Оценка:
Здравствуйте, psm, Вы писали:
psm>
А>> new(s1);
А>> s1^:=TStage.Create(nil);
psm>
psm>а почему б это не так написать: psm>
psm> s1 := TStage.Create(nil);
psm>
s1 — этож указатель.
Re[3]: Обработка события компонентами
От:
Аноним
Дата:
18.11.04 06:27
Оценка:
Здравствуйте, Аноним, Вы писали:
A>>Ну хотя бы так создавайте A>>
A>>s1:= TShape.Create(TfrmChild);
A>>
А>Попробую
Попробовал
Вот это вообще не компилится, если передавать указатель на эту форму то работает как и раньше.
А вот если сделать так
s1.OnMouseMove:= TFrmChild.StageMouseMove;
Пишет ошибку: несвопадения типов procedure and TMouseMoveEvent
Во-первых смущает нотация записи. если я правильно понимаю, и pTStage=^TStage
то почему ты на него ссылаешься не как s1^.property, а как s1.property? не есть гуд.
а во-вторых... если эти TShape ты создаешь на своей форме, почему ты делаешь Create(Nil)?
ну подумай, как будет назначен Owner новому компоненту? Потому-то и не работает обработчик,
ведь объект получается "висит в воздухе". Подправь и все получится
Здравствуйте, Аноним, Вы писали:
А> s1.OnMouseMove:=StageMouseMove; //<<-- не реагирует
Чудес не бывает.
В первую очередь, можете посмотреть мою статью со вполне работающими примерами. Может, в результате найдете некую разницу.
Далее, идет нормальная отладка. Установите брейк на выделенной строке и посмотрите в ассемблерном окне, какой именно код сгенерирован для этой строки. Полагаю, он будет нормальным, но проверьте — что компилятор понимает Ваши извращения с указателями так же, как Вы. Откомпилируйте проект с опцией use debug dcu's, установите брейк в VCL в том месте, где должен идти вызов этого события и попробуйте туда прийти. Не получается — смотрите, почему. Получается — смотрите, почему "не реагирует".
Здравствуйте, Drago, Вы писали:
D>Во-первых смущает нотация записи. если я правильно понимаю, и pTStage=^TStage D>то почему ты на него ссылаешься не как s1^.property, а как s1.property? не есть гуд.
Это соглашение, введенное в дельфу для облегчения работы с объектами. В принципе — должно работать, хотя активно пользоваться этим я бы не стал.
D>а во-вторых... если эти TShape ты создаешь на своей форме, почему ты делаешь Create(Nil)?
А почему нет?
D>ну подумай, как будет назначен Owner новому компоненту?
Обычным образом.
Потому-то и не работает обработчик, ведь объект получается "висит в воздухе".
Здравствуйте, Drago, Вы писали:
D>Во-первых смущает нотация записи. если я правильно понимаю, и pTStage=^TStage D>то почему ты на него ссылаешься не как s1^.property, а как s1.property? не есть гуд.
Сие допустимо, если с точкой, или, скажем с [].
Другое дело, что нужды в использовании pTStage=^TStage
нет никакой.
D>а во-вторых... если эти TShape ты создаешь на своей форме, почему ты делаешь Create(Nil)? D>ну подумай, как будет назначен Owner новому компоненту? Потому-то и не работает обработчик,
Связи между назначением Owner и работой обработчиков нет никакой.
У Owner другие обязанности, RTFM TComponent.Owner
Т.е., создание компонентов с Owner=nil -вполне допустимая практика.