Mam pewien projekcik do opracowania, a ostatni raz pisałem cos takiego 25 lat temu na studiach, więc moje wybory były podyktowane daleką przeszłością.
W skrócie aplikacja komunikująca się z urządzeniem laboratoryjnym (spektrofotometr) po RS232 i odczytuje 96 wartości pomiaru na próbkach (może to być np. w kierunku African Swine Feaver, czyli powszechnej wsród dzików ASF, ale może być także Covid-19 - zależy od testu, który obsługujemy). Na tych wynikach należy przeprowadzić proste obliczenia, żeby ocenić zgodnie ze specyfikacją testu czy konretna próbka jest POSITIVE (zarażony), czy NEGATIVE (zdrowy). Dla użytkownika ma to być w miarę przyzwoicie zwizualizowane i "klikalne".
Od kilku ładnych dni pracowałem nad zakodowaniem wymaganych podstawowych funkcjonalnosci w MS Visual Studio z wykorzystaniem C++, Forms'ów i biblioteki System::Drawing oraz komunikacją po RS232. Mam też "podsłuchany" protokół komunikacji konkretnego urządzenia diagnostycznego, ale utknąłem na pozornie prostym zagadnieniu - jak zadeklarować i przechowywać dane o tych 96 próbkach w pamięci zanim je aplikacja przetworzy przed zapisaniem/eksportem wyników do pliku?
Wyobrażałem to sobie jako tablicę 96 struktur, ale nijak nie ogarniam jak to konkretnie zakodować, a żaden ze znalezionych przykładów nie pozwolił mi złapać analogii. Symbol "daszka" (ang. "hat") w różnych konfiguracjach dla metod formularza w miarę ogarniam, ale jak to określił mój kolega zapis ^>^ to raczej "kotek z dziubkiem w prawa stronę" (oczywiście patrząc na mordkę kotka, ale to lewa strona jego kociej mordki)... Chciałbym się odwoływać do poszczególnych obiektów w możliwie zrozumiały sposób, np. well_array[i].well_result = "jakaśwartośćFloat".
Kwestia również miejsca w projekcie, w którym powinienem te dane zadeklarować i zainicjalizować, aby je później napełniać danymi odczytanymi ze spektrofotometru używając metod zakodowanych w moim formularzu. Z okna formularza także manipuluję np. typami poszczególnych pól (próbka S, pozytywna próbka kontrolna PC, itd.), albo przypisuję im numer ewidencyjny (barcode naklejany na fiolce z próbką).
struct well { // 8x12=96 tzw. "studzienek" (ang. "well"), dla każdej studzienki poniższe dane:
//String ^ well_name1; // A1, A2, .. H12
char well_name[4]; //H12+"\n"
short well_type; // 0=empty, 1=sample S, 2=positive control PC, 3=negative control NC, 255=blanking, 254=other?
//String ^ well_barcode1; // EAN, CODE 128, CODE 39, UPCA
char well_barcode[128];
float well_value; // from laboratory device
short well_blocking; // blocking % of the samples - do obliczenia
short well_result; // 0=negative, 1=positive, 2=doubt, -1=unknown - do obliczenia
bool well_selected;
};
well well_array[96];
Obecnie mam jeden formularz, ale z pewnością kolejne funkcjonalności będa realizowane w osobnych oknach.
Będę zobowiązany za jakiekolwiek uwagi, bo utknąłem, nie mam już chyba chęci na kolejne eksperymenty z ref struct, value struct, non-manage vs managed class, opluwaniem przez kompilator. W zasadzie jedynym sensownym pomysłem jaki mam jest wyrzucenie tego wszystkiego do śmieci i może przepisanie funkcji kontrolek formularza oraz obsługi RS232 w C#, które okazałoby się bardziej zrozumiałe...