[MFC] Dynamiczne tworzenie checkbox'ów.

[MFC] Dynamiczne tworzenie checkbox'ów.
KW
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 7 lat
0

Witam.
Robię prostą wyszukiwarkę chorób.
Na podstawie podanych objawów znajduje mi pasujące choroby (jeśli zgodność jest powyżej jakiegoś progu),
następnie podaje co to za choroba, oraz leczenie i profilaktykę.
Mam 3 pliki tekstowe (do objawów (dla danej choroby), chorób oraz leczenia).
Chciałbym dynamicznie stworzyć check boxy, np dla każdego objawu z 'bazy'.
W tej chwili z palca zrobilem pare check boxow, natomiast jesli chcialbym poszerzyc 'baze' chorob, musze przebudowywac caly program.
Jakieś podpowiedzi jak mógłbym to zrealizować?

pozdrawiam

gośćabc
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
0

raz robiłem projekt w MFC i powiem Ci, że to jest jakaś paranoja

tam jest document i view?

nie pamiętam dokładnie, poszukaj jakiś kurs, pewnie trzeba załadować je w document a potem updatnąć view

KW
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 7 lat
0

Dobra, mam pewną koncepcje na zrobienie tego, natomiast napotkałem pewien problem.
Chciałem zrobić tablice CButton'ów :

Kopiuj
 
CButton * CheckboxContainer = new CButton[numbObj];

Problem polega na tym, że numbObj znamy dopiero po przeczytaniu pliku.
Próbowałem zrobić coś takiego:

Kopiuj
 
CButton * CheckboxContainer;
[...]
CheckboxContainer = new CButton[numbObj];

Niestety po czymś takim program się nie włącza (mimo pomyślnej kompilacji).

Kopiuj
 
for (int i=0; i<numbObj; i++)
{
	CheckboxContainer[i].Create(_T("&objaw"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(10, 25+30*i, 100, 40+30*i), this, 0x11);
	label = chorobiszcza->objawy[i];
	Clabel.Format(_T("%S"), label.c_str());
	CheckboxContainer[i].SetWindowTextW(Clabel);
}

próbowałem wykorzystać też vector

Kopiuj
 
std::vector<CButton*> CheckboxContainer

CButton *button = new CButton;
for (int i=0; i<numbObj; i++)
{
	if(button->Create(_T("&objaw"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(10, 25+30*i, 100, 40+30*i), this, 0x11))
	{
 		CheckboxContainer.push_back(button);
	}
	label = chorobiszcza->objawy[i];
	Clabel.Format(_T("%S"), label.c_str());
	CheckboxContainer[i].SetWindowTextW(Clabel);
}

Niestety program wykrzaczał się przy próbie uruchomienia (problem z pamięcią, cały czas ten sam przycisk wrzucałem do vectora).
Próbowałem w pętli tworzyć przycisk, dodawać do vectora, a następnie usuwać.

Kopiuj
 
for (int i=0; i<numbObj; i++)
{
	CButton *button = new CButton;	
	if(button->Create(_T("&objaw"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, CRect(10, 25+30*i, 100, 40+30*i), this, 0x11))
	{
 		CheckboxContainer.push_back(button);
	}
	button->CloseWindow();
	label = chorobiszcza->objawy[i];
	Clabel.Format(_T("%S"), label.c_str());
	CheckboxContainer[i].SetWindowTextW(Clabel);
}

Program się włączał, niestety nie tworzył żadnego przycisku.
W vectorze zapisywane są wskaźniki do objektów, tak? Czyli usuwając ten obiekt (button->CloseWindow()) usuwałem go na dobre?

ktoś ma jakieś pomysły?

pozdrawiam

edytowany 1x, ostatnio: Kwapa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.