Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Теряется ссылка на TabSheet   Найти похожие ветки 

 
Gedimen ©   (2012-04-08 16:30) [0]

Добрый день. Пишу из под 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.


 
Gedimen ©   (2012-04-08 16:54) [1]

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


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

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

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


 
Anatoly Podgoretsky ©   (2012-04-08 18:41) [3]

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

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


 
Sha ©   (2012-04-08 18:52) [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.


 
Gedimen ©   (2012-04-08 18:53) [5]


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


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


 
Gedimen ©   (2012-04-08 19:02) [6]


> 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.


 
Sha ©   (2012-04-08 19:21) [7]

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

think about it tomorrow



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.1 c
2-1334405334
lord827
2012-04-14 16:08
2013.03.22
межпоточная защита данных


15-1341492118
Unknown user
2012-07-05 16:41
2013.03.22
Определить или открыто главное меню


2-1330947283
Vyacheslav
2012-03-05 15:34
2013.03.22
Две формы: FormStyle=fsStayOnTop.. Form2 всегда выше Form1?


15-1342559770
Германн
2012-07-18 01:16
2013.03.22
Интересное значение "свободного места на диске" наблюл давеча


2-1347126804
Fr
2012-09-08 21:53
2013.03.22
"Общение" сайта и приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский