Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Borland C++ Builder 6] Program obliczeniowy - kilka problemów

Ostatnio zmodyfikowano 2017-03-26 21:50
Autor Wiadomość
Raffallo
Temat założony przez niniejszego użytkownika
[Borland C++ Builder 6] Program obliczeniowy - kilka problemów
» 2017-03-22 17:49:09
Witam wszystkich serdecznie!
Zastanawiałem się czy zrobić kilka oddzielnych tematów poruszających poszczególne problemy, ale zdecydowałem iż zamieszczę wszystko w jednym temacie. Powodem podjętej decyzji jest głownie to, że być może znając cały zamysł programu i wszystkie aspekty mi potrzebne, ktoś może zaproponować nieco inne rozwiązanie niektórych problemów.

Na wstępie chciałbym jeszcze napisać, że nie należę do znawców języka C++, znam jedynie podstawy i elementy, który były mi potrzebne do pisania poprzednich (prostych, obliczeniowych) programów. Napisałem wcześniej kilka programików okienkowych w Code::Blocks i z jeden w Borlandzie. Były to programy do własnego użytku, więc nie wszystko musiało działać jak należy, ponieważ ja sam wiedziałem jak zrobić by było dobrze :) Tym razem będę pracował nad nieco poważniejszym programem (praca inżynierska), więc wypadałoby żeby wszystko działało i wyglądało jak należy :)

Opiszę nieco działanie programu, a następnie przejdę po kolei do każdego z problemów, które wiem, że bedę miał już na samym etapie rozplanowywania aplikacji. Jak napisałem w tytule program będzie obliczeniowy, a więc jego schemat działania również nie będzie skomplikowany : wybranie obliczenia - > wprowadzenie danych -> sprawdzenie danych (kompletność, poprawność) -> wykonanie obliczeń -> wyświetlenie wyników + narysowanie szkicu na podstawie wyników -> export wyników i obrazka (najlepiej plik graficzny + rft).
Program będzie poruszał obliczenia z 3 różnych zakresów, więc na początku trzeba dać użytkownikowi możliwość wyboru obliczenia, a następnie przekierować do odpowiednich formuł z możliwością wprowadzania / importu danych i przeprowadzenia obliczeń.

Problemy:

1. W związku z tym, iż program dotyczy 3 niezależnych obliczeń potrzebna jest możliwość przekierowywania użytkownika do odpowiednich formularzy po wybraniu obliczenia. Niestety po zastanawianiu się nad tym nie wiem jak to wykonać w Borland C++ Builder 6. Do wyświetlenia danych/wyników/obrazka planuję użyć PageControl i w każdym z TabSheet dać po jednym z elementów (wprowadzanie danych, wyniki, rysunek).
Pisząc ten post wpadłem na pomysł umieszczenia 4 PageControlów w całym programie (3 z obliczeniami, z początku ukryte, a ten czwarty z wyborem obliczeń itp) i po prostu "przełączanie" pomiędzy nimi za pomocą visible. Ma to rację bytu czy lepiej spróbować czegoś innego?

2. Mam wybór obliczeń, teraz przyszedł czas na wprowadzenie danych. Do tego zadania pomyślałem o użyciu StringGrid. Największym problemem (tak myślę), będzie konwersja wpisanych danych przez użytkownika na liczby oraz kontrolowanie, żeby w żadnym miejscu nie pojawiły się litery, bo inaczej program się wysypie przy obliczeniach. Dobrze byłoby też nie pogubić żadnych "końcówek liczb". Fajnie jak by była możliwość zablokowania Grida żeby mógł odbierać od użytkownika tylko dane liczbowe, to by znacznie ułatwiło wszystko.

2.1 Dodatkowo poruszając temat StringGrida chciałbym zapytać o kilka rzeczy, których nie znalazłem w internecie:
-czy da się zablokować poszczególne komórki? np zablokować komórkę [3,2] do edycji itp.
-czy da się zoptymalizować wypełnianie tego Grida danymi, tzn wystarczy raz kliknąć żeby móc wypełniać daną komórkę (aktualnie trzeba 2 razy), po naciśnięciu "enter" wypełnianie przeskakuje do kolejnej komórki, a jeżeli kończy sie wiersz to do kolejnego wiersza pierwszej komórki itp (podobnie do Excela)?
-dodawanie wierszy do Grida, gdy poprzednie są już wypełnione? (Aczkolwiek tu wydaje mi sie, ze dam radę. Wystarczy chyba sprawdzać, czy jest wymagana zawartość poprzednich wierszy/komórek i jeżeli tak jest to dodać po prostu kolejny wiersz)

