Jako, że jestem nowym użytkownikiem chciałbym się ze wszystkimi przywitać, tak więc... cześć Wszystkim :)
A teraz kilka słów o mnie i moim problemie...
Otworzyłem ten temat gdyż jestem początkującym programistą i mam pewien problem z napisaniem aplikacji w C++ bazując na bibliotekach MFC. Aplikacja ma przetwarzać plik tekstowy, który jest swoistą bazą danych pomiarowych z urządzenia rejestrującego. Aplikacja ma tworzyć wykres oraz dawać możliwość obliczania podstawowych danych statystycznych, tj. średnia, odchylenie, itp. oraz po części ma posiadać funkcję prostego systemu eksperckiego.
Otóż pisałem jakiś czas temu aplikacje konsolowe w C++, ale były to proste aplikacje ułatwiające mi liczenie pewnych elementów konstrukcyjnych. Aplikacje okienkowe pisałem za to w VisualBasic-u.
Podejrzewam, że większość powie "po co zawracać sobie głowę C++ z MFC, jak istnieje wiele łatwiejszych aplikacji do pisania aplikacji okienkowych, jak chociażby C# czy Java. Otóż jestem studentem i język programowania został mi narzucony. Ale za to temat aplikacji jest to mój wymysł (i tutaj chyba strzeliłem sobie w stopy). Do wyboru tematu kierowałem się potrzebą przetwarzania danych z rejestratora, który posiadam w pracy.
Dodam tylko, że nigdy nie programowałem aplikacji okienkowych w C++ z użyciem MFC. Oczywiście próbowałem się już orientować i coś tam "liznąłem" aczkolwiek podejrzewam, że moje podejście może być niezbyt profesjonalne w niektórych przypadkach i tutaj proszę o słowa krytyki i ewentualne porady.
Ufff...ale się rospisałem...:/
Teraz kilka słów na temat tego co zrobiłem. Otóż aplikację rozpocząłem od utworzenia pustej aplikacji pod WIN32 w której zmieniłem jedną z opcji dodając biblioteki MFC (zdecydowałem się na to ze względu na to, że lubię wiedzieć co robię, a kreator VisualStudio dorzuca od groma swoich danych). Początkowo myślałem napisać aplikację opartą na formularzu, ale nie mogłem znaleźć nigdzie informacji na temat jak to zrobić, dlatego zdecydowałem się na zrobienie głównego okna jako okno dialogowe, w którym otwieram plik, i wstępnie go przetwarzam, a następnie trzema przyciskami przechodzę do "modułów" które mnie interesują(m.in. jeden oparty na formularzu, w którym będzie rysowany wykres z możliwością wyliczania tego co chcę. Zdecydowałem się na takie rozwiązanie gdyż chciałem już jakoś ruszyć temat, bo czas na oddanie projektu się kurczy.
O to foto wyglądem programu:
Do tej pory natrafiłem na kilka problemów. Niektóre rozwiązałem, ...jakoś, ale jest też kilka z którymi nie wiem jak sobie poradzić:
- Otwieram plik tekstowy (ważący 12MB), którego poszczególne wiersze są dodawane do tablicy klasy CStringArray. Później zajmę przetwarzaniem poszczególnych "rekordów" tablicy. Moje pytanie brzmi: jak zrobić progress bar, który będzie wskazywał postęp z otwieraniem pliku.. Kontrolka jest dodana, ale gdy próbowałem coś z nią zrobić zawieszało mi system podczas pracy programu.
- Mam również problem z umieszczeniem zmiennych globalnych. Otóż chciałem aby część zmiennych była globalna, jak chociażby tablica, której zawartość chciałbym wykorzystać do pokazania danych w tabeli w nowym oknie dialogowym, które będzie się otwierało po wciśnięciu buttona. Utworzyłem osobny plik nagłówkowy "Globals.h", ale dodając w nim zmienne globalne są widziane w funkcji, ale program nie chcę się skompilować. Dodam tylko, że klasę okna dialogowego dodałem przy pomocy Class Wizard, a zmienne przypisane do kontrolek dodałem przy pomocy polecenia "Add Varible"
- Kolejny problem mam z przypisaniem zawartości tablicy edit boxa wiersz po wierszu. Chcąc użyć w funkcji zmiennej przypisanej do editBoxa wyświetla, że nie jest zdeklarowana:/ Poniżej kawałek kodu, który napisałem. Miejsce z którym ma problem oznaczyłem komentarzem. Funkcja ma być użyta w głównym oknie aby przekazać do niej tablicę z odczytanymi rekordami.
void DATA_TABLE_DLG::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EXIT_DATA_DLG, btnCloseDataDlg);
DDX_Control(pDX, IDC_DISPLAY_RECORD, edbDisplayRecord);
}
BEGIN_MESSAGE_MAP(DATA_TABLE_DLG, CDialog)
ON_BN_CLICKED(IDC_EXIT_DATA_DLG, &DATA_TABLE_DLG::OnBnClickedExitDataDlg)
END_MESSAGE_MAP()
// DATA_TABLE_DLG message handlers
void DATA_TABLE_DLG::OnBnClickedExitDataDlg()
{
EndDialog(IDC_EXIT_DATA_DLG);
}
void readDataFromArray(CStringArray data)
{
int numElements;
int i;
CString temp;
numElements = data.GetSize();
for (int i = 9; i <= numElements-9; i++)
{
temp = data[i];
edbDisplayRecord.SetWindowTextW(temp); //mam problem ze zmienną "edbDisplayRecord"
}
}
Wiem, że trochę się rozpisałem, ale chciałem w miarę dokładnie opisać mój problem i pokazać mniej więcej poziom wiedzy jaki reprezentuje.
Będę wdzięczny za wszelkie wskazówki, ewentualnie poprawki moich błędów.