Dokumentacja ShtGraph
NOWEGO UNIT'u z Shift Company

ŚCIĄGAJ ShtGraph (125 kb)
Wstęp Interface
Oto dokumentacja UNIT'u ShtGraph przeznaczonego do użytku z kompilatorem FPC. Powstał on w oparciu o procedury z Delphi, co dało rezultat "okienek" :).
Unit ma na celu uproszczenie programowania w systemie Windows... szczególnie tym którzy znają dobrze Pascala i nie śpieszno im do Delphi, C++ itp.
Radzę przeczytać najpierw poniższy opis zanim zabierzesz się do pisania programiku typu "Hello World" ;).
W razie jakichkolwiek pytań, na które odpowiedzi nie znalazłeś w tym dokumencie, napisz do mnie.
UNIT ten jest FREEWARE i pobieranie za niego opłat w jakiejkolwiek formie jest łamaniem prawa.
Autor (Łukasz Hejnak) Zastrzega sobie niniejszym prawa do modyfikowania UNITu i tego dokumentu.
Wszelkie informacje znadziej na stronie
www.shiftcompany.prv.pl.
Sposób pisania programów.
Programy pod Windows działają na zasadzie głównej pętli i procedur. Standardowy program będzie wyglądał tak:
Uses inne moduły...,ShtGraph;
definicje zmiennych
...
...
Begin
przygotowanie zmiennych
...
...
OpenWindow(X,Y,Szerokosc,wysokosc,timer(?),typ okna,'tytul okna');
przygotowanie rzeczy wymagajacych trybu graficznego
...
np. wyglad okna...
teksty itp.
...
ShowScreen;
Repeat
MultiTask(5);
...
if Wypadek1 then Dzialanie1
if Wypadek2 then dzialanie2
...
Until Warunek zakończenia programu;
zakańczanie programu
...
...
ShutDownWindow;
end.
Na początku może to się wydawać dziwne... ale tak to trzeba robić by zachować kompatybilność z Windowsem...
Poniżej znajduje się prosty kod...opis procedur jest w niższych działach.
PS. Po wklejeniu poniższego kodu do notatnika, przy próbie zapisu powinna się
wyświetlić informacja o formacie UNICODE...naciśnij NIE.
Uses Dos,ShtGraph;
Var
A:Byte;
H,OldH:Array[1..4]of Word;
Begin
OpenWindow(100,100,200,200,0,2,'Próbny Kod dla SHTGRAPH');
SetRGBPalette(0,180,180,180);
ClearScreen(0);
SetRGBPalette(0,0,0,0);
SetRGBPalette(1,255,255,255);
SetColor(0);
Rectangle(1,1,100,100,1);
SetColor(1);
Rectangle(100,1,200,100,1);
OutTextXY(10,30,'Czarny');
OutTextXY(10,60,'Kwadrat');
SetColor(0);
OutTextXY(110,30,'Biay');
OutTextXY(110,60,'Kwadrat');
SetColor(0);
Rectangle(1,100,100,200,0);
OutTextXY(10,130,'Pusty');
OutTextXY(10,160,'Kwadrat');
SetColor(2);
For A:=100 to 200 do
Begin
SetRGBPalette(2,0,0,A);
Line(A-1,100,A-1,200);
End;
SetColor(1);
OutTextXY(110,130,'mieszny');{Polskie znaki radzę wpisywać spod edytora FPC (fp.exe)}
OutTextXY(110,160,'Kwadrat');
ShowScreen;
Repeat
MultiTask(4);
GetTime(H[1],H[2],H[3],H[4]);
if H[3]<>OldH[3] then
Begin
SetColor(0);
OutTextXY(10,10,Zero(2,OldH[1])+':'+Zero(2,OldH[2])+':'+Zero(2,OldH[3]));
SetColor(1);
OutTextXY(10,10,Zero(2,H[1])+':'+Zero(2,H[2])+':'+Zero(2,H[3]));
OldH:=H;
ShowScreen;
end;
Until LButton;
Repeat
MultiTask(0);
Until NOT LButton;
ShutDownWindow;
End.
Jeżeli zainstalowałeś już ShtGraph wystarczy że skopiujesz ten tekst do nowego pliku textowego,
zmienisz jego rozszerzenie na 'pas', klikniesz prawym przyciskiem i z menu wybierzesz opcję
"Komp. z UNITem ShtGraph" (Kompiluj z Unitem ShtGraph), a gdy skończy kompilację uruchomisz nowy plik 'exe' :)
(plik 'ow' nie jest potrzebny po skompilowaniu i możesz go spokojnie usunąć)
The Interface
Typy
Zmienne
Procedury
Funkcje
Typy
W ShtGraph występuje dodatkowy Typ,
_CharSetTypes=(All,Nums,Alfs,AlfsSpec,NumsSpec,Spec);
Jest to typ definiujący rodzaj znaków do odczytu z klawiatury. Wykorzytuje go procedura PoleEdycji
Znaczenia poszczególnych wartości:
All - wszystkie znaki
Nums - TYLKO liczby
Alfs - TYLKO litery
AlfsSpec - Litery i znaki specjalne
NumsSpec - Liczby i znaki specjalne
Spec - TYLKO znaki specjalne
Zmienne
Oto spis zmiennych dostępnych w SHTGraph:
_CurrentColor
_GetMaxX
_GetMaxY
_InternetExplorerDir
Key_Alt
Key_BackSpace
Key_CapsLock
Key_Ctrl
Key_Enter
Key_Number
Key_Shift
KeyPressed
LineFatSetting
_Rundlldir
_Rundll32Dir
ScreenLog
_TextSize
_TextSpaceSize
_THERGBLOG
_WindowsDir
_WinTEMPDir
_WindowsVersion
_WindowsVersion:String;
Wymagania: InitializeWindowsVAR;
Przechowuje aktualną wersję Windowsa:
'95/98' - Windows 95,98
'NT/2k' - Windows NT,2000 (Sprawdzane na Proffesional)
_Rundlldir:String;
Wymagania: InitializeWindowsVAR;
Przechowuje ścieżkę dostępu do Rundll.exe
_Rundll32dir:String;
Wymagania: InitializeWindowsVAR;
Przechowuje ścieżkę dostępu do Rundll32.exe
_InternetExplorerDir:String;
Wymagania: InitializeWindowsVAR;
Przechowuje ścieżkę dostępu do Internet Explorera.
_WinTEMPDir:String;
Wymagania: InitializeWindowsVAR;
Przechowuje ścieżkę dostępu do folderu TEMP Windowsa.
_WindowsDir:String;
Wymagania: InitializeWindowsVAR;
Przechowuje ścieżkę dostępu do Windowsa.
_TextSpaceSize:Integer;
Wymagania: SetTextSpaceSize;(domyślnie 8)
Przechowuje aktualną odległość między znakami (dla OutTextXY)
_TextSize:Integer;
Wymagania: SetTextSize;(domyślnie 1)
Przechowuje aktualną wielkość czcionki (dla OutTextXY)
LineFatSetting:Integer;
Wymagania: SetLineFat;(domyślnie 1)
Przechowuje aktualną grubość linii (dla Line)
KeyPressed:Boolean;
Na bierząco pokazuje stan klawiatury.
True - przycisk wciśnięty
False - przycisk nie wciśnięty
_CurrentColor:Byte;
Wymagania: SetColor;(domyślnie 0)
Przechowuje aktualny kolor rysowania, pisania itd.
_GetMaxX:Integer;
Przechowuje Maxymalną pozycję "X" w oknie.
_GetMaxY:Integer;
Przechowuje Maxymalną pozycję "Y" w oknie.
ScreenLog:array[0..2000,0..1500]of Byte;
Jest to Bitmapa odwzorowująca cały ekran.
Każde pole ma wartość swojego koloru z paletty, ale NIE W RGB.
Planuję to zmienić w przyszłości, ale najpierw muszę się upewnić, że nie zwolni to działania procedur.
_THERGBLOG:RGBType;
Przechowywuje AKTUALNE wartości wszytskich kolorów w palecie.
Key_Number:Byte;
Przechowywuje wartość wciśniętego klawisza.
Key_Shift:Boolean;
Wymagania: ReadKey;
Na bierząco pokazuje stan klawisza Shift. (wciąż mam pewne błędy z tą zmienną)
True - Shift wciśnięty
False - Shift nie wciśnięty
Key_Alt:Boolean;
Wymagania: ReadKey;
Na bierząco pokazuje stan klawisza Alt.
True - Alt wciśnięty
False - Alt nie wciśnięty
Key_Ctrl:Boolean;
Wymagania: ReadKey;
Na bierząco pokazuje stan klawisza Ctrl.
True - Ctrl wciśnięty
False - Ctrl nie wciśnięty
Key_BackSpace:Boolean;
Wymagania: ReadKey;
Na bierząco pokazuje stan klawisza BackSpace.
True - BackSpace wciśnięty
False - BackSpace nie wciśnięty
Key_Enter:Boolean;
Wymagania: ReadKey;
Na bierząco pokazuje stan klawisza Enter.
True - Enter wciśnięty
False - Enter nie wciśnięty
Key_CapsLock:Boolean;
Wymagania: ReadKey;
Na bierząco pokazuje stan klawisza CapsLock.
True - CapsLock wciśnięty
False - CapsLock nie wciśnięty
Procedury
Oto Spis Procedur w ShtGraph:
ButtonInitialization
ButtonTime_Loop
Circle
ClearScreen
InitializeWindowsVAR
Line
MultiTask
OpenWindow
OutTextXY
PoleEdycji
PutPixel
Rectangle
SetColor
SetLineFat
SetRGBPalette
SetTextSize
SetTextSpaceSize
ShowScreen
ShutDownWindow
wait
WaitForMousePressed
ButtonInitialization(Button:ButtonType);
Przygotowuje ekran na podstawie danych wprowadzonych do zmiennej "Button".
ButtonTime_Loop(var Button:ButtonType);
Odświeża przycisk o numerze Button.BNumber na podstawie reszty jego wartości.
Kod przykładowy do używania tej procedury znjaduje się tu.
Circle(X0,Y0,R,DegSt,DegEd,Fill:Integer);
Rysuje Koło na podstawie podanych parametrów:
X0 - Pozycja "X" środka koła
Y0 - Pozycja "Y" środka koła
DegSt - Stopień od którego zaczyna rysować koło
DegEd - Stopień na którym kończy rysować koło
Fill - Wypełnienie - 0=puste , 1=pełne
ClearScreen(K:Integer);
Wyczyszcza ekran na i zostawia kolor tła "K".
InitializeWindowsVAR;
Przygotowuje do użycia zmienne związane z Windowsem.
np.
_InternetExplorerDir
_WindowsDir
_WinTEMPDir
_WindowsVersion
Line(X1,Y1,X2,Y2:integer);
Rysuje Linię (wykorzystując _CurrentColor) od punktu X1,Y1 do punktu X2,Y2
MultiTask(priority:word); (z Delphi)
Musisz używać tej procedury, aby program mógł 'komunikować' się z windowsem, tj. dostawać informacje o wszelkich akcjach (typu wciśnięcie przycisku, ruch myszy itp.)
OpenWindow(x,y,l,h:integer;timer,wtype:Word;Title:Pchar); (z Delphi)
Otwiera nowe okno o właściwościach:
X - Pozycja "X" Lewego górnego rogu okna na pulpicie
Y - Pozycja "Y" Lewego górnego rogu okna na pulpicie
l - Szerokość okna
h - Wysokość okna
timer - ??? zawsze ustawiam "0"
wtype - Typ Okna (0-3) sprawdź sam możliwości :)
Title - Tytuł okna (wyświetlany w pasku tytułu)
OutTextXY(X,Y:Integer;S:String);
Wypisuje Text "S" zaczynając od punktu x,y używając aktualnych ustawień:
_CurrentColor
_TextSize
_TextSpaceSize
PoleEdycji(X,Y:Integer;Var S:String;Var Key:Char;MaxChar:Byte;CharSet:_CharSetTypes);
Utwarza nowe "pole" w które można wprowadzać tekst.
x,y - lewy górny róg pola
S - zmienna do której zapisywany jest aktualnie wprowadzony tekst
Key - ostatni znak który został wprowadzony
MaxChar - MAXymalna ilość znaków do wprowadzenia
CharSet - zestaw znaków dozwolonych w polu edycji
PutPixel(x,y:Word;k:byte);
Zamalowuje Pixel w punkcie x,y kolorem k.
Rectangle(X1,Y1,X2,Y2,Full:Integer);
Rysuje prostokąt używając _CurrentColor i LineFatSetting, lewym górnym rogu X1,Y1, a prawym dolnym X2,Y2.
Jeżeli zmienna Full=0 prostokąt jest pusty w środku, jeżeli Full=1 wtedy jest wypełniony _CurrentColor.
SetColor(Col:byte);
Zmienia aktualny kolor (_CurrentColor) na "col"
SetLineFat(A:Integer);
Zmienia aktualną grubość linii (LineFatSetting) na "A"
SetRGBPalette(A,R,G,B:Byte);
Ustawia nowe wartość "R","G","B" colorowi "A" w palecie.
SetTextSize(A:Integer);
Ustawia wielkość czcionki (_TextSize)
SetTextSpaceSize(A:Integer);
Ustawia wielkość odstępów między znakami (_TextSpaceSize)
ShowScreen; (z Delphi)
Wyświetla na ekranie aktualny stan buffora grafiki.
ShutDownWindow; (z Delphi)
Zamyka okno (i program).
wait(K:LongInt);
Zatrzymuje program na "k" milisekund (1/1000)
WaitForMousePressed;
Zatrzymuje program do czasu wciśnięcia przycisku myszki w oknie programu.
Funkcje
Funkcje w SHTGraph:
Dwojkowo
FEX
GetPixel
LButton
MouseInWindow
MouseMove
MouseX
MouseY
RButton
Readkey
SearchTxtFile
Zero
Dwojkowo(B:Byte):String;
Przetwarza "B" na jego postać w systemie Dwójkowym.
FEX(S:String):Boolean;
Sprawdza czy w aktualnym folderze znajduje się plik o nazwie "S".
GetPixel(X,Y:Integer):Byte;
Pobiera Kolor Pixela w punkcie x,y
LButton:bool; (=boolean)
Sprawdza czy aktualnie jest wciśnięty lewy przycisk myszki.
MouseInWindow(X1,Y1,X2,Y2:Integer):Boolean;
Sprawdza czy kursor myszy jest w kwadracie o lewym górnym rogu w punkcie X1,Y1 , a prawym dolnym w pkt. X2,Y2.
MouseMove:Boolean;
Jest True jeżeli mysz się porusza w danym momencie. False jeżeli nie...
MouseX:Word;
Podaje Pozycję X kursora myszy (odwołując się do okna programu)
MouseY:Word;
Podaje Pozycję Y kursora myszy (odwołując się do okna programu)
RButton:bool; (=boolean)
Sprawdza czy aktualnie jest wciśnięty prawy przycisk myszki.
Readkey:Char;
Sprawdza aktualnie wciśnięty klawisz na klawiaturze.
SearchTxtFile(FileName,SearchString:String):String;
Przeszukuje plik tekstowy o nazwie "FileName" w poszukiwaniu "SearchString" i zwraca całą linijkę w której znajduję się poszukiwany tekst.
Zero(N,W:Word):String;
Konwertuje "W" na String z "N" znaków (jeżeli "W" ma mniej znaków niż "N" wtedy dopisywane są zera)
Przykład dla procedur: ButtonInitialization
ButtonTime_Loop i typu ButtonType.
Uses ShtGraph;
Var
Button:ButtonType;
Finish:Boolean;
Procedure Przycisk1;
Begin
SetColor(0);
SetLineFat(1);
Rectangle(50,60,150,70,1);
SetColor(3);
OutTextXY(60,60,'Przycisk1');
ShowScreen;
End;
Procedure Przycisk2;
Begin
SetColor(0);
SetLineFat(1);
Rectangle(50,60,150,70,1);
SetColor(3);
OutTextXY(60,60,'Przycisk2');
ShowScreen;
End;
Procedure Przycisk3;
Begin
SetColor(0);
SetLineFat(1);
Rectangle(50,60,150,70,1);
SetColor(3);
OutTextXY(60,60,'Przycisk3');
ShowScreen;
End;
Begin
Button.BAllNumber:=4;
Button.BText[1]:='Przycisk 1';
Button.BText[2]:='Przycisk 2';
Button.BText[3]:='Przycisk 3';
Button.BText[4]:='Wyjcie';
Button.BCoorsX1[1]:=10;
Button.BCoorsY1[1]:=10;
Button.BCoorsX1[2]:=100;
Button.BCoorsY1[2]:=40;
Button.BCoorsX1[3]:=10;
Button.BCoorsY1[3]:=100;
Button.BCoorsX1[4]:=100;
Button.BCoorsY1[4]:=140;
{Podawanie X2 i Y2 jest OPCJONALNE mozesz podac sam, jezeli nie
chcesz to program poda automatycznie (ustalane przy Button Initialization)}
Button.BCoorsX2[4]:=200;
Button.BCoorsY2[4]:=150;
Button.BTextHeight[1]:=1;
Button.BTextHeight[2]:=1;
Button.BTextHeight[3]:=1;
Button.BTextHeight[4]:=1;
OpenWindow(10,10,200,200,0,2,'Button Test');
SetRGBPalette(0,0,0,0);
SetRGBPalette(3,255,255,255);
ClearScreen(0);
For Button.BNumber:=1 to Button.BAllNumber do ButtonInitialization(Button);
Finish:=False;
Repeat
MultiTask(0);
For Button.BNumber:=1 to Button.BAllNumber do ButtonTime_Loop(Button);
If LButton then
Begin
If Button.BStatus[1] then Przycisk1;
If Button.BStatus[2] then Przycisk2;
If Button.BStatus[3] then Przycisk3;
If Button.BStatus[4] then Finish:=True;
End;
Until Finish;
While LButton do MultiTask(0);
ShutDownWindow;
End.
Dokumentacja do ShtGraph powinna być dołączona do UNITu ShtGraph.
Autor: Łukasz Hejnak
Strona WWW
E-mail