3. Mamy już pobrane dane od użytkownika, obliczone wyniki (obliczenie dam radę zrobić), teraz czas na prezentację wyników. Do prezentacji wyników również użyję raczej StringGrid i po prostu przypiszę odpowiednie komórki macierzy wynikowej do odpowiednich komórek Grida i po sprawie. Jeżeli chodzi o rysunek to wydaje mi się, ze też dam radę go zrobić przy użyciu oczywiście TCanvas, tylko nie wiem czy uda mi się zautomatyzować ten proces, ale to będę pytał jak będą problemy. Mam tylko pytanie w czym najlepiej to rysować? Są dostępne Shape i Image, więc nie wiem co wybrać. Niestety się na tym nie znam, aczkolwiek pamiętam, że kiedyś sie chyba bawiłem (uczyłem sie) rysowaniem w Image.

3.1 W jaki sposób w tym builderze tworzyć zmienne globalne i funkcje/procedury? Pamiętam kiedyś tworząc program nie mogłem sobie z tym poradzić i zrobiłem jak zrobiłem. Tym razem jednak przydałoby się stworzyć kilka procedur, np.: do rysowania, żeby móc umieszczać je w kilku miejscach itp. Te procedury miałyby się odwoływać do poszczególnych obiektów jak Image itp. Czy mógłby ktoś jakoś podpowiedzieć w jaki sposób to zrobić? Nadmienię iż próbowałem to kiedyś zrobić nawet z jakimiś kursami/poradnikami, ale zawsze wyskakiwał błąd :/

4. Gdy wszystko jest już obliczone i wyświetlone przyszedł czas na najgorsze (moim zdaniem). Wyniki tych obliczeń trzeba exportować do pliku. Najlepiej byłoby zapisać je w formie tabelarycznej z jakimś małym opisem itp, a więc najlepszym pomysłem chyba jest export do pliku rtf. Niestety problemem jest to, że nie mam bladego pojęcia jak tego dokonać oraz nie wiem jak później te tabele zdefiniować itp. W tym aspekcie chyba najbardziej potrzebuję Waszej pomocy. Do tego dobrze by było dać możliwość exportu szkicu (obrazka), który powstał na podstawie wyników obliczeń. Chciałbym by export tego obrazka nie zmieniał jego rozmiaru ani nic w tym stylu, tak aby można było go później wydrukować w skali (o ile uda mi się dojść do tego jak go najpierw narysować w skali :) ale to zostawiam sobie do odkrycia, popróbowania itp, żeby wszystkiego nie brać od kogoś).


Z góry dziękuję za wszelkie próby (udane bądź nie) pomocy i za ogólne zainteresowanie tematem (o ile takowe będzie). Przepraszam również, że jest tyle różnych elementów w jednym temacie, ale tak jak napisałem we wstępie - wydawało mi się iż to będzie miało większy sens.

Pozdrawiam!
P-159236
darko202
» 2017-03-23 14:23:23
>> 1. ...Ma to rację bytu czy lepiej spróbować czegoś innego?
można tak to zrobić,

jeśli są to różne obliczenia to możesz również wykonać 3 oddzielne forms


>> 2. .. problemem (tak myślę), będzie konwersja wpisanych danych przez użytkownika na liczby oraz kontrolowanie, żeby w żadnym miejscu nie pojawiły się litery

* konwersja i kontrola nie jest problemem w C++
* trzeba to umieścić w odpowiednich zdarzeniach

* w kontrolkach wprowadzania danych można umieścić kontrolę formatu podobnie do określania formatu komórki w Excelu

>> 2.1 ...
>> -czy da się zablokować poszczególne komórki? np zablokować komórkę [3,2] do edycji itp.

tak - komórka to obiekt i ma własności
najprościej byłoby pewnie przez zdarzenie wejścia do komórki (nie pamiętam nazwy - po wejściu sprawdzasz z jakąś listą i jeśli można edytować to nic nie robisz, jeśli nie można to dajesz komunikat i przechodzisz do następnej czym nie pozwalasz jej edytować )

>> -czy da się zoptymalizować wypełnianie tego Grida danymi, tzn wystarczy raz kliknąć żeby móc wypełniać daną komórkę (aktualnie trzeba 2 razy), po naciśnięciu "enter" wypełnianie przeskakuje do kolejnej komórki, a jeżeli kończy sie wiersz to do kolejnego wiersza pierwszej komórki itp (podobnie do Excela)?

? można to chyba ustawić
obejrzyj dostępne zdarzenia na kontrolce 

-dodawanie wierszy do Grida, gdy poprzednie są już wypełnione?
odpowiednia obsługa zdarzeń 

> 3. Shape,  Image ?
Shape - rysowanie na płótnie
Image - bitmapa - rysowanie poprzez zmianę komórek bitmapy

musisz zdecydować co jest dla Ciebie lepsze

>>3.1 W jaki sposób w tym builderze tworzyć zmienne globalne i funkcje/procedury?
to c++ dodajesz plik nagłówkowy i masz dostęp do wszystkich funkcji w pliku .cpp
można też funkcje zgrupować w bibliotece

zmienne globalne - trzeba sprawić aby były widoczne w obiektach wewnętrznych a to standardowo
* odwołanie do pliku
* baza danych
* przekazana do obiektu Forms poprzez użycie własnego konstruktora, a tam przekazany adres na strukturę z zmiennymi
  globalnymi
 

> 4. zapis do pliku
proponuję najpierw pisać do komponentu richedit
poszukaj
http://programowanie.cal.pl​/cyfbar/richedit.html


kiedyś widziałem świetną książkę (Depphi 4.0 vademscum experta), która
pomogłaby mi gdybym ja zobaczył przed procesem samodzielnego rozpoznania C++Builder 4

teraz są podobne książki nawet do C++ ale ich nie oglądałem - poszukaj myślę, że sporo Ci mogą pomóc
P-159264
Raffallo
Temat założony przez niniejszego użytkownika
» 2017-03-23 15:45:36
Dziękuję bardzo za odpowiedź!
Niestety jak wspomniałem nie jestem zbyt zaawansowany w programowaniu i sporo tego co mi napisałeś nie jest dla mnie zrozumiała.

1. Myślałem nad formami, ale nie wiedziałem jak zrobić "przęłączanie" pomiędzy nimi tak aby nie było ono widoczne dla użytkownika

2. Z pierwsza częścią wypowiedzi dam sobie chyba radę. Nie wiem tylko do końca co miałeś na myśli z kontrolą formatu. Znaczy wiem o czym mówisz, aczkolwiek nie wiem jak to zaimplementować. Jedyne co mi przychodzi na myśl to sprawdzanie czy klawisz naciśnięty przez użytkownika jest klawiszem 1-9 i '.' , jeżeli jest to dodanie tego znaku do komórki, a jeżeli nie to jego pominiecie. Niestety nie mam co do tego pewności i nie dałbym chyba razy ze zrobieniem tego bez pomocy.

2.1 Okej, to rozumiem. Chyba dam radę. Tylko nie wiem do końca czy dam radę z "optymalizacją" StringGrida, ale popatrzę jak to wyglada.

3.1 wiem o tym, aczkolwiek gdy kiedyś zrobiłem procedurę, która rysowała coś na image, to wyskakiwał komunikat podczas kompilacji, ze ten obiekt nie istnieje czy coś takiego.

Nie mam pojęcia co do mnie napisałeś o zmiennych globalnych :( Nie ma możliwości utworzyć takich zmiennych jak w zwykłym c++ okienkowym (umieszczajac przed main()), tak zeby były te zmienne dostępne dla wszystkich funkcji, obiektów itp?

4. Niestety nic mi to nie mówi :( Mógłbyś nieco bardziej to rozwinąć?

 
P-159272
Raffallo
Temat założony przez niniejszego użytkownika
» 2017-03-26 21:50:30
Co do tworzenia rtf to udało mi się znaleźć rtflib https://www.codeproject.com​/Articles/10582/rtflib-v. Niestety nie wiem do końca jak się tym "obsłużyć", bo jak wspomniałem nie jestem zbyt zaawansowany w programowaniu. Czy mógłby ktoś mi pomóc i nakierować jak korzystać z tej biblioteki w builderze z którego korzystam? O ile ta biblioteka działa i sie do czegoś nadaje.

Edit: próbowałem załączone tam "demo" wkleić do C::B (załączając wszystkie biblioteki itp zgodnie z poradnikiem) lecz niestety pojawia się:
|14|undefined reference to `rtf_open(char*, char*, char*)'|
Zgaduję, ze trzeba użyć jeszcze coś przed tym żeby te nazwy odnosiło do danej biblioteki czy coś, aczkolwiek i tak w builderze nieco inaczej to wygląda więc prosiłbym bardzo o pomoc :(
P-159450
« 1 »
  Strona 1 z 1