Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2015, 02:54   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию Tpanel и OnShow

Всем привет. Собственно вопрос достаточно простой и в заголовке уже по максимум описан )))

Для компонента, родитель которого является TPanel, нужно прилепить событие OnShow ...

Вот что у меня получилось ...

Код:
__fastcall TMyPanel::TMyPanel(TComponent* AOwner):TPanel(AOwner)
{
	this->OnShow = Shower;

}
void __fastcall TMyPanel::Shower(TObject *Sender){}

void __fastcall TMyPanel::OnShowing(TNotifyEvent Value){
	this->FOnShow = Value;
}

Код:
class TMyPanel: public TPanel  {
	private:
		TNotifyEvent FOnShow;
		void __fastcall OnShowing(TNotifyEvent Value);
	public:

		__fastcall TMyPanel(TComponent* AOwner);
		void __fastcall TMyPanel::Shower(TObject *Sender);
	__published:
	   __property TNotifyEvent OnShow = {read=OnShowing, write=OnShowing, stored=VisibleChanging};
};
В принципе фурычит не совсем... Событие срабатывает только при создании компонента + не затрагивается код в Shower, хотя OnShowing срабатывает ...
-Jack- вне форума Ответить с цитированием
Старый 09.09.2015, 11:37   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Если TPanel из VCL, то
Код:

class TMyPanel: public TPanel  
{
	private:
		
	public:

	__published:
	        __property OnShow;
};
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 09.09.2015, 15:08   #3
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Да, из VLC ... Но так я тоже пробовал ...
Выдает ошибку, ссылаюсь на свойство OnShow
Цитата:
E2303 Type name expected
Код:
	__published:
	   __property OnShow;
-Jack- вне форума Ответить с цитированием
Старый 09.09.2015, 17:08   #4
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
class PACKAGE TMyPanel : public TPanel
{
private:
	TNotifyEvent FOnShow;
protected:
	DYNAMIC void __fastcall VisibleChanging(void);
	
public:
	__fastcall TMyPanel(TComponent* Owner);

__published:
	__property TNotifyEvent OnShow = {read=FOnShow, write=FOnShow};
Код:
void __fastcall TMyPanel::VisibleChanging(void)
{
 	                if(this->Visible)
			{
				if(FOnShow)
					FOnShow(this);
			}
}
так попробуй.
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 10.09.2015 в 08:31.
Krok27 вне форума Ответить с цитированием
Старый 09.09.2015, 17:39   #5
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

попробовал так, не срабатывает ...
Цитата:
Сообщение от Krok27 Посмотреть сообщение
Код:
class PACKAGE TMyPanel : public TPanel
{
private:
	TNotifyEvent FOnShow;
protected:
	DYNAMIC void __fastcall VisibleChanging(void);
	
public:
	__fastcall TMyPanel(TComponent* Owner);

__published:
	__property TNotifyEvent OnShow = {read=FOnShow, write=FOnShow};
Код:
void __fastcall TMyPanel::VisibleChanging(void)
{
 	                if(this->Visible)
			{
				if(OnShow)
					OnShow(this);
			}
}

Решил попробовать немного переделать и добавить OnHide

Код:
__fastcall TMyPanel::TMyPanel(TComponent* AOwner):TPanel(AOwner){
	this->OnShow = Shower;
	this->OnHide = Hider;
}
void __fastcall TMyPanel::Shower(TObject *Sender){
	ShowMessage("Shower Event");
}

void __fastcall TMyPanel::Hider(TObject *Sender){
	ShowMessage("Hider Event");
}


void __fastcall TMyPanel ::VisibleChanging(void){
	if(this->Visible){
		if(OnShow)
			OnHide(this);
	} else {
		if(OnHide)
			OnShow(this);
	}
}
Код:
	private:
		TNotifyEvent FOnShow;
		TNotifyEvent FOnHide;
	public:
		__fastcall TMyPanel(TComponent* AOwner);
		void __fastcall Shower(TObject *Sender);
		void __fastcall Hider(TObject *Sender);
	protected:
		DYNAMIC void __fastcall VisibleChanging(void);
	__published:
	   __property TNotifyEvent OnShow = {read=FOnShow, write=FOnShow};
	   __property TNotifyEvent OnHide = {read=FOnHide, write=FOnHide};
Так начал в принципе код работать, но вот один нюанс, при создании объекта OnShow не срабатывает, объект нужно сначала спрятать, а потом снова показать ... после чего событие OnShow срабатывает...

Последний раз редактировалось -Jack-; 09.09.2015 в 17:51.
-Jack- вне форума Ответить с цитированием
Старый 10.09.2015, 08:31   #6
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Как проверяешь работу компонента?
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 10.09.2015, 16:08   #7
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

В смысле ? создаю объект, он создаётся, я его вижу на форме ...

Но при этом событие OnShow не срабатывает. И мне приходится, сначала спрятать его, затем снова показать, после чего только и срабатывает событие OnShow...
-Jack- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Cannot change Visible in OnShow OnHide???? FleXik Общие вопросы Delphi 6 14.07.2013 16:16
Событие OnShow формы Antoha Общие вопросы Delphi 4 12.02.2008 21:13
SplashForm.OnShow:=[] Volkogriz Общие вопросы Delphi 2 08.12.2007 16:58