Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.009 c
14-18110
KIR
2002-04-24 09:45
2002.06.06
Не могу отправить сообщение в форум (наверное из-за XP)


7-18172
sniknik
2002-03-12 19:31
2002.06.06
Нужно загасить форму :).


1-17939
allrussia
2002-05-27 04:34
2002.06.06
Как ? 2 вопроса


3-17774
Timka
2002-05-10 17:01
2002.06.06
TDBComboBox


6-18085
viol-2
2002-03-25 14:35
2002.06.06
WebBrowser




   Наверх