Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.04.2012, 18:27
ilya38 ilya38 вне форума
Прохожий
 
Регистрация: 26.04.2012
Сообщения: 5
Репутация: 10
По умолчанию Замена событий для всех однотипных компонентов (динамически созданных)

Доброго времени суток, сижу ломаю голову над следующей задачей ...

PHP код:
type
  TForm1 
= class(TForm)
    
PageControl1TPageControl;
    
TabSheet1TTabSheet;
    
TabSheet2TTabSheet;
    
procedure FormActivate(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;
  
mass : array [0..10of TTabSheet;
  
t_sh_count integer;
implementation

{$R *.dfm}

procedure OnEnterr(SenderTObject);
begin
ShowMessage
('hello');
end;

procedure TForm1.FormActivate(SenderTObject);
var
 
integer;
begin
  t_sh_count 
:= 0;
  for 
:= 0 to ComponentCount-do
  
begin
     
if Components[iis TTabSheet then
     begin
       
//mass[t_sh_count] := Components[i] as TTabSheet;
       
@(Components[i] as TTabSheet).OnEnter := @OnEnterr;
       
t_sh_count := t_sh_count 1;

     
end;
  
end;
  
ShowMessage(IntToStr(t_sh_count));

end

В крации опишу задачу, необходимо перехватить (заменить события для компонента TPageControl -> OnEnter и OnExit, таким образом хочу перехватить фокус и его потерю. И в этом Новом обработчике события получать доступ к некой глобальной переменной, и устанавливать её значения. Из нового обработчика получать настоящие, релятивные для PageControl, ActivePageIndex и ActivePage. Т.к в дальнейшем табсшиды будут создаваться динамически и на них другие компоненты. Надеюсь Объяснил(

Прикрипил файлик что натыкал, даже таким зверским методом не получилось, приветствую любую критику и советы....
Вложения
Тип файла: zip sample1.zip (415.3 Кбайт, 0 просмотров)
Ответить с цитированием
  #2  
Старый 26.04.2012, 18:37
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

OnEnter - должен быть методом класса TForm

Код:
procedure TForm1.OnEnterr(Sender: TObject);
begin
ShowMessage('hello');
end;
соответственно его нужно объявить в описании класса TForm1

и не
Цитата:
...@(Components[i] as TTabSheet).OnEnter := @OnEnterr;...
а
Код:
...(Components[i] as TTabSheet).OnEnter := OnEnterr;...
Ответить с цитированием
  #3  
Старый 26.04.2012, 18:45
ilya38 ilya38 вне форума
Прохожий
 
Регистрация: 26.04.2012
Сообщения: 5
Репутация: 10
По умолчанию

Шишь проверил одно по одному, даже в настройках проекта debug указал не выходит (
PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsComCtrls;

type
  TForm1 
= class(TForm)
    
PageControl1TPageControl;
    
TabSheet1TTabSheet;
    
TabSheet2TTabSheet;
    
procedure FormActivate(SenderTObject);
    
procedure OnEnterr(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;
  
mass : array [0..10of TTabSheet;
  
t_sh_count integer;
implementation

{$R *.dfm}

procedure TForm1.OnEnterr(SenderTObject);
begin
ShowMessage
('hello');
end;

procedure TForm1.FormActivate(SenderTObject);
var
 
integer;
begin
  t_sh_count 
:= 0;
  for 
:= 0 to ComponentCount-do
  
begin
     
if Components[iis TTabSheet then
     begin
       
//mass[t_sh_count] := Components[i] as TTabSheet;
       
(Components[i] as TTabSheet).OnEnter := OnEnterr;
       
t_sh_count := t_sh_count 1;

     
end;
  
end;
  
ShowMessage(IntToStr(t_sh_count));

end;

end
Ответить с цитированием
  #4  
Старый 26.04.2012, 19:02
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Если вам нужно получать фокус на заголовке страницы (там, где написано ее название), то это не OnEnter.
Переопределение работает - переключитесь на другую вкладку и мышу на "тело" страницы наведите.

З.Ы. OnEnter у меня не генерируется даже если закрепить в инспекторе объектов, использовал OnMouseEnter

Последний раз редактировалось cotseec, 26.04.2012 в 19:05.
Ответить с цитированием
Этот пользователь сказал Спасибо cotseec за это полезное сообщение:
ilya38 (26.04.2012)
  #5  
Старый 26.04.2012, 19:10
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Если я правильно понял суть, то вам нужно понимать какая из динамически созданных страниц (TTabSheet) сейчас активна и в зависимости от этого что-то там назначать?
Если так, то кто мешает все это делать при событии OnChange владельца страниц - PageControl1?
Ответить с цитированием
  #6  
Старый 26.04.2012, 19:17
ilya38 ilya38 вне форума
Прохожий
 
Регистрация: 26.04.2012
Сообщения: 5
Репутация: 10
По умолчанию

Был уверен что это Enter и Exit, а не шоу и хайд
PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsComCtrls;

type
  TForm1 
= class(TForm)
    
PageControl1TPageControl;
    
TabSheet1TTabSheet;
    
TabSheet2TTabSheet;
    
procedure FormActivate(SenderTObject);
    
procedure OnHidee(SenderTObject);
    
procedure TabSheet1Hide(SenderTObject);
    
procedure TabSheet2Hide(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;
  
mass : array [0..10of TTabSheet;
  
t_sh_count integer;
implementation

{$R *.dfm}

procedure TForm1.OnHidee(SenderTObject);
begin
ShowMessage
('ShowMessage from new Event)');

end;

procedure TForm1.TabSheet1Hide(SenderTObject);
begin
ShowMessage
('hide 1');
end;

procedure TForm1.TabSheet2Hide(SenderTObject);
begin
ShowMessage
('hide 2');
end;

procedure TForm1.FormActivate(SenderTObject);
var
 
integer;
begin
  t_sh_count 
:= 0;
  for 
:= 0 to ComponentCount-do
  
begin
     
if Components[iis TTabSheet then
     begin
       
//mass[t_sh_count] := Components[i] as TTabSheet;
       
(Components[i] as TTabSheet).OnHide := OnHidee;
       
t_sh_count := t_sh_count 1;

     
end;
  
end;
  
//ShowMessage(IntToStr(t_sh_count));

end;

end

Суперрр то что хотел получил, спасибо за оперативную помощЪ))
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:34.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025