Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание указателя на компонент 
V
    Опции темы
Proxin
Дата 25.9.2011, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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


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

Это сообщение отредактировал(а) northener - 25.9.2011, 23:57


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Proxin
Дата 26.9.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



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

Это сообщение отредактировал(а) Proxin - 26.9.2011, 00:01
PM MAIL   Вверх
northener
Дата 26.9.2011, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Proxin
Дата 26.9.2011, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



Код

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;


Это сообщение отредактировал(а) Proxin - 26.9.2011, 01:22
PM MAIL   Вверх
northener
Дата 26.9.2011, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 26.9.2011, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(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 без собаки 

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


Это сообщение отредактировал(а) bems - 26.9.2011, 04:18


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Proxin
Дата 26.9.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 21.6.2008

Репутация: 1
Всего: 3



благодарю. всё заработало. 

Это сообщение отредактировал(а) Proxin - 26.9.2011, 14:43
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.