![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Теряется ссылка на 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]Всем спасибо. Можно не отвечать. Волшебным образом почему-то заработало само.