[VC++] Wizzard w C++

0

Witam

Chciałbym napisać jakiegoś krótkiego wizarda c++. Jeszcze raz chcę wspomnieć że chce napisać a nie skorzystać z generatorów w samym środowisku. Problem polega na tym w jaki sposób stworzyć jakiś menadżer do zarządzania tymi stronami? Próbowałem umieścić adresy tych stron w CArray <CDialog, CDialog*> ale lipa bo do każdego ze stron jest generowana inna klasa którą oczywiście nie mogę przekonwertować na CDialog.

I właśnie z tym się zwracam. Czy możecie mi jakoś podpowiedzieć w jaki sposób zarządzać danymi stronami??

0

W zasadzie możesz zrobić to na kilka sposobów (mniej lub bardziej "ładnych"). Najłatwiejsze rzeczywiście wydaje się użycie tablicy lub listy (co do różnych klas to nie powinno być problemu, bo każdy dialog dziedziczy po CDialog, więc spokojnie możesz poruszać się po wspólnej klasie bazowej). Jest tylko mały problem: tablice i listy wymagają by obiekt, który przechowują miał zdefiniowany operator przypisania, co w przypadku wbudowanej klasy VC++ nie będzie łatwo utworzyć. Trzebaby podziedziczyć po CDialog, tworząc klasę bazową dla Twoich dialogów (powiedzmy class CmyDialog: public CDialog) - oczywiście trzeba tam zdefiniować ten operator przypisania.

Twoja lista lub tablica bedzie tworzona zatem na bazie CmyDialog. Problem może być z tym operatorem, nie dam ręki uciąć czy wszystkie potrzebne pola klasy uda się przypisać. Inną metodą - bardziej łopatologiczną ale myślę, że skuteczniejszą będzie utworzenie własnej listy dwukierunkowej przechowującej wskaźniki na klasę CDialog (czyli w zasadzie na twoje okienka). Budowa listy jest oklepana także nie sprawi kłopotu, a późniejszy dostęp to okien będzie dosyć wygodny.

class CNode
{
 public:
  CNode *next;
  CNode *prev;
  CDialog *dlg;
};

class CDialogList
{
 private:
  CNode *wsk;
  CNode *wsk_dyn;
 public:
  CDialogList(); 
 ~CDialogList();
 void AddHead(CDialog *newdlg);
 void RemoveHead();
 CDialog* GetHead();
 CDialog* GetNext();
 CDialog* GetPrev();
};

CDialogList::CDialogList()
{
 wsk = NULL;
 wsk_dyn = NULL;
}

CDialogList::~CDialogList()
{
 CNode *node;
 while( !wsk )
 {
  node = wsk->next;
  //usuwanie okna wsk->dlg
  wsk = node;
 }
}

void CDialogList::AddHead(CDialog *newdlg)
{
 CNode* first;
 CNode* newNode = new CNode();
 newNode->dlg = newdlg;
 first = wsk;
 newNode->next = first;
 first->prev = newNode;
 newNode->prev = NULL;
 wsk = newNode;
}

void CDialogList::RemoveHead()
{
 CNode* first;
 first = wsk;
 wsk = wsk->next;
 wsk->prev = NULL;
 if( first )
 {
  //usuwanie okna first->dlg
 }
}

CDialog* CDialogList::GetHead()
{
 wsk_dyn = wsk;
 return wsk->dlg;
}

CDialog* CDialogList::GetNext()
{
 wsk_dyn = wsk_dyn->next;
 if( !wsk_dyn )
  return wsk_dyn->dlg;
 return NULL
}

CDialog* CDialogList::GetPrev()
{
 wsk_dyn = wsk_dyn->prev;
 if( !wsk_dyn )
  return wsk_dyn->dlg;
 return NULL;
}

Mam nadzieję że walnęłem jakiegoś błędu w kodzie, ale mniej więcej to powinno być to.

1 użytkowników online, w tym zalogowanych: 0, gości: 1