Dziś jest piątek, 5 grudnia 2008 roku (z kalendarza...)

Powrót Turbo Vision

Wiele programów działających w systemach okienkowych wyposażonych jest w graficzny interfejs użytkownika. Pojęciem analogicznym do tego terminu jest "tekstowy interfejs użytkownika" (TUI) wykorzystywany przez programy konsolowe, w którym poszczególne kontrolki zbudowane są z różnych znaków ASCII. Tekstowe interfejsy mają śmiesznie małe zapotrzebowanie na pamięć i moc procesora, dzięki czemu idealnie nadają się do stosowania w środowiskach, gdzie instalacja graficznego środowiska jest niewskazana (np. serwery).

Jedną z bibliotek TUI jest Turbo Vision opracowane przez firmę Borland wydane pierwotnie w wersji dla Pascala oraz C++. Z pomocą tej biblioteki firma opracowała IDE dla swoich produktów z początku lat dziewięćdziesiątych. Szersze upowszechnienie nie miało miejsca ze względu na premierę pierwszych "pełnometrażowych" systemów Windows.

Okazuje się jednak, że Turbo Vision żyje do dzisiaj. Firma Borland udostępniła jeszcze w latach dziewięćdziesiątych pełen kod źródłowy dla wersji C++ na licencji public domain. Zaczęły go dalej rozwijać grupki pasjonatów, w pierwszej kolejności łatając kilka poważnych dziur bezpieczeństwa, a także tworząc porty na wszystkie popularniejsze systemy operacyjne. TVision wykorzystano m.in. w środowisku RHIDE (djgpp) oraz we Free Pascal Compilerze.

TUI potrzebuję do napisania pewnego programu do zarządzania użytkownikami na serwerze. W grudniu, z braku odpowiedniej biblioteki, zabrałem się za pisanie własnej, lecz skoro TVision się odnalazło, projekt idzie do piachu :). Pamiętając jeszcze obsługę mego znaleziska z czasów Turbo Pascala, a także posiłkując się przykładami, zacząłem pisać rzeczoną aplikację właśnie w nim.

Istnieje kilka "klonów" TVision powstałych po upublicznieniu kodu źródłowego. Największe wrażenie robi rhtvision będące rozszerzeniem portu użytego przy budowie środowiska RHIDE. Biblioteka dostępna jest na wiele systemów: Windows, Linux, FreeBSD, QNX, Solaris oraz DOS. Posiada wsparcie dla Unicode, różnych terminali, nowe komponenty oraz dodatki w stylu wbudowanej obsługi plików konfiguracyjnych. Oczywiście generowane interfejsy są eleganckie oraz intuicyjne w użyciu. Problemy sprawia instalacja, ponieważ ostatnia stabilna wersja (2.0.3) ukazała się w 2003 roku i tej za Chiny nie udało mi się skompilować. Autor pracuje obecnie nad wersją 2.1.0, której snapshoty są publicznie dostępne. Tutaj musiałem po jego ściągnięciu nałożyć jeden patch i kompilować wszystko z dodatkową flagą -fpermissive (GCC 4.1). Na szczęście w końcu się udało i mogłem przystąpić do zabawy.

Turbo Vision napisane jest w C++ i mocno wykorzystuje paradygmat programowania obiektowego. Hierarchia klas jest dobrze sprecyzowana, a dzięki dziedziczeniu programista może modyfikować różne aspekty zachowania interfejsu. Pracę rozpoczynamy od stworzenia klasy pochodnej od TApplication, w której nadpisujemy metody initStatusLine(), initMenuBar() oraz handleEvent(). Dwie pierwsze odpowiadają za stworzenie paska statusu u dołu ekranu oraz menusów u góry. Trzecia to metoda obsługi zdarzeń, gdzie możemy dowolnie oprogramować różne akcje generowane przez interfejs. Poniżej przedstawiony jest sposób tworzenia własnego menu:

TMenuBar * TUserist::initMenuBar(TRect r)
{
	r.a.y++;
	r.b.y = r.a.y+1;
	return new TMenuBar(r,
		*new TSubMenu("Use~r~ist", kbNoKey)+
			*new TMenuItem("~L~ista uzytkownikow", cmNone, kbF3, hcNoContext, "F3")+
			*new TMenuItem("~P~referencje", cmNone, kbF4, hcNoContext, "F4")+
			newLine()+
			*new TMenuItem("~W~yjscie", cmQuit, kbCtrlX, hcNoContext, "Ctrl-X")+
		*new TSubMenu("~O~kno", kbNoKey)+
			*new TMenuItem("~N~astepne", cmNext, kbNoKey, hcNoContext, "")+
			*new TMenuItem("~P~oprzednie", cmPrev, kbNoKey, hcNoContext, "")+
			*new TMenuItem("~Z~amknij", cmClose, kbNoKey, hcNoContext, "")+
			newLine()+ 
			*new TMenuItem("~K~askada", cmCascade, kbNoKey, hcNoContext, "")+
		*new TSubMenu("~P~omoc", kbNoKey)+
			*new TMenuItem("~P~omoc", cmNone, kbF1, hcNoContext, "F1")+
			*new TMenuItem("~O~ programie", cmAbout, kbF12, hcNoContext, "F12")
	);
} // end initMenuBar();

Podobna elegancja kodu cechuje resztę biblioteki. W przypisach znajdują się linki do screenshotów pokazujących, co osiągnąłem po zaledwie kilkudziesięciu minutach pracy, wliczając w to czas poświęcony na studiowanie dokumentacji oraz dostarczonych przykładów.

Powrót

Załączniki:

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 1 | Serwer wirtualny zapewnia