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
Гость
|
|
« Ответ #1 : 08-05-2007 04:05 » |
|
|
|
|
Записан
|
|
|
|
Wel_Wel
Гость
|
|
« Ответ #2 : 08-05-2007 05:25 » |
|
Sheet.Free пробовал и Sheet.Visible := False то же. По идее в procedure TDM.QueryGroupAfterScroll(DataSet: TDataSet); если в начало прописать, то сначала должно удалит Sheet, а потом заново создать. Но постоянно что бы я не прописывал в процедуре, приложение вылетает с ошибкой AV.
|
|
|
Записан
|
|
|
|
x77
Модератор
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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #6 : 12-05-2007 13:30 » |
|
Wel_Wel, приведите, пожалуйста, весь код. мне кажется, что дело в том, что на момент перехода из Sheet (что это, кстати? и чем отличается от TTabSheet?) вкладка ещё не создана.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 12-05-2007 13:38 » |
|
Wel_Wel, x77, я не знаю, как в дельфях эта вещь устроена, но в VC , когда есть какой то косяк с вылетом , можно , не поставив никаких брейкпоинтов, запустить в режиме отладки, а потом спровоцировать ошибку. В этом случае студия показывает (правда не всегда... ) , на какой строчке споткнулись. И стек вызовов видно. Может есть что то подобное ? )
|
|
« Последнее редактирование: 12-05-2007 13:41 от Алексей1153++ »
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #8 : 12-05-2007 14:55 » |
|
Алексей1153++, это только в BDS
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #11 : 14-05-2007 09:31 » |
|
Алексей1153++, Borland Delphi Studio. там много вкусного в плане отладки и редактирования, начиная от трассировки dll и заканчивая code-folding'ом. короче, всё, что всегда было в Visual Studio, гении из Багланда, за 15 лет разроботок, додумались перетащит к себе.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #12 : 14-05-2007 15:06 » |
|
Offtopic: Алексей, не беспокойся, теперь ихний главный гений на службе в Майкрософт Поставлю в угол.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Wel_Wel
Гость
|
|
« Ответ #13 : 14-05-2007 21:39 » |
|
Ну Вы пока поболтайте. А то наверно больше негде? А я ничего! Подожду! Может когда нибудь кто-нибудь вспромнит! И ответит на мой вопрос!
|
|
« Последнее редактирование: 14-05-2007 21:48 от Wel_Wel »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 15-05-2007 04:29 » |
|
Offtopic: Wel_Wel, великодушно благодарим O:-) Поставлю в угол.
|
|
|
Записан
|
|
|
|
x77
Модератор
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 » |
|
А не происходит ли там банального пересечения событий?
|
|
|
Записан
|
|
|
|
|