Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Определение отображаемого фрейма


Автор: le0ne 29.1.2010, 17:00
Имеется следующая ситуация:
Форма, на форме PageControl с несколькими TabSheet'ами. На 1-м из tabsheet'ов в зависимости от выбора в listbox нужно отображать соответствующий Frame.
Фреймы создаю динамически:

Код

var 
 frWZ : TFrameWZ;
 frWP : TFrameWP;
 CurFr : TFrame;
begin
if (frWz = nil) or (CurFr <> frWz) then
    begin
    if Assigned(Curfr) then
        FreeAndNil(Curfr);
    frWZ := TframeWZ.Create(TabSheetView);
    frWZ.Parent := TabsheetView;
    frWZ.Align := alClient;
    Curfr := frWZ;       //для определения отображаемого фрейма 
    end;

if (frWp = nil) or (CurFr <> frWp) then
   begin
   if Assigned(Curfr) then
        FreeAndNil(Curfr);
   frWP := TframeWZ.Create(TabSheetView);
   frWP.Parent := TabsheetView;
   frWP.Align := alClient;
   Curfr := frWP;
   end;
end;

и так для нескольких кадров.  Иногда валится эксепшн "acces violation". Как правильно уничтожать старый frame и создавать новый?
И Как можно узнать отображаемый кадр без применения curFr;



Автор: shmelina 30.1.2010, 01:04
Ты переменные frWz и frWp не обнуляешь (не присваиваешь им nil).

У тебя, случаем, это не процедура с локальными переменными?

Автор: le0ne 31.1.2010, 18:44
Нет, все переменные глобальные...

Автор: kami 1.2.2010, 01:19
Может, не стоит так "бросаться" созданием-уничтожением фреймов на каждый "чих" пользователя?
Создать по экземпляру каждого 1 раз при инициализации приложения, хранить их в приватных_полях_формы/чего_нибудь_еще/в_глобальных_переменных.
При необходимости - "старому" фрейму делаем Parent:=nil, а новому - Parent:=то_что_нужно.
При закрытии приложения - всем фреймам делаем Parent:=nil и уничтожаем их не боясь ничего, кроме одного - форма будет уничтожена раньше, чем мы вызовем деструкторы фреймов (в результате фрейм, который имел Parent<>nil будет уничтожен, и когда мы попытаемся убить его вторично, будет больно...)

Вот без CurrentFrame как-то неособо получается, имхо - не стоит от него избавляться.

Автор: le0ne 1.2.2010, 13:45
Kami, shmelina, спасибо за ответы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)