Информация об изменениях

Сообщение Где хранить ссылки (или список ссылок) на Presenter-ов от 02.06.2019 16:05

Изменено 02.06.2019 16:08 es3000

Где хранить ссылки на Presenter-ов
Добрый день!

Помогите пожалуйста разобраться в следующей ситуации.

Есть окно для обмена с кассами.
В нем отображается:
— список касс,
— кнопки "Выгрузить" и "Загрузить",
— рядом с каждой кассой две пиктограммы, первая обозначает результат последней выгрузки, вторая — результат загрузки.
Если результат успешный — пиктограмма выглядит как зеленый плюсик, если ошибка — красный восклицательный знак.

При щелчке мышкой на пиктограмме открывается новое окно с подробными результатами операции для соответствующей кассы.
Для одной кассы может быть открыто только два таки окна с подробными результатами: одно для выгрузки, второе — для загрузки.
Если такое окно уже открыто для какой то кассы, то при повторном щелчке на пиктограмме это окно должно переместиться на передний план.
Допустим, если в списке три кассы, то получается что всего может быть открыто всего шесть окон с подробными результатами.

Получается, что нужно где-то отслеживать какие окна уже открыты и хранить данные об этих открытых окнах.
Чтобы можно было их активизировать при необходимости.

Сейчас у меня пока сделано без отслеживания.
Сейчас окно списка касс имеет ссылку на связанный с ней презентер, при щелчке в окне на пиктограмме ему передается команда:
lCashListPresenter.ShowDetails(CashList.GetCurrentPos(), OperationType_Upload);

или
lCashListPresenter.ShowDetails(CashList.GetCurrentPos(), OperationType_Download);


В этом CashList-презентере срабатывает вот такой код:

class TCashListPresenter
{
    void ShowDetails (pCash, pOperationType)
    {
        lOperation = Controller.GetLastOperation(pCash, pOperationType);
        lPresenter = new TDetailsPresenter(pCash, lOperation);
        lPresenter.ShowWindow();
    }
}


То есть CashList-презентер создает Details-презентер и уже второй презентер открывает окно.
Получается, надо где-то хранить ссылки на презентеры-подробностей и переделать код вызова вот так:

class TCashListPresenter
{
    void ShowDetails (pCash, pOperationType)
    {
        lOperation = Controller.GetLastOperation(pCash, pOperationType);
        lPresenterFound = DetailsPresenterList.FindPresenter(pCash, lOperation);
    if (lPresenterFound = null)
            lPresenterFound = new TDetailsPresenter(pCash, lOperation);
        lPresenterFound .ShowWindow();
    }
}


Теперь вопросы.

1) Где надо создавать и хранить DetailsPresenterList?

Напрашивается, что хранить его можно прямо в CashList-презентере (в презентере списка касс), вот так:

class TCashListPresenter
{
    List<TDetailsPresenter> DetailsPresenterList;
    TCashListPresenter()
    {
        DetailsPresenterList = new List<TDetailsPresenter>;
    }
}


Но мне кажется это не правильно.
Так как вызвать окно подробностей для кассы теоретически можно и из другого места, например из главного окна.
А меню главного окна не имеет доступа к CashList-презентеру.

А тогда где создать этот список?
Какой объект должен быть ответственным за создание, хранение и уничтожение этого списка?

2) Как будет выполняться удаление из этого списка элементов — конкретных aDetailsPresenter — при закрытии соответствующего окна подробностей?
Ведь получается, что ни сам презентер-подробностей, ни окно не знают об этом списке.
Не понятно, как при закрытии окна добраться до этого списка.
Какой объект должен отвечать за удаление элемента из этого списка?

Подскажите, пожалуйста!
Дайте какие-нибудь советы как это лучше сделать.
Где хранить ссылки на Presenter-ов
Добрый день!

Помогите пожалуйста разобраться в следующей ситуации.

Есть окно для обмена с кассами.
В нем отображается:
— список касс,
— кнопки "Выгрузить" и "Загрузить",
— рядом с каждой кассой две пиктограммы, первая обозначает результат последней выгрузки, вторая — результат загрузки.
Если результат успешный — пиктограмма выглядит как зеленый плюсик, если ошибка — красный восклицательный знак.

При щелчке мышкой на пиктограмме открывается новое окно с подробными результатами операции для соответствующей кассы.
Для одной кассы может быть открыто только два таки окна с подробными результатами: одно для выгрузки, второе — для загрузки.
Если такое окно уже открыто для какой то кассы, то при повторном щелчке на пиктограмме это окно должно переместиться на передний план.
Допустим, если в списке три кассы, то получается что всего может быть открыто всего шесть окон с подробными результатами.

Получается, что нужно где-то отслеживать какие окна уже открыты и хранить данные об этих открытых окнах.
Чтобы можно было их активизировать при необходимости.

Сейчас у меня пока сделано без отслеживания.
Сейчас окно списка касс имеет ссылку на связанный с ней презентер, при щелчке в окне на пиктограмме ему передается команда:
lCashListPresenter.ShowDetails(CashList.GetCurrentPos(), OperationType_Upload);

или
lCashListPresenter.ShowDetails(CashList.GetCurrentPos(), OperationType_Download);


В этом CashList-презентере срабатывает вот такой код:

class TCashListPresenter
{
    void ShowDetails (pCash, pOperationType)
    {
        lOperation = Controller.GetLastOperation(pCash, pOperationType);
        lPresenter = new TDetailsPresenter(pCash, lOperation);
        lPresenter.ShowWindow();
    }
}


То есть CashList-презентер создает Details-презентер и уже новый созданный Details-презентер открывает окно подробностей.
Получается, надо где-то хранить ссылки на презентеры-подробностей и переделать код вызова вот так:

class TCashListPresenter
{
    void ShowDetails (pCash, pOperationType)
    {
        lOperation = Controller.GetLastOperation(pCash, pOperationType);
        lPresenterFound = DetailsPresenterList.FindPresenter(pCash, lOperation);
    if (lPresenterFound = null)
            lPresenterFound = new TDetailsPresenter(pCash, lOperation);
        lPresenterFound .ShowWindow();
    }
}


Теперь вопросы.

1) Где надо создавать и хранить DetailsPresenterList?

Напрашивается, что хранить его можно прямо в CashList-презентере (в презентере списка касс), вот так:

class TCashListPresenter
{
    List<TDetailsPresenter> DetailsPresenterList;
    TCashListPresenter()
    {
        DetailsPresenterList = new List<TDetailsPresenter>;
    }
}


Но мне кажется это не правильно.
Так как вызвать окно подробностей для кассы теоретически можно и из другого места, например из главного окна.
А меню главного окна не имеет доступа к CashList-презентеру.

А тогда где создать этот список?
Какой объект должен быть ответственным за создание, хранение и уничтожение этого списка?

2) Как будет выполняться удаление из этого списка элементов — конкретных aDetailsPresenter — при закрытии соответствующего окна подробностей?
Ведь получается, что ни сам презентер-подробностей, ни окно не знают об этом списке.
Не понятно, как при закрытии окна добраться до этого списка.
Какой объект должен отвечать за удаление элемента из этого списка?

Подскажите, пожалуйста!
Дайте какие-нибудь советы как это лучше сделать.