Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.06;
Скачать: CL | DM;

Вниз

Abstract Error   Найти похожие ветки 

 
proc ©   (2002-05-23 19:06) [0]

Ситуация:

В MDI проге создается форма


procedure TMainForm.Button1Click(Sender: TObject);
begin
FormNew := TFormNew.Create(Self);
CreateTab(FormNew); // Смотри ниже
end;


А так же создается закладка на PageControl

procedure TMainForm.CreateTab (Sender: TObject);
begin
with PageControl1 do
begin
PieceTab := TTabSheet.Create(FormNew);
end;
with PieceTab do
begin
PageControl := PageControl1;
Caption := (Sender as TForm).Caption;
end;
end;


Далее в этой форме есть код при закрытии

procedure TFormNew.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
MainForm.PieceTab.Free; // Удаление закладки на основной форме
end;


Иногда при повторном создании формы вылетает сообщение Abstract Error.

Вопрос: Где я не прав?


 
Song ©   (2002-05-23 21:23) [1]

А что за TFormNew? Наследник? Приведите описание класса.


 
Cobalt ©   (2002-05-24 08:03) [2]

>Вопрос: Где я не прав?
Ответ: очень во многих местах. Первая ошибка начинающих работать с MDI - Использование экземпляров форм в модулях,а надо обращаться через MainForm.MDIChildren, ActiveMDIChild, и не надо забывать о приведении типов MainForm.MDIChildren[i] к вашему типу.
При создании динамических компонент, надо продумывать, как вы к ним будете обращаться (особенно в MDI-контексте, ведь у вас несколько форм) - Выбор/поиск дочерней формы->выбор/поиск компонента.
Есть метод создания имен с использованием индексов, т.е. имени дочерней формы присваивается типа "MyForm"+ Inttostr(i);, подобное же и для их компонентов (вложенное типа Owner.Name+"TabControl"+Inttostr(i)(для нескольких компонентов))


 
jonik pegas ©   (2002-05-24 08:31) [3]

Удивительно что ошибка вылетает иногда:-)
PieceTab у тебя автоматом удалится при TformNew.FormClose поскольку FormNew его владелец (только надо TTabSheet.Create(Sender)) ,Free делать не надо кроме всего прочего при создании нескольких экземпляров формы MainForm.PieceTab будет указывать на один и тот же PieceTab(последний созданный)-когда первый экземпляр мод.формы грохнется второй при грохании (MainForm.pieceTab.free) будет пытатся удалить pieceTab которого уже нет. Я бы перенес например PieceTab в public модальной и скажем его создание
procedure TMainForm.CreateTab (Sender: TObject);
begin
with PageControl1 do
begin
(Sender as TmainForm).PieceTab := TTabSheet.Create(Sender);
end;
with (Sender as TmainForm).PieceTab do
begin
PageControl := PageControl1;
Caption := (Sender as TForm).Caption;
end;
end;
А можно PieceTab создавать в Create FormNew и потом ему присваивать PageControl



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

Текущий архив: 2002.06.06;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.01 c
1-18057
Zev
2002-05-24 16:22
2002.06.06
C++Builder. Список доступных серверов ( MSSQL)


1-18034
mvg_first
2002-05-24 17:07
2002.06.06
Как перевести количество секунд от начала дня в нормальное время?


1-18042
Ura
2002-05-23 16:44
2002.06.06
Проверка времени на попадания в диапазон времени.


4-18187
Floyn
2002-04-04 14:44
2002.06.06
Какой unit надо включить?


14-18145
cyborg
2002-05-03 18:02
2002.06.06
Не знаю куда спросить :-)