Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2009, 03:21   #1
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
Печаль Destroy формы

Столкнулся с тем, что после выполнения destroy указатель на форму не становиться равным nil, хотя по идеи должен был =)

Или я на ночь глядя туплю???
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 04.10.2009, 10:42   #2
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

А он и не должен
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 04.10.2009, 22:27   #3
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

лана поставим по другому вопрос... вообще у меня динамический массив экземпляров формы...короче вот:
Код:
Type
...
TMotherForm = class(TForm)
....
TForms=array of TMotherForm;// хотя в перспективе создать отдельный класс =))))
...
var
  FForms:TForms;
...
{Деструктор класса TMotherForm}
destructor TMotherForm.destroy;
var
  i:Integer;
begin
  for i:=Self.index to length(FForms)-2 do
  begin
    FForms[i]:=FForms[i+1];
  end;
  setlength(FForms,length(FForms)-1);
  inherited destroy;
end;
...
{вот так мы создаем форму}
procedure ShowForm(FormNumber:integer);
{FormNumber вляет на название формы =))).... короче не обращайте внимание на него}
begin
    SetLength(FForms,length(FForms)+1);
    FForms[length(FForms)-1]:=TMotherForm.Create(...);
    FForms[length(FForms)-1].Show;
end;

{обработчик события закрытия формы}

procedure TMotherForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Self.free;
end;

...

{обрабтчик события нажития кнопки после чего вылезает ошибка чтения памяти, при чем через раз =(((}

procedure TMotherForm.BackButtonClick(Sender: TObject);
begin
  if FNumber > 1 then
    ShowForm(FNumber-1);
  Self.Close;
end;
Короче говоря выползает ошибка... не знаю почему =\\\ И что то мне на более бодорствующую глову подсказывает, что проблема связана тем, что мы вытворяем в деструктуре с указателем на форму,... =(.... короче говоря где я туплю??? часом не из-за того, что я теряю указатель на форму которая пока что занята своей деструкцией.... =(????
Помог? Ну так нажми на весы!

Последний раз редактировалось SNUPY; 04.10.2009 в 22:39.
SNUPY вне форума Ответить с цитированием
Старый 05.10.2009, 10:49   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
procedure TMotherForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Self.free;
end;
Вот это ты здря.
Вообще зачем тебе формы так уничтожать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.10.2009, 18:12   #5
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Stilet


нууу... типо не известно сколько пользователь заблогорассудит ипользовать и попутно выключать.... вот и решил я так построить логику приложения... а ваши предложения каковы???
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 06.10.2009, 09:49   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а ваши предложения каковы???
Оч просты - При создании формы пихать в TObjectList.
А удалять их только при закрытии главной формы, освобождая TObjectList.
Впрочем есть другой вариант:
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:=caFree
end;
т.е. обработчик закрытия формы будет просить ее исчезнуть самостоятельно, и тебе не придется заботится о ее ручной освобождении
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.10.2009, 18:55   #7
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Stilet

Код:
 Action:=caFree
ЭТО АЙС!!!! Спасибо большое за информацию!!!!

Вопрос не в тему... но всетаки интересно... у меня иногдк вылетал вместо ошибки памяти AbstractError... я только с этой ошибкой сталкивался тогда, когда абстрактные методы забывал "заменить" в экземплярах класса, а у TForm вроде бы нет абстрактных методов... в чем возможна проблема??? Хотя после внесенных изменений проблема больше не вылетала =))) за что большое спасибо =)))

вот на всяк полное "тело" мое потомка TForm:

Код:
  TMotherForm = class(TForm)
    ToolsGroupBox: TGroupBox;
    SaveBtn: TButton;
    PrintBitBtn: TBitBtn;
    BackButton: TButton;
    AddDownRowBtn: TButton;
    DeleteBtn: TButton;
    CloseButton: TButton;
    NextBitBtn: TBitBtn;
    OpenBitBtn: TBitBtn;
    AddUpRowBtn: TButton;
    CopyBtn: TButton;
    PasteBtn: TButton;
    NoteGroupBox: TGroupBox;
    StringGrid: TStringGrid;
    RichEdit1: TRichEdit;
    procedure FormResize(Sender: TObject);
    procedure SetGridFields(SqlTable:TSQLiteTable);
