Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать и удалить TabSheet в одной процедуре.  (Прочитано 15224 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Wel_Wel
Гость
« : 06-05-2007 23:12 » 

Всем привет! Подскажите пожалуйста можно ли - и если можно то как в этой процедуре, удалить созданные TabSheet'ы. Дело в том что на каждую строку DBGrid'а создается определенное количество TabSheet. И при переходе на следующую строку, нужно удалить созданные. Так как следующая строка создает новые. С созданием проблем нет, а вот удалить не получается. С каждой строкой TabSheet'ов все больше и больше. Единственное условие: На форму изначально кинул PageControl1 и TabSheet1, они не должны быть "задеты".
Код:
procedure TDM.QueryGroupAfterScroll(DataSet: TDataSet);
const H=500;
var   x, i : integer;      Str: string;    Node: TTreenode;   Sheet: array[1..H+1] of TTabSheet;
begin
 Str := '';
 x := QueryGroup.FieldByName('ID').ASInteger;
        Query2.SQL[3]:=('WHERE ParentGroup = "'+IntToStr(x)+'"');
          Query2.Open;
if QueryGroupT.Value = '1' then begin
  QueryComponent.SQL[3]:=('Where Group_ID = :ID')
end else
if QueryGroupT.Value = '0' then  begin
 QueryComponent.SQL[3]:=('');
end;
  QueryComponent.Open;
 for i := 0 to  Query2.RecordCount -1 do begin
    Str:= DM.Query2.FieldByName('Name_R').AsString;
if  Str = '' then begin  Exit end else
  Query2.Next;
    Sheet[i] := TTabSheet.Create(Self);
     Sheet[i].PageControl := MainForm.PageControl1;
      Sheet[i].Caption := Str;
        Node.data := Sheet[i];
         Sheet[i].tag := Integer(Node);
          Sheet[i].Font.Style:= [];
        Str:= '';
   end;
end;
 С Уважением. Не понял
« Последнее редактирование: 07-05-2007 00:00 от Wel_Wel » Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #1 : 08-05-2007 04:05 » 

Код:
Sheet[i].Free
не пробовал?
Записан
Wel_Wel
Гость
« Ответ #2 : 08-05-2007 05:25 » 

Sheet.Free пробовал и Sheet.Visible := False то же.  По идее в
procedure TDM.QueryGroupAfterScroll(DataSet: TDataSet); если в начало прописать, то сначала должно удалит Sheet, а потом заново создать. Но постоянно что бы я не прописывал в процедуре, приложение вылетает с ошибкой AV.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 08-05-2007 10:44 » 

можно увидеть пример того, что ты прописываешь? как было справедливо отмечено выше, Free вполне корректно удаляет вкладку. складывается впечатление, что дело не во Free. а, например, в том, что при удалении указывается диапазон от 0 до Count.

есть ещё один вариант: при создании владельцем указывать не Self (форму), а сам PageControl. тогда вместо удаления всех "шитов" можно просто снести весть PageControl. и пересоздать, соответственно. насколько я пониманию, при таком варианте утечек памяти не будет.
Записан

DemonicAlligator
Гость
« Ответ #4 : 10-05-2007 07:42 » 

А вообще, в чём задача-то? Может, просто выбран слишком сложный вариант реализации? Улыбаюсь
Записан
Wel_Wel
Гость
« Ответ #5 : 12-05-2007 01:43 » 

Для х77! Вы правы нужен был диапазон от 0 до Count, а точнее:
Код:
for i :=MainForm.PageControl1.PageCount - 1 downto 0 do
  if MainForm.PageControl1.Pages[i] <> MainForm.TabSheet1 then
    MainForm.PageControl1.Pages[i].Free;

Но теперь если, перехожу в DBGridGroup из Sheet, то вижу пустой TabSheet1 и на любой следующий шаг выскакивает Access Violation. Но если перехожу в DBGridGroup из TabSheet1 то все нормально. Думаю что дело в фокусе. Подскажите пожалуйста как это можно исправить. С Уважением.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 12-05-2007 13:30 » 

Wel_Wel, приведите, пожалуйста, весь код. мне кажется, что дело в том, что на момент перехода из Sheet (что это, кстати? и чем отличается от TTabSheet?) вкладка ещё не создана.
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #7 : 12-05-2007 13:38 » 

Wel_Wel, x77, я не знаю, как в дельфях эта вещь устроена, но в VC , когда есть какой то косяк с вылетом , можно , не поставив никаких брейкпоинтов, запустить в режиме отладки, а потом спровоцировать ошибку. В этом случае студия показывает (правда не всегда... ) , на какой строчке споткнулись. И стек вызовов видно. Может есть что то подобное ? )
« Последнее редактирование: 12-05-2007 13:41 от Алексей1153++ » Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 12-05-2007 14:55 » 

