Aplikacje konsolowe
Pewnie kiedy╢ spotkali╢cie siΩ z okre╢leniem:
aplikacja konsolowa. Je┐eli nie to wyja╢niam: jest to aplikacja
uruchamiana w okienku MS - DOS. Taka opcja nadaje siΩ do pisania
prostych program≤w, kt≤re maj▒ byµ wy╢wietlane w okienku DOSa. »eby
aplikacja dzia│a│a w trybie okienkowym DOSa w kodzie programu musisz
umie╢ciµ tak▒ dyrektywΩ:
{$APPTYPE CONSOLE} // <-- aplikacja bedzie konsolowa
Je┐eli masz otwarte Delphi to zamknij formularz, a nastΩpnie
edytor kodu. Z menu Project wybierz View Source. Wy╢wietli Ci siΩ
zawarto╢µ pliku DPR. Usu± tekst tak aby na g≤rze pozosta│a nazwa
programu ( pierwsza linia - s│owo kluczowe program ). Pozostaw
tak┐e linie begin i end ( end z kropk▒ ). OK - teraz mo┐esz zapisaµ
sw≤j projekt ( ja zapisa│em pod nazw▒ console ). Dodaj dyrektywΩ {$APPTYPE
CONSOLE}. Napisz s│owo uses i po nim dodaj nazwΩ modu│u, kt≤ry bΩdzie
w│▒czony do aplikacji - modu│ Windows. Nasz program na tym etapie
powinien wygl▒daµ tak:
program console;
{$APPTYPE CONSOLE} // <-- aplikacja bedzie konsolowa
uses Windows;
begin
end.
W│a╢ciwy kod programu umieszcza siΩ pomiΩdzy linie
begin i end.
Napiszemy program, kt≤ry bΩdzie siΩ opiera│ na oknie
DOS i bΩdzie zajmowa│ ma│o miejsca na dysku. BΩdzie to instalator :)
Zanim jednak zaczniemy nale┐y wyja╢niµ parΩ podstawowych rzeczy. Wy╢wietlenie
tekstu w okienku nastΩpuje za pomoc▒ komendy Writeln. (tak jak w TP).
Je┐eli wiΩc chces wy╢wietliµ jaki╢ tekst piszesz:
Writeln('To jest tekst');
Je┐eli jednak uruchomisz program z tak wpisanym kodem
to otworzy siΩ okienko na sekundΩ, wy╢wietli tekst, a nastΩpnie
zniknie. »eby okno by│o przez ca│y czas otwarte mo┐esz zastosowaµ
komendΩ Readln. Powoduje to, ┐e program czeka na odpowied╝ u┐ytkownika
i kontynuuje pracΩ po naci╢niΩciu przycisku ENTER. Readln mo┐e
tak┐e s│u┐yµ do pobierania tekstu wpisanego przez u┐ytkownika - np:
var
Dir: String;
begin
Readln(Dir);
Zmienna Dir zawiera tekst wpisany przez u┐ytkownika.
Zanim zaczniemy pracΩ nad programem musisz stworzyµ
plik zasob≤w z plikami, kt≤re bΩd▒ instalowane. W moim wypadku bΩd▒
to pliki graficzne. Jak dodaµ takie pliki do zasob≤w - opisa│em w
artykule Instalator.
Gdy ju┐ masz gotowy w programie umie╢µ tablicΩ, kt≤ra
bΩdzie zawiera│a nazwy plik≤w umieszczonych w zasobie. W moim wypadku
taka tablica wygl▒da│a tak:
const
{ tablica plikow, ktore sa wlaczone do zasobow }
Files : array[0..6] of PChar =
('button100x30.gif', 'button100x40.gif', 'button100x50.gif',
'button120x30.gif', 'button120x50.gif', 'button140x28.gif',
'button88x31.gif');
Ja w zasobach umie╢ci│em 7 plik≤w.
Teraz najtrudniejsza czΩ╢µ zadania - trzeba napisaµ
procedurΩ, kt≤ra po kolei bΩdzie z zasobu wyci▒gaµ pliki i zapisywaµ
je na dysku. W procedurze bΩdzie kod odszukuj▒cy dany plik w zasobie,
a nastΩpnie zapisuj▒cy jego zawarto╢µ do pliku. Procedura wygl▒da
tak:
procedure Install(Source: String);
var
F: File;
I: Integer;
Res: Integer;
begin
{
Petla bedzie instalowala po kolei wszystkie pliki z tablicy
}
for I := Low(Files) to High(Files) do
begin
Sleep(400); // czekaj 400 milisekund
Writeln('Wypakowuje ' + Files[i]); // wyswietl informacje o wypakowanym pliku
AssignFile(F, Source + Files[i]);
ReWrite(F, 1); // stworz plik
{ wyszukaj zasobu okrslonego w tablicy }
Res := FindResource(hInstance, PChar(Files[i]), 'PHOTO');
{ zapisz zasob do pliku }
BlockWrite(F, LockResource(LoadResource(hInstance, Res))^,
SizeOfResource(hInstance, ReS));
CloseFile(F); // zamknij plik
end;
Writeln('');
{ po zakonczeniu instalacji wyswietl informacje o zakonczeniu }
Writeln('Instalacja zako±czona. Naci╢nij ENTER, aby zako±czyµ.');
Readln; // czkeja na nacisniecie klawisza
end;
Ca│a procedura opiera siΩ na wykonaniu pΩtli.
Procedura zawiera jeden parametr, kt≤ry m≤wi o katalogu, w kt≤rym bΩd▒
zainstalowane pliki. Najpierw w oknie nale┐y wy╢wietliµ nazwΩ pliku,
kt≤ry bΩdzie instalowany, nastΩpnie stworzyµ ten plik na dysku.
Teraz trudniejsza czΩ╢µ zadania - trzeba bowiem odszukaµ konkretny
plik. Robi to procedura FindResource. Drugim parametrem jest nazwa
odszukiwanego zasobu, a ostatni to ga│▒╝, w kt≤rym te zasoby siΩ
znajduj▒. Ja plik zasob≤w stworzy│em przy pomocy Visual C++ i dlatego
ga│▒╝ nosi nazwe PHOTO ( tak▒ sobie wybra│em ).
Kolejna czΩ╢µ procedury to zapis odszukanego zasobu
to pliku. Robi to polecenie BlockWrite. W niej do pliku zostaje zapisany
zasob≤w odszukany wcze╢niej przy pomocy procedury FindResource. Na ko±cu
plik zostaje zamkniΩty.
W│a╢ciwie ca│y program mamy ju┐ napisany. Teraz
tylko pocz▒tek ( co bΩdzie wy╢wietlane po uruchomieniu programu ). Ja
w bloku begin i end. umie╢ci│em taki kod:
var
Dir: String; // zawiera sciezke gdzie pliki maja byc zainstalowane
begin
Writeln('');
Writeln(' Copyright (c) 2001 by Adam Boduch ');
Writeln(' http://programowanie.of.pl ');
Writeln('');
Writeln('Gdzie mam zainstalowaµ?');
Readln(Dir); // pobierz wpisana nazwe
{ jezeli na koncu nie ma znaku \ to dodaj go }
if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
{ stworz katalog jezeli nie istnieje lub jezeli istnieje to rozpocznij
instalacje od razu }
if CreateDirectory(PChar(Dir), nil) then
Install(Dir) else Install(Dir);
end.
Tutaj nastΩpuje pobranie tekstu wpisanego przez u┐ytkownika.
U┐ytkownik okre╢la katalog, w kt≤rym chce zainstalowaµ pliki.
Nastepnie je┐eli na ko±cu nie ma znaku \ to zostaje dodany. P≤╝niej
je┐eli nie ma katalogu kt≤ry to u┐ytkownik wpisa│ nastΩpuje
stworzenie jego przy pomocy polecenia CreateDirectory. Oto ca│y kod
programu:
program console;
{$APPTYPE CONSOLE} // <-- aplikacja bedzie konsolowa
uses Windows;
{$R FILES.RES}
const
{ tablica plikow, ktore sa wlaczone do zasobow }
Files : array[0..6] of PChar =
('button100x30.gif', 'button100x40.gif', 'button100x50.gif',
'button120x30.gif', 'button120x50.gif', 'button140x28.gif',
'button88x31.gif');
procedure Install(Source: String);
var
F: File;
I: Integer;
Res: Integer;
begin
{
Petla bedzie instalowala po kolei wszystkie pliki z tablicy
}
for I := Low(Files) to High(Files) do
begin
Sleep(400); // czekaj 400 milisekund
Writeln('Wypakowuje ' + Files[i]); // wyswietl informacje o wypakowanym pliku
AssignFile(F, Source + Files[i]);
ReWrite(F, 1); // stworz plik
{ wyszukaj zasobu okrslonego w tablicy }
Res := FindResource(hInstance, PChar(Files[i]), 'PHOTO');
{ zapisz zasob do pliku }
BlockWrite(F, LockResource(LoadResource(hInstance, Res))^,
SizeOfResource(hInstance, ReS));
CloseFile(F); // zamknij plik
end;
Writeln('');
{ po zakonczeniu instalacji wyswietl informacje o zakonczeniu }
Writeln('Instalacja zako±czona. Naci╢nij ENTER, aby zako±czyµ.');
Readln; // czekaj na nacisniecie klawisza
end;
var
Dir: String; // zawiera sciezke gdzie pliki maja byc zainstalowane
begin
Writeln('');
Writeln(' Copyright (c) 2001 by Adam Boduch ');
Writeln(' http://programowanie.of.pl ');
Writeln('');
Writeln('Gdzie mam zainstalowaµ?');
Readln(Dir); // pobierz wpisana nazwe
{ jezeli na koncu nie ma znaku \ to dodaj go }
if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
{ stworz katalog jezeli nie istnieje lub jezeli istnieje to rozpocznij
instalacje od razu }
if CreateDirectory(PChar(Dir), nil) then
Install(Dir) else Install(Dir);
end.
Byµ mo┐e temat aplikacji konsolowej nie jest a┐ taki
trudny do opanowania, ale warto go znaµ.
Przydatne linki:
Kod ╝r≤d│owy programu mo┐esz ╢ci▒gn▒µ st▒d:
ConApp.zip ( 61 kB )
Adam Boduch