Mega Code Archive

 
Categories / Delphi / Examples
 

Web hit counter

Every homepage got to have one! Let's make a hitcounter. This hitcounter produces an image, which is built with seven individual number segments, pasted into a frame image. The maximum count would be 10 million hits, enough for most homepages, mine included ! The number images are 11 x 20 pixels, contained in an ImageList component like this: The frame image is 81 x 24 pixels, and looks like this: We'll use a textfile for storing the hit count. Each time the page is accessed, we increment this value, find the corresponding image from the imagelist for each value position and paste each image into the frame at right positions. When ready, we convert the bitmap image to a jpg, and save it to a TMemorystream, and finally we send the stream as response to the user. The hitcounter is called from the HTML code just like any other image would be: <img src="/cgi-bin/count.cgi?XXX"> XXX is the name of the hitcount file without extension. If you want the project files, press here: An admin exe is included. {----------------------------------------------------------------------------- Unit Name: Unit1 Author: Mats Asplund Purpose: A web hitcounter Usage: 1. Create a textfile and write the startcount on the first row. Name it: XXX.cnt 2. Place frame.bmp in the /cgi-bin library. 3. Place a link: <img src="/cgi-bin/count.cgi?XXX"> on the webpage. -----------------------------------------------------------------------------} unit Unit1; interface uses SysUtils, Classes, HTTPApp, ImgList, Controls, Graphics, JPeg; type TWebModule1 = class(TWebModule) ImageList1: TImageList; procedure WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); end; var WebModule1: TWebModule1; implementation {$R *.DFM} procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); var Jpg: TJpegImage; Number, Frame: TBitMap; CountStr, CounterName: string; HitCount, n: integer; Count: TStringList; ResponseStream: TMemoryStream; begin ResponseStream:= TMemoryStream.Create; Number:= TBitMap.Create; Frame:= TBitMap.Create; Jpg := TJpegImage.Create; Count:= TStringList.Create; try // Get name of the counter from request and load the corresponding file CounterName:= Request.QueryFields[0]; Count.LoadFromFile(CounterName + '.cnt'); // Increment hitcount and save it back to file HitCount:= StrToInt(Count[0]); Inc(HitCount); Count[0]:= IntToStr(HitCount); CountStr:= Count[0]; Count.SaveToFile(CounterName + '.cnt'); // Add leading zeros to count case Length(CountStr) of 1: CountStr:= '000000' + CountStr; 2: CountStr:= '00000' + CountStr; 3: CountStr:= '0000' + CountStr; 4: CountStr:= '000' + CountStr; 5: CountStr:= '00' + CountStr; 6: CountStr:= '0' + CountStr; end; // Get all seven counternumbers from ImageList and paste them into the // the frame bitmap at right positions. Frame.LoadFromFile('frame.bmp'); for n:= 1 to 7 do begin // Number bitmaps are 11 x 20 pix. Frame bitmap is 81 x 24 pix. ImageList1.GetBitmap(StrToInt(CountStr[n]), Number); Frame.Canvas.Draw(2 + (11 * (n - 1)), 2, Number); end; // Convert the resulting bitmap to jpg and save it to the stream Jpg.Assign(Frame); Jpg.SaveToStream(ResponseStream); // Send the stream as response ResponseStream.Position:= 0; Response.ContentType := 'image/jpeg'; Response.ContentStream:= ResponseStream; Response.SendResponse; finally Number.Free; Frame.Free; Count.Free; end; end; end.