Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Создание указателя на компонент


Автор: Proxin 25.9.2011, 23:23
Вопрос поставил меня в тупик. Создаю компонент, наследник от TComponent, и один из его методов создаёт никак не связанную с ним форму. При клике на этой форме должно вызываться событие OnSampFormClick моего компонента. Вопрос заключается в следующем - как это реализовать, как дать понять форме, что её "родил" именно мой компонент? Единственный выход, который я вижу - создавать в форме public FPrent:pointer, присвоив ему при создании формы указатель на компонент и в перекрытом методе click формы вызыать TMyCP(fprent^).onsampformclick. собственно, так не получается: если присвоить в tmycp tempfrm.fprent:=@self, то при клике на форму получится acess violaton, а до других способов пока не додумался. Подскажите, пожалуйста.

Автор: northener 25.9.2011, 23:56
Цитата(Proxin @  25.9.2011,  23:23 Найти цитируемый пост)
Единственный выход, который я вижу - создавать в форме public FPrent:pointer, присвоив ему при создании формы указатель на компонент и в перекрытом методе click формы вызыать TMyCP(fprent^).onsampformclick.


Купить/скачать какую нибудь книжку/учебник по Дельфи, а не по паскалю.
P.S. "Шляпки" в коде Дельфи - есть признак либо незнания, либо "копипаста".

Автор: Proxin 26.9.2011, 00:00
раз вы умный, то подскажите - лучше всего запоминается на примерах. и почему шляпки - глупость? это ж разыменование указателя.
по этому вопросу я по сети ничего не нашёл - иначе бы не пришёл сюда.

Автор: northener 26.9.2011, 00:14
Цитата(Proxin @  26.9.2011,  00:00 Найти цитируемый пост)
и почему шляпки - глупость? это ж разыменование указателя.
по этому вопросу я по сети ничего не нашёл - иначе бы не пришёл сюда.

Это действительно "разыменование указателя". Но эта шляпка нам досталась от Турбо Паскаля.
В Дельфи эта "шляпка" не нужна!
Если нужен реальный совет/ответ, приведите реальный пример кода.

P.S."Раз вы Умный"
На первый раз прощаю.

Автор: Proxin 26.9.2011, 01:20
Код

tmyform=class(tform)
protected
procedure click;override;
public
fpar:pointer;
end;
tmycomp=class(tcomponent)
...
private
mf:tmyform;
public
procedure doformvisible;
published
property onformclick:tnotifyevent read fonc write fonc;
end;
implementation
procedure tmyform.click;
begin
if assigned(tmycomp(fpar^).onformclick) then tmycomp(fpar^).onformclick(self); //тут ошибка
end;
...
procedure tmycomp.doformvisible;
begin
mf:=tmyform.create(nil);
mf.fpar:=@self;
mf.show;
end;

Автор: northener 26.9.2011, 02:30
Цитата(Proxin @  26.9.2011,  01:20 Найти цитируемый пост)
if assigned(tmycomp(fpar^).onformclick)

Бред.
Что по-вашему означает fpar^?

Автор: bems 26.9.2011, 04:14
Цитата(Proxin @  25.9.2011,  23:23 Найти цитируемый пост)
Единственный выход, который я вижу - создавать в форме public FPrent:pointer, присвоив ему при создании формы указатель на компонент

1. Вместо публичного поля лучше приватное, а устанавливать его, добавив форме конструктор с соответствующим параметром.
2. Все переменные классовых типов и так физически являются указателями (но не нуждаются в явном разыменовании). Поэтому поле объявлять нужно не Pointer а сразу tmycomp. Ну или если циклические ссылки юнитов не позволяют, то просто TComponent
3. Вместо создания собственного поля можно использовать свойство Owner формы (если я правильно понял что форма не должна жить дольше чем создавший её компонент)

Цитата(Proxin @  25.9.2011,  23:23 Найти цитируемый пост)
если присвоить в tmycp tempfrm.fprent:=@self, то при клике на форму получится acess violaton
Поскольку self это предопределенная переменная классового типа, то она уже указатель. Значит @self - указатель на указатель (и первый из них при этом живет не долго). Просто используй self без собаки 

Явное разыменование (^) можешь использовать (для классических указателей а не классовых ссылок ессно), тем более что со времен турбопаскаля всё еще остались места где без него не обойтись

Автор: Proxin 26.9.2011, 14:43
благодарю. всё заработало. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)