VCLButtons(Delphi)
Description
This example demonstrates how to use a TButtonGroup. This example requires the following components:
- A TButtonGroup object with 3 TGrpButtonItems objects
- A TButton object
The form should look like in the following image.
After running the project and pressing the button, the form should look like in the following image.
The user can press different buttons from the button group, setting their caption to X. The computer automatically places a 0 caption on an empty button, chosen randomly.
If a column, line, or diagonal is marked the same, a ShowMessage box appears, announcing the winner.
Code
//Delphi
//procedures and variables declaration
procedure Validate();
procedure StartGame();
procedure FillMatrix(Pos: Integer; I: Integer);
procedure Comp();
var
Form1: TForm1;
Random_var: Byte; //generate a random number from 0 through 9
GameMatrix: array[1..3,1..3] of Integer; //set to be -10 for an empty position, 0 for the 0-player, 1 for the X-player
Score: Integer; //used for verifying whether the game is over (equals 3 if the X-player wins, 0 if the 0-player wins)
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
// initialize the properties of the button group and other visual objects
Form1.Caption := 'Tic Tac Toe';
ButtonGroup1.ButtonHeight := 50;
ButtonGroup1.ButtonWidth := 50;
ButtonGroup1.Height := 170;
ButtonGroup1.Width := 170;
ButtonGroup1.Visible := False;
ButtonGroup1.BorderStyle := bsNone;
ButtonGroup1.Font.Size := ButtonGroup1.ButtonHeight - 10;
Button1.Align := alBottom;
Button1.Caption := 'START GAME';
end;
//procedures implementation
procedure FillMatrix(Pos: Integer;I: Integer);
begin
//set a specific item of the matrix to be the value given through the parameter
case Pos of
0: GameMatrix[1,1] := I;
1: GameMatrix[1,2] := I;
2: GameMatrix[1,3] := I;
3: GameMatrix[2,1] := I;
4: GameMatrix[2,2] := I;
5: GameMatrix[2,3] := I;
6: GameMatrix[3,1] := I;
7: GameMatrix[3,2] := I;
8: GameMatrix[3,3] := I;
end;
end;
procedure StartGame();
var I, J: Integer;
begin
//show the button group and all the buttons' captions to an empty string
Form1.ButtonGroup1.Visible := True;
for I := 0 to 8 do
Form1.ButtonGroup1.Items.Items[I].Caption := '';
//fill the game matrix with negative values, to help calculating the score
for I := 1 to 3 do
for J := 1 to 3 do
GameMatrix[I,J] := -10;
end;
procedure Validate;
var
I, J: Integer;
begin
// verify the lines
for i := 1 to 3 do
begin
Score := 0;
for j := 1 to 3 do Score := Score + GameMatrix[i,j];
if (Score = 3) or (Score = 0) then
Exit;
end;
// verify the main diagonal
Score := 0;
for i := 1 to 3 do Score := Score + GameMatrix[i,i];
if (Score = 3) or (Score = 0) then
Exit;
// verify the secondary diagonal
Score := 0;
for i := 1 to 3 do Score := Score + GameMatrix[i,4-i];
if (Score = 3) or (Score = 0) then
Exit;
// verify the columns
for i := 1 to 3 do
begin
Score := 0;
for j := 1 to 3 do Score := Score + GameMatrix[j,i];
if (Score = 3) or (Score = 0) then
Exit;
end;
end;
procedure Comp();
var I: Integer;
begin
//when the user presses a button and sets its caption to 'X', randomly find an
//unused button and set its caption to '0'
for I := 1 to 9 do
begin
Random_var := Random(9);
if (Form1.ButtonGroup1.Items.Items[Random_var].Caption = '') then
begin
Form1.ButtonGroup1.Items.Items[Random_var].Caption := '0';
FillMatrix(Random_var,0);
Break;
end;
end;
end;
//OnClick event handler for TButton
procedure TForm1.Button1Click(Sender: TObject);
var I, J: Integer;
begin
ButtonGroup1.Align := alTop;
ButtonGroup1.ButtonWidth := ButtonGroup1.Width div 3;
ButtonGroup1.Height := ButtonGroup1.Width;
ButtonGroup1.ButtonHeight := ButtonGroup1.Height div 3;
ButtonGroup1.Enabled := True;
StartGame();
end;
//OnClick event handler for a button group item (TGrpButtonItems)
procedure TForm1.ButtonGroup1Items0Click(Sender: TObject);
begin
//when the user presses a button, set its caption to 'X', complete the GameMatrix,
//verify whether X wins, set another button's caption to '0', verify whether 0 wins
if (ButtonGroup1.Items.Items[0].Caption = '') then
begin
ButtonGroup1.Items.Items[0].Caption := 'X';
GameMatrix[1,1] := 1;
Validate();
if Score = 3 then
begin
ShowMessage('X WINS!');
ButtonGroup1.Enabled := False;
end
else begin
Comp();
Validate();
if Score = 0 then begin
ShowMessage('0 WINS!');
ButtonGroup1.Enabled := False;
end;
end;
end;
end;
//[...]
//rewrite the previous procedure for all the other 8 button group items
end.
Uses
- Vcl.StdCtrls.TButton ( fr | de | ja )
- Vcl.StdCtrls.TButton.OnClick ( fr | de | ja )
- Vcl.StdCtrls.TButton.Caption ( fr | de | ja )
- Vcl.StdCtrls.TButton.Align ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Items ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Align ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Enabled ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Visible ( fr | de | ja )
- Vcl.ButtonGroup.TGrpButtonItems ( fr | de | ja )
- Vcl.ButtonGroup.TGrpButtonItems.Items ( fr | de | ja )
- Vcl.ButtonGroup.TGrpButtonItem ( fr | de | ja )
- Vcl.CategoryButtons.TBaseButtonItem.Caption ( fr | de | ja )
- Vcl.CategoryButtons.TBaseButtonItem.OnClick ( fr | de | ja )