Witam w moim pierwszym tutorialu.
Traktował będzie on o pisaniu skanera portów 
Skaner będzie oparty o standartowe komponenty dostępne w delphi. Do jego napisania nie użyłem socketów,
ale jeśli ktoś koniecznie chce, zmiana kodu jest bardzo łatwa.
Zasada działania jest prosta:
Po aktywacji timera TCPClient łączy się z portem - jeśli połączony dostajemy komunikat,
następnie TCPClient rozłącza się, zwiększa aktualny port o 1 i powtarza całą procedurę.
Więc do rzeczy:
1.Potrzebne:
-Delphi 7
-Wyobraźnia i mózg 
2.Zaczynamy pisać:
Na formę wstawiamy:
3xEdit
2xButton
1xLabel
1xTimer /zakładka SYSTEM/
1xTCPClient /zakładka INTERNET/ /Niedostępny w Delphi 7 personal, dostępne tu: http://p3o.yoyo.pl/dclnet70.bpl /
1xMemo
U mnie wygląda to mniejwięcej tak:

Pod VAR /deklaracja zmiennych/ wklejamy:
Kod:
**portmin:integer;
**portmax:integer;
**IP:string;
**port:integer;
Są to zmienne odpowiedzialne za adres IP, oraz porty /aktualny, początkowy, docelowy/
Klikamy 2x na Button1 i wklejamy kod:
Kod:
** Memo1.Clear;
** IP:=Edit1.Text;
** portmin:=StrToInt(Edit2.Text);
** portmax:=StrToInt(Edit3.Text);
** port:=portmin;
** TcpClient1.RemoteHost:=IP;
** Timer1.Enabled:=true;
** Memo1.Lines.Add('Skanowanie rozpoczęte');
** Button1.Enabled:=false;
** Button2.Enabled:=true;
Kod odpowiada za podanie IP do klienta, aktywowanie timera oraz włączenie/wyłączenie przycisków.
Funkcja StrToInt zamienia typ String na Integer.
Następnie klikamy 2x Button2 i wklepujemy:
Kod:
** Timer1.Enabled:=false;
** Memo1.Lines.add('Skanowanie przerwane');
** Button1.Enabled:=true;
** Button2.Enabled:=false;
Tutaj deaktywujemy Timer oraz dajemy na Memo komunikat.
Po tym, w zdarzeniu OnTimer wklejmy kod:
Kod:
** Label1.Caption:=IntToStr(port);
** TcpClient1.RemotePort:=IntToStr(port);
** if TcpClient1.Connect=True then
**** Memo1.Lines.Add(IntToStr(port)+' : open');
**** inc(port);
** if port > portmax then
**** begin
********Timer1.Enabled:=false;
********Memo1.Lines.Add('Skanowanie zakończone');
********Button1.Enabled:=true;
********Button2.Enabled:=false;
********port:=0;
end;
Jest to najważniejsza część skanera, odpowiada właśnie za sprawdzanie portów.
Timer co określoną ilość czasu /Interval/ wykonuje instrukcje zawarte w zdarzeniu onTimer /proponuję ustawić na 200/.
Pierwsza instrukcja warunkowa IF sprawdza czy jest połączenie z danym portem. Jeśli jest - daje na Memo komunikat oraz zwiękasza port o jeden /inc(port)/.
Druga zaś sprawdza czy nie port docelowy nie został osiągnięty. Jeśli tak, program deaktywuje timer i ustawia port aktualny na 0.
W FormCreate formy dajemy kod czyszczący Memo:
Po skompilowaniu, jak widać skaner działa:

Jeśli ktoś znalazł jakieś błędy, proszę pisać.
Pozdrawiam