Главная

Детки

Как можно удалить одного и того–же ребенка в
двух разных оконах.

BView *view = …
BWindow *win1 = …
BWindow *win2 = …

win1–>AddChild(view);
win2–>AddChild(view);

Re: Детки

Никак. Потому что в два окна один и тот же view не добавить. По определению.
Если это не реплицируемый View, заархивированный и посланный на Shelf()

Re: Детки

У меня так (прошлая формулеровка не точна):

class A: public BView;
class B: public BListView, public A;

B *x = …
BView *view = …

BScrollView *sv1 = new BScrollView(…, cast_as(x, A), …);
BScrollView *sv2 = new BScrollView(…, cast_as(x, BListView), …);

win1–>AddChild(view);
win2–>AddChild(sv1);

view–>AddChild(sv2);

т.е. всё работает как нужно (вроде) но при выходе ошибка. как я думаю из–за авт. удаления деток. Как избавиться от ошибки?

Re: Детки

Что за ошибка, при выходе куда/что?

Самая распространенная ошибка — неправильное использование сочетания QuitRequested и Quit,

Re: Детки

Дебагер говорит:
Trying to delete a view that belongs to a window. Call RemoveSelf first.
QuitRequested и Quit пока еще непользую выход через Дескбар->Приложение–>Close All
Вываливается окошко с восклицательным знаком что приложение что–то выполнило неположенное и будет убито.

Re: Детки

Все правильно.
Потому что не используешь.
Я видимо не успел в серии своих статей это описать:(

Картина такая. Если ты закрываешь программу кнопочкой на окне или вызовом из Тракера/Дескбара, то во всех твоих окнах вызвается автоматом фунция QuitRequested.

Пропиши ее в твоих классах.
Далее, если из этой фунции ты вернешь true,
то для твоего окна приложение само вызовет BWindow::Quit().

В свою очередь Quit(), согласно BeBook, сама делает необходимую чистку.

Если QuitRequested вернет false, Quit не будет
вызвана.

Обе вышеназванные фунции виртуальные, так что ты можешь их переписать, добавив необходимые проверки и дополнительные подчистки.

Re: Детки

Спасибо. Сделал в одном из окон так:

bool win1::QuitRequested(void)
{
be_app–>PostMessage(B_QUIT_REQUESTED);

BView *view = FindView(«ScrollView»);
BView *anChild = 0;

if (view)
for (int32 i = 0; (anChild = view–>ChildAt(i)); i++)
anChild–>RemoveSelf();
return (TRUE);
}
Без самоудаления деток таже ошибка. Спасибо ещё раз!!!

Re: Детки

be_app–>PostMessage(B_QUIT_REQUESTED)
имеет смысл ставить в код в тех окнах, где правая кнопка на «заголовке» должна закрывать всю программу. Но не в диалогах и т д.

Re: Детки

Понятно. Еще раз спасибо.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Allowed HTML tags: <a> <em> <i> <img> <strong> <b> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Введите перечисленные символы, чтобы мы убедились, что вы не робот. Не требуется для зарегистрированных пользователей.
9
i
W
u
P
9
Enter the code without spaces and pay attention to upper/lower case.