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

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

Теряется ссылка на TabSheet


Gedimen ©   (2012-04-08 16:30:00) 

Добрый день. Пишу из под RAD XE2. Застрял с такой проблемой.
Есть главная форма, на которой в подвале расположен PageControl. TabSheet'ы создаю автоматически, уничтожаю также. (должно получиться что-то типа заголовков открытых форм внизу главной формы. Приложение не MDI). Но тут есть проблема: "дочерних" форм у меня некоторое количество. У каждой формы в паблике объявлена переменная CurTabSheet: TTabSheet.Сделал для того, чтобы форма знала о своей вкладке и уничтожила (либо активировала ее когда необходимо). Используя такой код в обработчике создания формы:

procedure TFMain.N13Click(Sender: TObject);
var
 TabSheet: TTabSheet;
begin
 if (not Assigned(FStreet)) then // Форма списка
 begin
   FStreet := TFStreet.Create(Self);
   TabSheet := TTabSheet.Create(PControl);
   TabSheet.Caption := N13.Caption;
   TabSheet.PageControl := PControl;
   PControl.ActivePage := TabSheet;
   FStreet.CurTabSheet := TabSheet;
   FStreet.Show;
 end
 else
 begin
   SetForegroundWindow(FStreet.Handle);
   PControl.ActivePage := FStreet.CurTabSheet;
 end;
end;


все работает нормально. TabSheetсоздается и при закрытии формы FStreet уничтожается так:

procedure TFStreet.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CurTabSheet.Destroy;
 Release;
 FFStreet := nil;
end;


Но так как у меня форм много, то код получается раздутый если в обработчик создания каждой формы прописывать инструкцию для создания вкладок. Решил их вынести в отдельную функцию (процедуру, пробовал по разному).


function TFMain.G_CreateTabSheet(tabCaption: string):TTabSheet;
var
 TabSheet: TTabSheet;
begin
   TabSheet := TTabSheet.Create(Fmain.PControl);
   TabSheet.Caption := tabCaption;
   TabSheet.PageControl := Fmain.PControl;
   Fmain.PControl.ActivePage := TabSheet;

   Result:=TabSheet;
end;


А вот так любые манипуляции с переменной CurTabSheet формы FStreet приводят к исключительной ситуации.

Создаю форму:

TFMain.N13Click(Sender: TObject);
var
 TabSheet: TTabSheet;
begin
 if (not Assigned(FStreet)) then // Форма добавления дома
 begin
   FStreet := TFStreet.Create(Self); // создание Формы)
   //Создаю вкладку
   TabSheet:=G_CreateTabSheet(N10.Caption);
   //Здесь с TabSheet'ом еще можно делать все что угодно, возвращается нормально.

    //Передаю TabSheet в переменную CurTabSheet
   FStreet.CurTabSheet := TabSheet;
   
   FStreet.Show;
 end
 else
 begin
   SetForegroundWindow(FStreet.Handle); // активируем окно
 end;
end;


Но теперь из формы FStreet нельзя манипулировать с переменной CurTabSheet. Любое действие приводит к ошибке.

В чем проблема не могу понять. Уже пол инета излазил. Такое чувство, что во втором варианте при передачи в переменную теряется ссылка на TabSheet.


Sha   (2012-04-08 19:21:00) [1]

> Gedimen ©   (08.04.12 19:02) [6]

think about it tomorrow


Gedimen   (2012-04-08 19:02:00) [2]


> Use TabVisible to temporarily remove a tab sheet from a
> page control. When TabVisible is false, the tab does not
> appear in the page control and its TabIndex property is
> -1. Setting TabVisible to true allows the user to see the
> tab of the tab sheet again.


It's not that. I destroy the form at the closing. Therefore TabSheet also need to destroy.


Gedimen   (2012-04-08 18:53:00) [3]


> И вообще Free, а не Destroy.а на каком этапе ты манипулировал
> с CurTabSheet ?


Можно и Free. Мне главное, чтобы уничтожился.
Насчет этапа манипуляции с CurTabSheet, то выпадала ошибка при попытке (хотя бы) прочитать Caption вкладки из открытой формы FStreet, не говоря уже о Destroy или Free. Как я уже писал раньше все само собой заработало.


Sha   (2012-04-08 18:52:00) [4]

Use TabVisible to temporarily remove a tab sheet from a page control.
When TabVisible is false, the tab does not appear in the page control and its TabIndex property is -1.
Setting TabVisible to true allows the user to see the tab of the tab sheet again.


Anatoly Podgoretsky   (2012-04-08 18:41:00) [5]

> Gedimen  (08.04.2012 16:54:01)  [1]

Cтоило только сказать трах тибидох


Дмитрий С   (2012-04-08 17:37:00) [6]

в FormCloseQuery рано destroy делать еще. И вообще Free, а не Destroy.

а на каком этапе ты манипулировал с CurTabSheet ?


Gedimen   (2012-04-08 16:54:00) [7]

Всем спасибо. Можно не отвечать. Волшебным образом почему-то заработало само.


Наверх

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