Odkąd sięgam pamięcią, wszystkie moje programy działały w ciszy. Ostatnim zapamiętanym doświadczeniem z dźwiękiem były próby z ProTrackerem na Amidze. Dziś okazało się, że to nieprawda, w mojej pracy dyplomowej robiłem beep. Co prawda tylko raz w momencie kiedy użytkownik naciśnął niewłaściwy klawisz.
Tak wspaniałej funkcjonalności nie mogłem sobie odpuścić. Chwila szukania i trafiłem na to pytanie. Skorzystałem z odpowiedzi samego autora i powstał odpowiednik pascalowego beep:
private void beep()
{
AlertDing ding = new AlertDing(250, 8);
ding.Play();
}
Jeszcze trzeba nad tym popracować, żeby dobrze się wyłączał dźwięk po zakończeniu programu, ale i tak jest elegancko.
Jako, że na razie zależy mi na jak najwiekszym podobieństwie do Pascala, musiałem zaimplementować wersję funkcji readkey. Jak to zwykle bywa w internecie wiedza jest rozmyta, ale udało mi się zebrać to w wystarczająco dobry odpowiednik:
[DllImport("user32.dll")] static extern short GetAsyncKeyState(int vKey);
private static char ReadKey()
{
bool search = false;
var pressed = 0;
do
{
for (int i = 0; i < 255; i++)
{
short keyState = GetAsyncKeyState(i);
if (0 != (keyState & 0x8000))
{
pressed = i;
search = true;
break;
}
}
Application.DoEvents();
}
while (!search);
return (char) pressed;
}
Zostawiam dla siebie i potomnych. Funkcja GetAsyncKeyState ma taką fajna właściwość, że potrafi podać, czy dany klawisz jest wciśnięty aktualnie lub był wciśnięty od czasu ostatniego jego sprawdzenia.
Pierwsze zmiany już za mną, pierwsze różnice też. Widać, że z pewnymi zmianami stylu nie dam rady (bo nie można) czekać do zrobienia całości. Choćby taki drobiazg jak spacja po przecinku.
Na razie:
- zmieniłem przypisania (pascalowe ':=' to była chyba jedna z jego głupszych cech),
- dodałem deklaracje (tu właśnie przecinki oraz przeniesienie tej części na koniec),
- ustawiam wartości początkowe zmiennych,
- na razie zachowuje nazwy funkcji i zmiennych choć repeat NAPIS until false; nawet jako do{NAPIS();} while (true); mocno razi,
- dobrzy ludzie zachowali dokumentacje do BGI, pomocna,
- brak wcięć jest zabójczy dla kodu, to chyba jeden z ostatnich tak przeze mnie napisanych programów, oczywiście dodaje wcięcie (Ctrl+K, F w Visual Studio działa znakomicie),
- wszystkie apostrofy ' trzeba będzie zmienić na ",
- warunki w ifach otoczyć nawiasami i dodać drugi znak '=',
- pousuwać then (tego na razie nie robię z automatu, bo później nie będzie widać struktury kodu w ogóle),
- słowa kluczowe: begin i end zamieniam na nawiasy klamrowe: '{' i '}', to można z automatu, trochę dziwne, że kończących jest więcej, ale sprawdziłem różnice i nic nadmiarowo się nie zmieniło,
- poradziłem sobie z funkcją readkey, przy pomocy tego pytania i odpowiedzi
- zatrzymuję mnie aktualnie funkcja getmem, wykorzystywałem ją do rysowania obwódki (cokolwiek by to znaczyło), dam radę.
Commity lecą jak szalone, wydaje się, że w okolicach wtorku powinno być widać pierwsze efekty.
Ponieważ ma być nowocześnie, to projekt oczywiście będzie przechowywany w repozytorium i to rozproszonym. Więc stwierdziłem, że przy okazji przekonam się do gita. Założyłem repozytorium na githubie: https://github.com/piotrbla/PrzepisanyDyplom . Są już pierwsze commity.
Ponieważ najpierw założyłem repozytorium, a później chciałem wrzucić pliki to przeżyłem kilka nerwowych chwil. Okazało się, że plików nie ma w oczekiwanej lokalizacji na dysku. Zaczęło się nerwowe poszukiwanie i okazało się, że program jest tylko na dysku backupowym i do tego spakowany. Na szczęście przygoda skończyła się szczęśliwie i mogę się zająć dziełem zniszczenia.
Jeszcze słówko jak będę przepisywał. Podstawą jest napisanie funkcji, które w pascalu korzystały z BGI (ciekawe, czemu na wiki jest oprócz wersji angielskiej tylko wersja polska i francuska). W C# wstępnie zrobię to na GDI. Reszta modyfikacji powinna się zamknąć w zmianie konstrukcji sterujących i definicji funkcji na ich odpowiedniki w C#.
Jakiś czas temu przy robieniu porządków znalazłem dyskietki, potem okazało się, że mam jeszcze dostęp do komputera, który potrafi je przeczytać (czyli ma stację dysków). Najciekawszym znaleziskiem okazały sie moje programy z lat 1994-1996 (głównie w pascalu). Wśród nich jedna perełka: moja praca dyplomowa z technikum (1994-1995): symulator rozdzielni 110 kV (szczegóły później).
Od dawna przymierzałem się do przepisania jej na nowoczesny język programowania (for fun), wybór padł na C# z racji wystarczającego podobieństwa do pascala.
Dziś zacząłem zabawę, założyłem sobie, że cały proces powinien zająć od kilku do kilkunastu godzin. Chciałbym też podzielić to na dwie części:
- doprowadzenie do uruchomienia się i prawidłowego działania (bez zmian w sposobie działania kodu),
- ulepszenie kodu (i po to niniejszy blog, mający cel edukacyjny) do takiej postaci jak bym to napisał dzisiaj.
Co jakiś czas będę pisał tutaj o postępach.