Aplikacje konsolowe

Strona g│≤wna

 

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