//    procedure OpenBlank(RowNumber:integer);
    procedure OpenNote(DB:TSQLiteDatabase; Grid:TStringGrid; codition:string);
    procedure OpenBitBtnClick(Sender: TObject);
    procedure StringGridDblClick(Sender: TObject);
    procedure AddUpRowBtnClick(Sender: TObject);
    procedure OpenForm(DB:TSQLiteDatabase; Grid:TStringGrid; condition:string);
    procedure OpenForm1(DB:TSQLiteDatabase; Grid:TStringGrid; condition:string);
    procedure OpenForm2(DB:TSQLiteDatabase; Grid:TStringGrid; condition:string);
    procedure OpenForm3(DB:TSQLiteDatabase; Grid:TStringGrid; condition:string);
    procedure OpenForm4(DB:TSQLiteDatabase; Grid:TStringGrid; condition:string);
    procedure OpenForm5(DB:TSQLiteDatabase; Grid:TStringGrid; condition:string);
    procedure OpenForm6(DB:TSQLiteDatabase; Grid:TStringGrid; condition:string);
    procedure InsertRowForm1(DB:TSQLiteDatabase; reportPeriod:string;
      SortIndex:string);
    procedure InsertRowForm2(DB:TSQLiteDatabase; reportPeriod:string;
      SortIndex:string);
    procedure InsertRowForm3(DB:TSQLiteDatabase; reportPeriod:string;
      SortIndex:string);
    procedure InsertRowForm4(DB:TSQLiteDatabase; reportPeriod:string;
      SortIndex:string);
    procedure InsertRowForm5(DB:TSQLiteDatabase; reportPeriod:string;
      SortIndex:string);
    procedure InsertRowForm6(DB:TSQLiteDatabase; reportPeriod:string;
      SortIndex:string);
    procedure AddDownRowBtnClick(Sender: TObject);
    procedure DeleteBtnClick(Sender: TObject);
    procedure NextBitBtnClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CloseButtonClick(Sender: TObject);
    procedure BackButtonClick(Sender: TObject);
    procedure PrintBitBtnClick(Sender: TObject);
  private
    DB:TSQLiteDatabase;
    Codition:String;
    FormData:PCathedrData;
    Month, Age:integer;
  public
    index:Integer;
    FNumber:Integer;
    Constructor Create(FormNumber:Integer; InputFormData:PCathedrData; InputMonth,
      InputAge:integer; inputDB:TSQLiteDatabase; Inputindex:integer); overload;
    destructor Destroy; overload;
    procedure ShowForm(FormNumber:integer);
  end;
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 08.10.2009, 23:43   #8
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Теперь я значит разообрался почему ошибка не вылетает =))) у формы не срабатывает деструктор =\\\

интересно... сам код на деструкторе не срабатывает, а на OnDestroy срабатывает....
ругаеться каждый раз на это:

Код:
{здесь FormsList это TObjectList список хранящий указатели на экземпляры класса TMotherForm}
procedure TMotherForm.FormDestroy(Sender: TObject);
var
  i:integer;
begin
  for i:=0 to FormsList.Count-1 do
  begin
    if TMotherForm(FormsList.Items[i])=Self then
    begin
      FormsList.Delete(i);
      break;
    end;
  end;
end;
теперь немного подумав пришел к мнению, что мы удаляем еще не заверший свои дела объект....а нельзя ли просто "потерять" указатель на Форму и пусть она себе там "убиваеться" на здоровье... =)))... или как хотя бы узнать по указателю на форму "мертва" она или нет????
Помог? Ну так нажми на весы!

Последний раз редактировалось Stilet; 09.02.2010 в 10:57.
SNUPY вне форума Ответить с цитированием
Старый 09.02.2010, 10:55   #9
PVD
Пользователь
 
Аватар для PVD
 
Регистрация: 31.12.2009
Сообщений: 97
По умолчанию

Добрый день та же проблема только с элементом Tpanel
PVD вне форума Ответить с цитированием
Старый 09.02.2010, 11:02   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
if TMotherForm(FormsList.Items[i])=Self then
Будь проще
Код:
var FormsList:TObjectList; i:integer;
begin
 i:=FormsList.IndexOf(self);
 if i<>-1 then FormsList.Delete(i);
end;
Между прочим, а сам FormsList случайно не поле класса формы, которую ты разрушаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DBGrid.destroy; - ? Evgenii Компоненты Delphi 3 01.09.2009 08:26
destroy динамического tabSheet-a-? havok Общие вопросы Delphi 2 29.08.2009 19:41
Как сделать границы формы другого цвета,формы?? Дима я Общие вопросы Delphi 3 22.06.2009 07:24
Обращение из формы в dll к элементу главной формы (delphi) a_n_n_a Помощь студентам 3 10.05.2009 04:00
NForm.Destroy; Манжосов Денис :) Общие вопросы Delphi 3 03.08.2008 22:42