Обработка события компонентами
От: Аноним  
Дата: 17.11.04 17:22
Оценка:
Не могу заставить созданные в runtime компоненты обрабатывать событие:

Есть объект в котором создаются компоненты:

cOkno=object
private
    sp_stage:TList;//Список этих компонетов
public
    procedure CreateAll;
end;

procedure cOkno.CreateAll;
var s1:pTStage; //  видоизмененный TShape
begin
......
    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, все равно не реагирует.
Re: Обработка события компонентами
От: alive Россия  
Дата: 17.11.04 19:04
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Обработчик события пробывал засовывать и в TfrmChild, и в cOkno, все равно не реагирует.


Довольно оригинальный подход Или вы используете KOL?
Вообще-то

Object types are supported for backward compatibility only. Their use is not recommended.


Создавать так наследников от TShape нельзя. И это компилируется? Даже не знаю, что посоветовать .
Ну хотя бы так создавайте
s1:= TShape.Create(TfrmChild);

Странный идентификатор pfrmChild. У вас там случайно не так написано:
pfrmChild = ^TfrmChild
TfrmChild = class(TForm)
... << RSDN@Home 1.1.4 beta 3 rev 230 >> <<Ария — Ночь короче дня>>
Keep yourself alive
Re: Обработка события компонентами
От: psm Россия  
Дата: 18.11.04 02:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>          new(s1);
А>          s1^:=TStage.Create(nil);


а почему б это не так написать:
  s1 := TStage.Create(nil);
... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: Обработка события компонентами
От: Аноним  
Дата: 18.11.04 05:53
Оценка:
Здравствуйте, alive, Вы писали:


А>>Обработчик события пробывал засовывать и в 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

Ну ведь как-то должно же работать?
Re[3]: Обработка события компонентами
От: psm Россия  
Дата: 18.11.04 07:19
Оценка:
Здравствуйте, Аноним, Вы писали:


А>s1 — этож указатель.


пардон, не заметил
Re: Обработка события компонентами
От: Drago Россия  
Дата: 18.11.04 07:38
Оценка:
Во-первых смущает нотация записи. если я правильно понимаю, и pTStage=^TStage
то почему ты на него ссылаешься не как s1^.property, а как s1.property? не есть гуд.

а во-вторых... если эти TShape ты создаешь на своей форме, почему ты делаешь Create(Nil)?
ну подумай, как будет назначен Owner новому компоненту? Потому-то и не работает обработчик,
ведь объект получается "висит в воздухе". Подправь и все получится
Re: Обработка события компонентами
От: Softwarer http://softwarer.ru
Дата: 18.11.04 07:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А> s1.OnMouseMove:=StageMouseMove; //<<-- не реагирует


Чудес не бывает.

В первую очередь, можете посмотреть мою статью со вполне работающими примерами. Может, в результате найдете некую разницу.

Далее, идет нормальная отладка. Установите брейк на выделенной строке и посмотрите в ассемблерном окне, какой именно код сгенерирован для этой строки. Полагаю, он будет нормальным, но проверьте — что компилятор понимает Ваши извращения с указателями так же, как Вы. Откомпилируйте проект с опцией use debug dcu's, установите брейк в VCL в том месте, где должен идти вызов этого события и попробуйте туда прийти. Не получается — смотрите, почему. Получается — смотрите, почему "не реагирует".
Re[2]: Обработка события компонентами
От: Softwarer http://softwarer.ru
Дата: 18.11.04 07:58
Оценка:
Здравствуйте, Drago, Вы писали:

D>Во-первых смущает нотация записи. если я правильно понимаю, и pTStage=^TStage

D>то почему ты на него ссылаешься не как s1^.property, а как s1.property? не есть гуд.

Это соглашение, введенное в дельфу для облегчения работы с объектами. В принципе — должно работать, хотя активно пользоваться этим я бы не стал.

D>а во-вторых... если эти TShape ты создаешь на своей форме, почему ты делаешь Create(Nil)?


А почему нет?

D>ну подумай, как будет назначен Owner новому компоненту?


Обычным образом.

Потому-то и не работает обработчик, ведь объект получается "висит в воздухе".

Хм. Теория отдает гуманитарщиной. Покажете фрагмент кода VCL, подтверждающий Ваше мнение?
Re[2]: Обработка события компонентами
От: Leonid Troyanovsky  
Дата: 18.11.04 08:07
Оценка:
Здравствуйте, Drago, Вы писали:

D>Во-первых смущает нотация записи. если я правильно понимаю, и pTStage=^TStage

D>то почему ты на него ссылаешься не как s1^.property, а как s1.property? не есть гуд.

Сие допустимо, если с точкой, или, скажем с [].
Другое дело, что нужды в использовании pTStage=^TStage
нет никакой.

D>а во-вторых... если эти TShape ты создаешь на своей форме, почему ты делаешь Create(Nil)?

D>ну подумай, как будет назначен Owner новому компоненту? Потому-то и не работает обработчик,

Связи между назначением Owner и работой обработчиков нет никакой.
У Owner другие обязанности, RTFM TComponent.Owner
Т.е., создание компонентов с Owner=nil -вполне допустимая практика.
--
С уважением, LVT
Re[4]: Обработка события компонентами
От: alive Россия  
Дата: 18.11.04 08:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А вот если сделать так

А>
А>s1.OnMouseMove:= TFrmChild.StageMouseMove;
А>

А>Пишет ошибку: несвопадения типов procedure and TMouseMoveEvent

А TFrmChild.StageMouseMove как объявлена?
И мой совет: может все-таки отказаться от object?
Keep yourself alive
Re[5]: Обработка события компонентами
От: Аноним  
Дата: 18.11.04 11:24
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, Аноним, Вы писали:



A>А TFrmChild.StageMouseMove как объявлена?




TFrmChild=class(TForm)
...
procedure StageMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);
private
public
end;

procedure TfrmChild.StageMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);
begin
       ...
end;


A>И мой совет: может все-таки отказаться от object?

Что вы имеете ввиду?
Re[6]: Обработка события компонентами
От: alive Россия  
Дата: 18.11.04 12:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>

А>TFrmChild=class(TForm)
А>...
А>procedure StageMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);
А>private
А>public
А>end;

А>procedure TfrmChild.StageMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);
А>begin
А>       ...
А>end;
А>


Странно. Должно работать.
Попробуйте просто с TShape
var
 Shape: TShape;
begin
 Shape:= TShape.Create(Nil);
 //Устанавливаете parent и т.д.
 Shape.OnMouseMove:= frmChild.StageMouseMove //где frmChild экземпляр TfrmChild
end;

А>Что вы имеете ввиду?

Объявления типа: cOkno = object.
Кстати а наследник от TShape как объявлен TStage = object(TShape) ?
Keep yourself alive
Re[7]: Ааа, вот я дурак!
От: Аноним  
Дата: 18.11.04 19:25
Оценка:
Здравствуйте, alive, Вы писали:


A>Странно. Должно работать.


оно и работало и по старому!

Я забыл что за день до того уже присваивал обработчик в другом месте, но потом удалил все из процедуры и она ничего не делала.

Всем спасибо, за ответы!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.