Алексей1153++, это только в BDS Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #9 : 12-05-2007 15:02 » 

x77, а это что такое ? )
Записан

Wel_Wel
Гость
« Ответ #10 : 12-05-2007 18:57 » 

В модуле
Код:
procedure TDM.QueryGroupAfterScroll(DataSet: TDataSet);
var x, i : integer;      Str: string;    Node: TTreenode;
    Sheet: array[1..H] of TTabSheet;
begin   Str:= '';
 x := QueryGroup.FieldByName('ID').ASInteger;
        Query2.SQL[3]:=('WHERE ParentGroup = "'+IntToStr(x)+'"');
          Query2.Open;
if QueryGroupT.Value = '1' then begin
   QueryComponent.SQL[3]:=('Where Group_ID = :ID')
end else
if QueryGroupT.Value = '0' then  begin
 QueryComponent.SQL[3]:=('');
end;
  QueryComponent.Open;
for I := MainForm.PageControl1.PageCount - 1 downto 0 do
  if MainForm.PageControl1.Pages[I] <> MainForm.TabSheet1 then
    MainForm.PageControl1.Pages[I].Free;
for i := 0 to  Query2.RecordCount -1 do begin
    Str:= DM.Query2.FieldByName('Name_R').AsString;
if  Str = '' then begin  Exit end else
   Query2.Next;
    Sheet[i] := TTabSheet.Create(Self);
     Sheet[i].PageControl := MainForm.PageControl1;
      Sheet[i].Caption := Str;
        Node.data := Sheet[i];
         Sheet[i].tag := Integer(Node);
          Sheet[i].Font.Style:= [];
        Str:= '';
        end
end;
и в MainForm
Код:
procedure TMainForm.PageControl1Change(Sender: TObject);
begin
if PageControl1.ActivePage.Caption <> 'Все....' then begin
   DBGridComponent.Parent := PageControl1.ActivePage;
   DM.QueryComponent.SQL[3]:=('Where C.Razdel = "'+PageControl1.ActivePage.Caption+'"');
     end else
if PageControl1.ActivePage.Caption = 'Все....' then
   DM.QueryComponent.SQL[3]:= ('Where Group_ID = :ID');
   DBGridComponent.Parent := PageControl1.ActivePage;
   DM.QueryComponent.Open ;
end;
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #11 : 14-05-2007 09:31 » 

Алексей1153++, Borland Delphi Studio. там много вкусного в плане отладки и редактирования, начиная от трассировки dll и заканчивая code-folding'ом. короче, всё, что всегда было в Visual Studio, гении из Багланда, за 15 лет разроботок, додумались перетащит к себе.
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 14-05-2007 15:06 » 

Offtopic:

Алексей, не беспокойся, теперь ихний главный гений на службе в Майкрософт Улыбаюсь
Поставлю в угол.
Записан

ещё один вопрос ...
Wel_Wel
Гость
« Ответ #13 : 14-05-2007 21:39 » 

Ну Вы пока поболтайте. А то наверно больше негде? А я ничего! Подожду! Может когда нибудь кто-нибудь вспромнит! И ответит на мой вопрос!
« Последнее редактирование: 14-05-2007 21:48 от Wel_Wel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #14 : 15-05-2007 04:29 » 

Offtopic:

Wel_Wel, великодушно благодарим Улыбаюсь O:-)
Поставлю в угол.

Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #15 : 15-05-2007 10:06 » 

Wel_Wel, я помню, пока смотрю на код и пытаюсь думать, извини Улыбаюсь

пока грешу на событие PageControl1.OnChage. с какой целью там ДБГридом жонглируется?
Записан

Wel_Wel
Гость
« Ответ #16 : 15-05-2007 13:16 » 

Спасибо! Ждем!
С Уважением.
Записан
DemonicAlligator
Гость
« Ответ #17 : 15-05-2007 14:47 » 

А не происходит ли там банального пересечения событий?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines