Aplikacja do obliczeń inżynierskich - jaka platforma?

0

Witam,

chciałbym stworzyć stosunkowo prostą aplikację mobilną do obliczeń inżynierskich. Nigdy wcześniej nie pisałem aplikacji, więc proszę o poradę. Aplikacja ma działać w ten sposób, że po dotknięciu jednego z 3 dużych przycisków pojawia się kolejnych kilka przycisków do wyboru. Wybranie któregoś przenosi na ostatni ekran wyboru, gdzie dostępnych jest jeszcze więcej przycisków (tym razem z obrazkami oprócz tekstu). Po dotknięciu jednego przechodzi się do ekranu ze statycznym obrazkiem i kilkoma podpisanymi polami, w które należy wpisać wartości. Dodatkowo w niektórych przypadkach będzie można zaznaczyć okienko wyboru. Następnie użytkownik musi kliknąć przycisk uruchamiający obliczenia. W tym momencie aplikacja powinna podstawić wpisane wartości do 2 zaprogramowanych dla wybranego przypadku wzorów (wzory dosyć rozbudowane) i wyświetlić wyniki.

Aplikacji nie chcę sprzedawać, ma służyć tylko do własnego użytku. W związku z tym pytanie brzmi jakiej platformy najlepiej użyć. Co będzie w tym przypadku lepsze - iOS czy Android ? A może zacząć od programu komputerowego np. w Visual Basic ? Najbardziej użyteczny dla mnie byłby iOS, ale czytałem, że tam trzeba publikować aplikacje i w związku z tym liczyć się z pewnymi utrudnieniami. Tymczasem ja bym chciał tylko stworzyć plik aplikacji, który mógłbym wysłać na mój telefon, zainstalować i korzystać. Jeśli Android też na to nie pozwala to może lepiej będzie zostać przy programie komputerowym (tylko w jakim języku ?). Tym bardziej, że przy aplikacjach mobilnych pewnie występuje problem kompatybilności z nowymi wersjami systemu. Zaktualizują mi iOS/Android i aplikacja przestanie działać. Czegoś takiego chciałbym uniknąć.

Z góry dziękuję za pomoc

3

Z wszystkich możliwych opcji to akurat pisanie na Apple jest najgorszą (w sensie - najtrudniejszą na start) rzeczą. Nie da się tak, jak w przypadku Androida po prostu pliku .APK wrzucić na telefon i zainstalować. Musisz mieć komputer Apple, żeby tworzyć. Pewnie jakbym poszukał dalej, to jeszcze kilka rzeczy by się znalazło ;)

W każdym razie - jeśli chcesz iść w mobilki to radziłbym się zainteresować Flutterem. Działa on bezproblemowo na Androidzie (w końcu jest to wynalazek Google, więc dziwne, żeby nie działał), ale jest wieloplatformowy, w związku z czym bardzo łatwo możesz potem przerobić aplikację na iOS.

Ale chyba najsensowniejszą opcją będzie to, o czym piszesz w dalszej części, czyli stworzenie czegoś na desktop. Teraz pewnie zacznie się jazda, że polecam Delphi, ale naprawdę uważam, że dla Ciebie, czyli dla osoby, która nie chce iść zawodowo w programowanie, a jedynie zrobić coś na własny użytek, to takie Delphi będzie idealne. Odpada Ci praktycznie cała walka z interface, bo Delphi (lub ogólnie - środowiska typu RAD) to takie układanie z klocków. Bierzesz z palety komponentów przycisk czy jakąś listę wyboru, umieszczasz na okienku i już to masz. Praktycznie zero komplikacji, wszystko się dzieje automagicznie. Jest Delphi w wersji Community, które jest darmowe do zastosowań prywatnych/niekomercyjnych. Ponadto, Delphi umożliwia tworzenie aplikacji na Androida, ale nie miałem z tym styczności, więc się nie wypowiem. Dodatkowo jest jeszcze otwartoźródłowy "klon" Delphi o nazwie Lazarus. Jeśli chodzi o IDE to jest znacznie uboższy, ale plusem jest to, że tworzy także aplikacje na Mac i Linux.

Zaktualizują mi iOS/Android i aplikacja przestanie działać

W przypadku Fluttera to raczej nie będzie miało prawa się zdarzyć - https://flutter.dev/docs/resources/faq. Jak już to odwrotnie - jakaś nowsza wersja Fluttera może przestać wspierać starsze wersje Androida. Ale aktualnie to Flutter powinien się uruchomić na dowolnym Androidzie od wersji 16 wzwyż. Jeśli teraz stworzysz sobie taką apkę, powinna ona dać się uruchomić przez kolejne 50 lat na nowszych wersjach ;)

1

Aplikację Fluttera uruchomisz też na Desktopie - co prawda, to dopiero wersja alpha, ale z taką prostą nie byłoby problemów. https://github.com/flutter/flutter/wiki/Desktop-shells

1

Zgadza się, ale mimo wszystko łatwość pisania we Flutterze a jakimkolwiek RAD (chociażby wspomniane przeze mnie Delphi) jest nieporównywalna. We Flutterze jest trochę walki ze stworzeniem widoków, pozycjonowaniem elementów, pełno zagnieżdżeń i nawiasów klamrowych oraz średników, przez co można się łatwo pogubić (zwłaszcza, jak się nie ma doświadczenia w programowaniu). A takie Delphi to sobie układasz UI z klocków w ciągu kilku minut i nie ma ryzyka, że ominiesz jakiś średnik, a potem będziesz szukać przez pół godziny.

Jeśli desktop, to raczej w czymś prostym. Polecanie Fluttera na desktop zakrawa na sadyzm :D

0

Nikt nie mówi, żeby na desktop używać Fluttera, ale przy okazji mając mobilną, można wygenerować także i desktopową i będzie tak czy inaczej wyglądała lepiej, niż ta pisana w Delphi

1

Jeśli zrobi mobilną to tak. Ale różnica w poziomach wejścia między Flutterem a Delphi (zwłaszcza dla osoby początkującej) jest kosmiczna. Dlatego podtrzymuję - jeśli chce zrobić coś na własny użytek i ma to być jednorazowa akcja, to najłatwiej będzie zrobić coś desktopowego w oparciu o RAD.

1

Delphi +1.

0

Dziękuję bardzo za wszystkie odpowiedzi. Apple w takim razie zdecydowanie odpada, zostaje ew. Android. Ale ten Flutter, o którym piszecie brzmi kusząco. To w kwestii aplikacji mobilnej. A gdybym chciał zacząć od desktopowej to oprócz Delphi jest coś jeszcze wartego uwagi ? Zależy mi właśnie na łatwości tworzenia GUI (żebym nie musiał tydzień walczyć nad przyciskiem z grafiką), ale i stosunkowo prostym kodzie umożliwiającym łatwą implementację wzorów. Na wykładach kiedyś pokazywali nam Visual Basic. Widziałem, że tam też da się łatwo tworzyć interfejs graficzny. Czy Waszym zdaniem warto spróbować tego języka czy może Delphi będzie od niego lepsze (albo jeszcze coś innego) ?

1

Delphi (czy ogólnie różne dialekty Pascala) są najbardziej user-freindly, więc jeśli Ci zależy na "prostym kodzie" to ponownie - Delphi. Raczej bym sobie odpuścił VisualBasic, bo to raczej taka zabawka do trochę bardziej zaawansowanych skryptów, a nie prawdziwy język/środowisko do projektowania.

Z dostępnych środowisk typu RAD (czyli takich, które biorą na siebie zabawę z UI) to masz Delphi, Lazarus oraz C++Builder. Delphi i C++Builder to praktycznie to samo, tylko różnią się zastosowanym językiem. Ale powtarzam - jeśli Ci zależy na czytelności kodu, a także biorąc pod uwagę fakt, że jesteś początkujący, to polecam Delphi. Kod łatwiej się czyta, a do tego Pascal jest bardziej rygorystyczny pod wieloma względami, przez co daje znacznie mniej możliwości popełnienia błędów. To trochę jak z kontrolą trakcji czy ABS w samochodzie - na torze,kiedy jedzie zawodowiec, to mogą trochę przeszkadzać, ale w 99% przypadków podczas zwykłej jazdy są przydatne i pomocne.

0

Brzmi bardzo przekonująco. Jedyny problem w tym, że Delphi jest płatne. Wprawdzie mają też Community Edition za free, ale tylko na rok i potem trzeba odnowić. A ofertę zawsze mogą wycofać (było już tak z kilkoma programami inżynierskimi). No chyba że da się wyeksportować pliki (.exe czy coś) tak by program mógł działać niezależnie od środowiska Delphi. Wtedy jeszcze pół biedy, bo wysiłek nie pójdzie na marne (program sam w sobie ma być prosty, ale będę musiał do niego wprowadzić bardzo dużo przypadków i wzorów, także czeka mnie trochę pracy).

1

No oczywiście - robisz exe, a potem możesz Delphi nawet odinstalować :) poza tym przypominam, że jest darmowa alternatywa o nazwie Lazarus - korzystając z niego nie musisz się takich rzeczy obawiać. Delphi jest bardziej rozbudowane i dopracowane, ale na twoje potrzeby lazarus całkowicie wystarczy i to z dużym zapasem.

1

No chyba że da się wyeksportować pliki (.exe czy coś) tak by program mógł działać niezależnie od środowiska Delphi. Wtedy jeszcze pół biedy, bo wysiłek nie pójdzie na marne (program sam w sobie ma być prosty, ale będę musiał do niego wprowadzić bardzo dużo przypadków i wzorów, także czeka mnie trochę pracy).

Tak, program nie będzie musiał działać z Delphi - piszesz go i już masz. Jest twój, działa wszędzie. Ale gdy chcesz zmienić swój program i dodać coś do niego to Delphi i tak ci potrzebne aby wygenerować nową wersję.

A gdybym chciał zacząć od desktopowej to oprócz Delphi jest coś jeszcze wartego uwagi ? Zależy mi właśnie na łatwości tworzenia GUI (żebym nie musiał tydzień walczyć nad przyciskiem z grafiką), ale i stosunkowo prostym kodzie umożliwiającym łatwą implementację wzorów.

C# + WinForms + Visual Studio. Też graficzny edytor komponentów metodą przeciągnij i upuść, też środowisko darmowe (z pewnymi ograniczeniami wersji darmowej takimi jak niemożność użycia w firmie zarabiającej powyżej 1 mln dolarów), i o wiele wiele większa społeczność ludzi, którzy tego używają.

(a po pewnym czasie można przerobić aplikację na Xamarina - czyli zmienić całą warstwę interfejsu użytkownika, ale zachowując wszystko inne - i ją zbudować dla Androida i iOS)

0

A powiedzcie mi jeszcze proszę - czy w Delphi da się zrobić tak żeby kliknięcie przycisku powodowało przejście do innego ekranu (każdy przycisk prowadzi do innego ekranu) ? Nie chodzi o otwarcie nowego okna Windowsowego (to zdaje się określane jest jako "form" w Delphi) tylko pracę w tym samym oknie, ale z innym interfejsem. Pytam, bo to będzie główna cecha mojego programu i od tego będę musiał zacząć jego pisanie. Jeśli da się tak zrobić to gdzie mogę znaleźć tę opcję i najlepiej też jakiś jej krótki opis ?

1

Tak na szybko to mi przychodzi do głowy TPageControl ale z ukrytymi tymi zakładkami na górze. Teraz nie mogę tego sprawdzić, ale coś mi świta, że kiedyś coś takiego robiłem. A przełączanie pomiędzy kartami robisz w obsłudze wciśnięć przycisków, o których pisałeś przed chwilą.

EDIT
Znalazłem chwilę i sprawdziłem. Standardowo po dodaniu kart, TPageControl wygląda tak:
screenshot-20191011215140.png

Ale można ukryć poszczególne karty - wybierasz karty do ukrycia:
screenshot-20191011215233.png

i w inspektorze zmieniasz wartość TabVisible na FALSE:
screenshot-20191011215322.png

W efekcie dostajemy coś takiego:
screenshot-20191011215349.png
Czyli jak widać, karta numer 2 stała się niewidoczna.

Ukrycie kart można tez zrobić z poziomu kodu:

for page := 0 to PageControl1.PageCount - 1 do
  PageControl1.Pages[page].TabVisible := false;

A samą zmianę aktywnej karty można zrobić na dwa sposoby: albo wskazując jej pozycję (pierwsza linia w poniższym kodzie), albo wskazując ją bezpośrednio (linia druga).

PageControl1.ActivePageIndex := 1;
PageControl1.ActivePage := TabSheet1;

Jest jeszcze opcja przełączania na kolejną/poprzednią kartę, bez uwzględniania tego, jaki numer posiada aktualnie wyświetlana:

Form1.PageControl1.SelectNextPage(TRUE, FALSE);

Pierwszy parametr oznacza kierunek - TRUE przesuwa do przodu, FALSE do tyłu. Drugi natomiast odpowiada za sprawdzanie, czy dana karta (a właściwie to zakładka - czyli to, co ukrywaliśmy przez zmianę wartości TabVisible ) jest widoczna. Jeśli ustawimy na TRUE, to będzie przełączać jedynie między widocznymi kartami, dlatego w naszym przypadku lepiej jest dać FALSE. Ciekawostka - po dojściu do skrajnej karty, dalsze przełączanie powoduje przeskok na drugą stronę, czyli kolejną kartą po ostatniej jest pierwsza (oczywiście, działa to w obie strony).

0

Minęły 3 tygodnie - czy coś się w sprawie ruszyło? Coś piszesz? Jaka technologię wybrałeś? Dajesz radę? ;)

0

Szczerze mówiąc nie miałem na razie czasu się tym zająć i musiałem odłożyć temat. Problem głównie w tym, że program będzie musiał mieć bardzo dużo (dziesiątki jak nie więcej) takich okien z innym interfejsem, na które przełącza się przyciskiem. Patent z ukrywaniem kart może się okazać trudny w realizacji dla tylu okien i będzie się łatwo w nich pogubić.

Poza tym program będzie musiał mieć kilka specyficznych cech, takich jak obrazki, pola wyboru itp. Wszystko to będą powtarzalne rzeczy, więc w zasadzie wystarczy przygotować program dla 1 przypadku (pierwsze okno z 1 przyciskiem prowadzącym do drugiego okna z 1 przyciskiem prowadzącym do kolejnego okna z 1 przyciskiem z obrazkiem prowadzącym do okna z obrazkiem w tle, polami do wpisywania danych, polami wyboru i przyciskiem uruchamiającym obliczenia z wpisanego wzoru, których wyniki są potem wyświetlane).
Mogę to przedstawić na prostym schemacie z Painta jeśli opis jest niejasny.

Tak myślę, że chyba najchętniej zleciłbym komuś przygotowanie szkieletu programu (dla tego 1 przypadku jak opisałem wyżej) a sam dodał kolejne przypadki i zadbał o część inżynierską.

0

Szkic zawsze może rzucić nowe światło na temat ;)

A co do dziesiątek okienek/zakładek - na pewno da się to jakoś obejść. Poza tym można je tworzyć dynamicznie podczas pracy aplikacji. Oczywiście - nie znając szczegółów to ciężko jest mi jednoznacznie coś doradzić, ale pewnie jak coś więcej powiesz, to uda się coś wyczarować wspólnie ;)

0

Załączam schemat (Solving app) pokazujący jak ten program miałby wyglądać (tych przycisków w oknie ostatniego poziomu na pewno będzie więcej). Na dole jest przycisk pozwalający wrócić do poprzedniego okna. Problem w tym, że tych okien musi być naprawdę dużo. Np. jeśli w menu głównym klikniemy przycisk OPTION 2 to pojawi się inny zestaw okien niż gdy klikniemy tam OPTION 1. Ten zestaw okien będzie prowadził do kolejnego itd. Czyli całość ma strukturę drzewa. To pokazuje drugi załącznik (option tree). Oczywiście tam będą różne opcje, tylko nazwałem je tak powtarzalnie dla uproszczenia. No i musi ich być znacznie więcej.

0

Ale zauważ, że (przynajmniej tak to wygląda z Twoich rysunków) - schemat jest taki sam (albo bardzo zbliżony) dla wszystkich opcji.

Wybierasz "Opcja 1" i pojawiają Ci się "option 1" i "option 2", z czego każda z nich ma znowu dwie subopcje. Więc tak naprawdę to układ/logika przechodzenia przez ekrany będzie z grubsza stała, a jedynie będzie się różnić treściami - np. jeśli najpierw wybierzesz "okrąg" to na późniejszym etapie będzie Cię pytać o średnicę, a w przypadku trójkąta - o długość przeciwprostokątnej ;)

Tak samo obrazki, które chcesz wstawiać - tworzysz sobie układ z miejscem na obrazek, a potem wstawiasz odpowiednią grafikę, w zależności od tego, jakie wybory zostały dokonane wcześniej.

0

Dla pełnej jasności, na bliższym mi przykładzie z fizyki klasycznej można to też tak przedstawić:

  • w pierwszym oknie jest do wyboru mechanika, termodynamika, elektromagnetyzm, optyka:
  • po wybraniu mechaniki przechodzi się do okna, w którym do wyboru jest mechanika płynów i mechanika ciał stałych; po wybraniu tej drugiej przechodzi się do okna z wyborem statyki, kinematyki lub dynamiki; po wybraniu statyki pojawia się okno z zagadnieniami: belki, kratownice, tarcie; po wybraniu kratownic trzeba wybrać jeden z przypadków, dalej podaje się wymiary i siły a program liczy reakcje
  • jeśli zamiast mechaniki wybierze się elektromagnetyzm to kolejne okno pozwala na wybór: prąd elektryczny, pole magnetyczne lub indukcja elektromagnetyczna; po wybraniu prądu elektrycznego kolejnego okno zawiera przyciski: prawo Ohma, prawo Kirchhoffa, prawo Joule’a; wybranie prawa Kirchhoffa powoduje przejście do przypadków obwodów, gdzie można obliczyć prądy dla danego przykładu

Realizacja tego schematu na ukrywanych kartach wydaje się trudna, bo do każdego okna musiałaby być osobna karta (każde okno ma inne przyciski).

0

No to można zrobić np. nowe okno wyskakujące. Czyli masz główne okno, na którym masz możliwość dokonania wyboru pierwszego stopnia, a następnie wyskakuje nowe okienko, które już jest dopasowane do danego zagadnienia. Tutaj już ilość kart znacznie spada ;)

0

Może zrób kilka rozwijanych list z opcjami do wyboru. Po wybraniu opcji na liście górnej, zawartości listy poniżej zmieni się i dostosuje do wybranej opcji. Itd.
Unikniesz tworzenia widoków dla kolejnych wariantów.
Jak dobrze to zaprogramujesz, to będzie działało "samo" (tzn. stwórz strukturę danych opisującą w sposób ogólny Twój interfejs). Potem to oprogramuj. I potem dodajesz tylko rekordy opisujące kolejne warianty, a interfejs będzie się tworzył automatycznie.

Poza tym - co do platformy, to myślę, że możesz to zrobić w formie responsywnej strony internetowej, którą potem (jeśli będziesz chciał) zamkniesz jednym ruchem w WebView. Będziesz miał przy okazji i stronę i aplikację.

A stronę i te rozwijane listy utworzysz dynamicznie za pomocą JS.
Ta strona - jeśli nie masz serwera może działać lokalnie (da się to potem przenieść w całości do aplikacji mobilnej). Nie wiem jak skomplikowane będą obliczenia, ale może JS da radę. Gdybyś miał serwer, to mógłbyś dodać do tego php i wtedy obliczenia wykonywałby serwer. Ale wtedy działałoby to tylko on-line.

Jeśli jednak obliczenia są skomplikowane (np. dużo równań do rozwiązania, jakieś rozbudowane bazy danych/współczynników potrzebnych do obliczeń, itp.), to aplikacja mobilna może działać tak sobie. Będziesz musiał wydzielić obliczenia do osobnego wątku, bo nie możesz blokować głównego wątku aplikacji.
A więc wielowątkowość. Obliczenia się wykonują, a interfejs nadal działa (i można coś poprzestawiać). Po wykonaniu obliczeń wątek zgłosi zakończenie pracy i musisz to obsłużyć (odebrać wyniki i je wyświetlić).
To nie jest trywialne zadanie.

Generalnie - pracy nad aplikacją (jakąkolwiek) nie rozpoczyna się od interfejsu. Rozwiąż kilka zadań w JS i zobacz jak to działa (czy Twoje obliczenia nie będą trwały godzinami).
Możesz też zainstalować Android Studio, tam utworzyć domyślny projekt i w głównej aktywności zapuść Twoje obliczenia. Zobacz, czy średniej jakości komórka da radę to w sensownym czasie policzyć.
Jeśli nie - to będziesz wiedział, że trzeba użyć czegoś mocniejszego.

0

Wolałbym w miarę możliwości uniknąć rozwiązania z wyskakującymi okienkami. Spróbuję to zrobić na tych ukrywanych kartach. Co do formy to zdecydowałem się już na program komputerowy. Aplikacja mobilna mi się nie przyda, bo musiałaby być na iOS (Androida nie używam na co dzień) a problemy z tym związane już omówiliśmy na początku. Webowa apka też odpada w tym przypadku. Także zostanę przy tradycyjnym rozwiązaniu w postaci programu na PC. Spróbuję w Delphi tak jak mi radzicie i najwyżej jeśli okaże się to zbyt skomplikowane w tym języku (chociażby ze wzgl. na te zmieniające się okna czy inne problemy, które wyjdą w praniu) to poszukam innego języka, w którym można to zrobić. Ale pewnie nie znajdę nic wyraźnie lepszego, bo potrzebny mi jest prosty język z wygodnym tworzeniem interfejsu.

1

Spróbuję w Delphi tak jak mi radzicie i najwyżej jeśli okaże się to zbyt skomplikowane w tym języku[...] to poszukam innego języka,

"Zawodowcy" często odradzają Delphi jako narzędzie mało profesjonalne i ich ograniczające. Faktem jest, że paru drobiazgów mu brakuje, niemniej ten język/środowisko cały czas ewoluuje i często się okazuje, że coś, czego brak ludziom przeszkadza, zostało wdrożone do języka kilka(naście) lat temu. Niedawno miałem rozmowę z pewną osoba z forum, która zaczęła narzekać na Delphi i to, że brakuje tam paru rzeczy. Dopytałem, o które chodzi, a gdy mi je podał, to szybko odesłałem linki z informacją, że od ok. 10 lat to już jest ;)

W każdym razie, po tym wstępie, przejdę do sedna: **Nie znajdziesz ** niczego prostszego niż Delphi. Może dla niektórych hackerów Delphi/Pascal są zbyt mało elastyczne, ale do 95% programów desktopowych Delphi się nadaje idealnie. Poza tym walka z oknami/panelami/kartami/ramkami/czymkolwiek innym, będzie miała miejsce także w innych językach programowania. Jakbyś zrobił to chociażby w C++ i Qt, to tak samo byś musiał walczyć ze stworzeniem interface, a do tego bez wsparcia w postaci technologii RAD, które oferuje Ci Delphi. Podsumowując - jeśli szukasz czegoś prostszego niż Delphi, to życzę powodzenia, ale baaardzo kiepsko to widzę :P

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