Главная страница
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
8-18064
windy
2002-01-19 07:05
2002.06.06
BMP -> JPEG


3-17829
Glonia Zbanov
2002-05-16 17:56
2002.06.06
Поиск в гриде-DBGridEh


3-17844
kserg@ukr.net
2002-05-15 12:22
2002.06.06
MSSQL-как можно число превратить в строку с ведущими нулями?


3-17788
ORFO
2002-05-15 12:29
2002.06.06
Как работать с индексами в Парадокс?


3-17841
Sewix
2002-05-16 15:43
2002.06.06
QReport отправить в Word