Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

динамический pagecontol и событие к нему [D7, XP]


Тимоха111 ©   (2010-12-27 02:58:00) 

Всем доброго времени суток!
Создаю pagecontrol динамически, на нем динамически создаются табы
 pcontrol := TPageControl.Create(nil);
 pcontrol.Parent := TabParent;
 pcontrol.Align := alClient;
 pcontrol.OnChange := OnMyClick;

Событие onmyclick
procedure TForm1.OnMyClick(Sender: TObject);
begin
 if Sender is TPageControl then
   (findcomponent(format('html_text%d', [Sender.TabIndex])) as THTMLStaticText).HTMLText.Text := (mymass[Sender.TabIndex][1]);
end;


но sender категорически отказывается воспринимать pagecontrol, как прикрутить вновь созданному pagecontrol событие?


Ega23   (2010-12-27 17:01:00) [1]

Ну так и храни свой PageControl в видк ссылки, в чём проблема?


Тимоха111   (2010-12-27 16:57:00) [2]

Есть массив в него попадают текстовые данные. Далее я создаю динамически pagecontrol и табу к немы, на этих табах создаются компонеты для вывода текста из массива. Собственно все, потом по табам щелкаю и вижу что в массиве.


Ega23   (2010-12-27 16:44:00) [3]


> Не могли бы вы подсказать как будет верно для данной задачи?


Дык задачу озвучить надо, для начала.


Тимоха111   (2010-12-27 16:42:00) [4]

Не могли бы вы подсказать как будет верно для данной задачи?
Спасибо


Ega23   (2010-12-27 13:59:00) [5]


> Вы правы! Nil был виною)))


Nil был виною тому, что FindComponent не работал.
Но, ИМХО, идеология всё равно выбрана неверно.


Тимоха111   (2010-12-27 13:40:00) [6]

Вы правы! Nil был виною)))
поставил self - заработало!!! Спасибо Ega23


Ega23   (2010-12-27 12:42:00) [7]

Кстати.

pcontrol := TRzPageControl.Create( nil);
.......
for i := 0 to length(mymass) - 1 do
begin
  TabSheet := TrzTabSheet.Create( Self);
.....


Я всего кода не видел, возможно он и вправду корректен. Но я на 99% уверен, что у тебя мемлик.


Ega23   (2010-12-27 12:35:00) [8]


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



unit Unit3;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
 TForm3 = class(TForm)
   Button1: TButton;
   Panel1: TPanel;
   Label1: TLabel;
   procedure FormCreate(Sender: TObject);
 private

   procedure OnPageControlChange(Sender: TObject);

 end;

var
 Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var
 pc: TPageControl;
 ts: TTabSheet;
 i: Integer;
begin
 pc := TPageControl.Create(Self);
 pc.Parent := Panel1;
 pc.Align := alClient;
 pc.OnChange := OnPageControlChange;

 for i := 1 to 5 do
 begin
   ts := TTabSheet.Create(Self);
   ts.PageControl := pc;
   ts.Caption := 'Tab' + IntToStr(i);
 end;

end;

procedure TForm3.OnPageControlChange(Sender: TObject);
begin
 if Sender is TPageControl then
   Label1.Caption := TPageControl(Sender).ActivePage.Caption;
end;

end.


Тимоха111   (2010-12-27 12:18:00) [9]

парднон, да заметил, procedure ADD(PageC:TPageControl;OnMyChange:TNotifyEvent);
а вызываешь ты ADDForum(RzPageControl2,OnButtonClick);
тут я просто менял pagecontrol, решил другой попробовать и с код поперепутал, но проблема осталась. Как не использую? мне нужно создать динамически pagecontrol  и присвоить его событие по смене вкладки свое событтие.


v_a_belousov   (2010-12-27 04:58:00) [10]


> Add(PageControl1, ButtonClick);


> procedure ADD(PageC:TPageControl;OnMyChange:TNotifyEvent);

Вот в этом вопрос где ты тут используешь полученные параметры...


v_a_belousov   (2010-12-27 04:56:00) [11]


> Тимоха111

Я не знаю что ты там делаешь... целиком ты ничего не показываешь!!!
Почему у тебя
procedure ADD(PageC:TPageControl;OnMyChange:TNotifyEvent);
а вызываешь ты ADDForum(RzPageControl2,OnButtonClick);
Зачем тебе параметры процедуре если ты их не используешь...
pcontrol := TRzPageControl.Create(nil);
pcontrol.OnChange := OnButtonClick;
И попробовал сам набросать примерно то что у тебя все работает:

procedure ADD(PageC:TPageControl;OnMyChange:TNotifyEvent);
var pcontrol: TPageControl;
TabSheet: TTabSheet; i: integer;
begin
pcontrol := TPageControl.Create(nil);
pcontrol.Top := 0;
pcontrol.Left := 0;
pcontrol.Width := 300;
pcontrol.Height := 250;
pcontrol.OnChange := Form1.ButtonClick;
Form1.InsertControl(pcontrol);
for i := 0 to 3 do
begin
  TabSheet := TTabSheet.Create(nil);
  TabSheet.Caption := 'Çàêëàäêà ¹'+IntToStr(i+1);
  TabSheet.PageControl := pcontrol;
end;

end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
if Sender is TPageControl then
  TLabel(FindComponent('Label'+IntToStr(TPageControl(Sender).TabIndex))).Caption := IntToStr(TPageControl(Sender).TabIndex);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Add(PageControl1, ButtonClick);
end;


Тимоха111   (2010-12-27 04:11:00) [12]

Обработчик события выглядит так:
procedure TForm1.OnButtonClick(Sender: TObject);
begin
 if Sender is TPageControl then
   (findcomponent(format('html_text%d', [(Sender as TPageControl).TabIndex])) as THTMLStaticText).HTMLText.Text := (mymass[(Sender as TPageControl).TabIndex][1]);
end;

И все вроде ничего работало, пока не решил я создать отдельную процедуру создания pagecontrol и табов к нему.


procedure ADD(PageC:TPageControl;OnMyChange:TNotifyEvent);
...
...
pcontrol := TRzPageControl.Create(nil);
 pcontrol.Parent := TabParent;
 pcontrol.Align := alClient;
 pcontrol.TabOrientation := toLeft;
 pcontrol.TabStyle := tsRoundCorners;
 pcontrol.OnChange := OnButtonClick;

 for i := 0 to length(mymass) - 1 do
 begin
   TabSheet := TrzTabSheet.Create(Self);
   TabSheet.Caption := mymass[i][0];
   TabSheet.PageControl := pcontrol;
...
 end;


Вызываю:
ADDForum(RzPageControl2,OnButtonClick);
Вылетает ошибка AccessViolation ....
компилятор показывает на строчку
  (findcomponent(format('html_text%d', [(Sender as TPageControl).TabIndex])) as THTMLStaticText).HTMLText.Text := (mymass[(Sender as TPageControl).TabIndex][1]);


Германн   (2010-12-27 03:08:00) [13]


> Всем доброго времени суток!
> Создаю pagecontrol динамически, на нем динамически создаются
> табы
>

Ну и где код, в котором "динамически создаются табы"?

> но sender категорически отказывается

И я его понимаю. :)


Тимоха111   (2010-12-27 03:04:00) [14]

вопрос решен
(Sender as TPageControl)


Наверх

Титульная страница Поиск, карта сайта Написать письмо