Programmeren met Delphi 3 |
Een van mijn hobby's is dammen. In het verleden heb ik een
competitie verwerkingsprogramma geschreven in turbo Pascal onder DOS. In dit
programma kon je 30 dammers met hun scores onderbrengen. Op zich een niet
bijzonder moeilijk programma. Dammers zijn van huis uit erg sociaal? waardoor er
allerlei regeltjes in het leven geroepen werden om te kunnen zien of je je
scores verdiend had tegen een goede of een minder sterkere speler. Dit was het
zogenaamde tegenstanders gemiddelde. Je eigen gemiddelde en die van de
tegenstander op dat moment moesten bij elkaar worden opgeteld en gedeeld door
twee zodat er een uiteindelijk gemiddelde ontstond.
Het programma had enkele beperkingen. Zoals je kon maximaal 4x tegen een andere
speler een partijtje dammen. Het aantal actieve dammers daalt de laatste jaren
gestaag. De noodzaak van een tegenstanders gemiddelde leek de huidige leden niet
meer nodig. En er was behoefte aan om meer dan 4x tegen elkaar te dammen in een
seizoen. Mocht je in de omgeving van Hoogezand-Sappemeer wonen en je hebt
belangstelling voor het dammen stuur me een E-mail en je krijgt van mij de
nodige gegevens om eens langs te komen. Even E-mailen naar
aaldring@akses.nl
en je krijgt wat meer info.
Een programma in de Windows stijl zou zeker welkom zijn.
Bovenstaande form is een kopie wanneer het programma
loopt. Je ziet een edit veld met daarnaast een label. Een stringgrid met 7
kolommen. De eerste kolom voor de namen van de spelers en de 6 andere kolommen
voor de uitslagen. Zoals je ziet is het nu mogelijk maximaal 6x tegen elkaar te
dammen per seizoen.
Verder bevat de form 5 bitbuttons een updown met daarnaast een edit veld.
Plaats eerst de stringgrid op de form voordat je de form op formaat brengt. Om
de juiste breedte van de kolommen te krijgen, zorg ervoor dat het aantal vaste
kolommen EERST op 0 staat. Maak eerste alle kolommen 16 breed en 16 hoog. Daarna
manipuleer je de breedte van de eerste kolom om tenslotte het aantal vaste
kolommen weer op 1 te zetten. In mijn geval heb ik aan 15 rijen voldoende.
Hieronder de eigenschappen van de stringgrid (Delphi 5). Mocht je een andere
versie van Delphi hebben dan is dat geen probleem, daar de eigenschappen die je
wilt instellen, ook in de andere versies aanwezig zijn.
Jullie als doorgewinterde Pascal programmeurs zullen geen moeite hebben om een form naar eigen inzicht in te delen. Het programma bevat naast form1 nog 2 forms. Een form waar de ranglijst te zien valt + te printen en een form met een matrix (wie heeft tegen wie gespeeld).
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, StdCtrls, damdeclar, ComCtrls, Buttons;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
UpDown1: TUpDown;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
Label1: TLabel;
Edit2: TEdit;
BitBtn6: TBitBtn;
procedure FormActivate(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
procedure BitBtn4Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;const Value: String);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure vulgrid;
procedure toongrid(nr:integer);
implementation
uses damunit2, damunit3;
{ deze units zijn gekoppeld aan form2 en form3 }
{$R *.DFM}
{ eigen procedure om de grids op form1 en form2 te vullen met de nodige gegevens
}
procedure toongrid;
var tel,tel1,tel2:integer;
begin
with datarec do
begin
form1.edit1.text:=naam[nr];
form1.edit2.text:=int_str(nr);
for tel:=1 to 15 do
begin
form1.stringgrid1.cells[0,tel]:=naam[tel];
form2.stringgrid1.cells[0,tel]:=naam[tel];
form2.stringgrid2.cells[0,tel]:=naam[tel];
for tel2:=1 to 8 do
begin
for tel1:=1 to 6 do
begin
if tel<>nr then
begin
if uitslag[tel,nr,tel1]=9 then
form1.stringgrid1.Cells[tel1,tel]:='' else
form1.stringgrid1.Cells[tel1,tel]:=int_str(uitslag[tel,nr,tel1]);
end else form1.stringgrid1.Cells[tel1,tel]:='X';
if tel<>tel2 then
begin
if uitslag[tel,tel2,tel1]=9 then
form2.stringgrid1.Cells[tel1+(tel2-1)*6,tel]:='' else
form2.stringgrid1.Cells[tel1+(tel2-1)*6,tel]:=int_str(uitslag[tel,tel2,tel1]);
end else form2.stringgrid1.Cells[tel1+(tel2-1)*6,tel]:='X';
end;
end;
for tel2:=9 to 15 do
begin
for tel1:=1 to 6 do
begin
if tel<>tel2 then
begin
if uitslag[tel,tel2,tel1]=9 then
form2.stringgrid2.Cells[tel1+(tel2-9)*6,tel]:='' else
form2.stringgrid2.Cells[tel1+(tel2-9)*6,tel]:=int_str(uitslag[tel,tel2,tel1]);
end else form2.stringgrid2.Cells[tel1+(tel2-9)*6,tel]:='X';
end;
end;
end;
end;
end;
procedure vulgrid; { eigen procedure om vaste gegevens op de grids in te vullen}
var tel:integer;
begin
for tel:=1 to 6 do
begin
if tel<4 then
begin
form1.StringGrid1.Cells[tel,0]:='W';
form2.StringGrid1.Cells[tel,0]:='w';
form2.StringGrid2.Cells[tel,0]:='w';
form2.StringGrid1.Cells[tel+6,0]:='w';
form2.StringGrid2.Cells[tel+6,0]:='w';
form2.StringGrid1.Cells[tel+12,0]:='w';
form2.StringGrid2.Cells[tel+12,0]:='w';
form2.StringGrid1.Cells[tel+18,0]:='w';
form2.StringGrid2.Cells[tel+18,0]:='w';
form2.StringGrid1.Cells[tel+24,0]:='w';
form2.StringGrid2.Cells[tel+24,0]:='w';
form2.StringGrid1.Cells[tel+30,0]:='w';
form2.StringGrid2.Cells[tel+30,0]:='w';
form2.StringGrid1.Cells[tel+36,0]:='w';
form2.StringGrid2.Cells[tel+36,0]:='w';
form2.StringGrid1.Cells[tel+42,0]:='w';
end else
begin
form1.StringGrid1.Cells[tel,0]:='Z';
form2.StringGrid1.Cells[tel,0]:='z';
form2.StringGrid2.Cells[tel,0]:='z';
form2.StringGrid1.Cells[tel+6,0]:='z';
form2.StringGrid2.Cells[tel+6,0]:='z';
form2.StringGrid1.Cells[tel+12,0]:='z';
form2.StringGrid2.Cells[tel+12,0]:='z';
form2.StringGrid1.Cells[tel+18,0]:='z';
form2.StringGrid2.Cells[tel+18,0]:='z';
form2.StringGrid1.Cells[tel+24,0]:='z';
form2.StringGrid2.Cells[tel+24,0]:='z';
form2.StringGrid1.Cells[tel+30,0]:='z';
form2.StringGrid2.Cells[tel+30,0]:='z';
form2.StringGrid1.Cells[tel+36,0]:='z';
form2.StringGrid2.Cells[tel+36,0]:='z';
form2.StringGrid1.Cells[tel+42,0]:='z';
end;
end;
end;
procedure TForm1.FormActivate(Sender: TObject); { uitvoeren wanneer form1 actief
wordt }
begin
vulgrid;
recteller:=1;
openbestand;
leesdata;
toongrid(recteller);
vulgrid;
end;
procedure TForm1.BitBtn6Click(Sender: TObject); { de bitbtn die wissen uitslagen
aangeeft }
begin
wisalles;
toongrid(recteller);
end;
{ wanner de form gesloten wordt }
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
schrijfdata;
sluitbestand;
end;
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
recteller:=str_int(edit2.text);
toongrid(recteller);
end;
procedure TForm1.BitBtn4Click(Sender: TObject); {einde knop}
begin
schrijfdata;
sluitbestand;
halt;
end;
procedure TForm1.Edit1Change(Sender: TObject); {bovenste edit veld }
begin
with datarec do
begin
naam[recteller]:=edit1.text;
StringGrid1.Cells[0,recteller]:=naam[recteller];
end;
end;
{event van het stringgrid}
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,ARow: Integer; const Value: String);
var tel,tel1,res:integer;
begin
with datarec do
begin
for tel:=1 to 15 do
begin
for tel1:=1 to 3 do
begin
if (stringgrid1.cells[tel1,tel]='') or (stringgrid1.cells[tel1,tel]=' ') then
begin
uitslag[tel,recteller,tel1]:=9;
uitslag[recteller,tel,tel1+3]:=9;
end else
begin
res:=str_int(stringgrid1.cells[tel1,tel]);
case res of
0:begin
uitslag[tel,recteller,tel1]:=res;
uitslag[recteller,tel,tel1+3]:=3;
end;
1:begin
uitslag[tel,recteller,tel1]:=res;
uitslag[recteller,tel,tel1+3]:=1;
end;
3:begin
uitslag[tel,recteller,tel1]:=res;
uitslag[recteller,tel,tel1+3]:=0;
end;
end;
end;
end;
for tel1:=4 to 6 do
begin
if (stringgrid1.cells[tel1,tel]='') or (stringgrid1.cells[tel1,tel]=' ') then
begin
uitslag[tel,recteller,tel1]:=9;
uitslag[recteller,tel,tel1-3]:=9;
end else
begin
res:=str_int(stringgrid1.cells[tel1,tel]);
case res of
0:begin
uitslag[tel,recteller,tel1]:=res;
uitslag[recteller,tel,tel1-3]:=3;
end;
1:begin
uitslag[tel,recteller,tel1]:=res;
uitslag[recteller,tel,tel1-3]:=1;
end;
3:begin
uitslag[tel,recteller,tel1]:=res;
uitslag[recteller,tel,tel1-3]:=0;
end;
end;
end;
end;
end;
end;
end;
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
schrijfdata;
form2.show;
end;
{printen uitslagen}
procedure TForm1.BitBtn2Click(Sender: TObject);
var tel:integer;
begin
schrijfdata;
form3.listbox1.Clear;
form3.listbox2.Clear;
form3.listbox3.Clear;
form3.listbox4.Clear;
form3.listbox5.Clear;
form3.listbox6.Clear;
form3.listbox7.Clear;
form3.listbox8.Clear;
form3.listbox9.Clear;
form3.listbox10.Clear;
for tel:=1 to 15 do
begin
form3.listbox1.Items.Add(int_str2(tel));
form3.listbox2.Items.Add(namen[tel]);
form3.listbox3.Items.Add(gespeeld[tel]);
form3.listbox4.Items.Add(wit[tel]);
form3.listbox5.Items.Add(zwart[tel]);
form3.listbox6.Items.Add(gewonnen[tel]);
form3.listbox7.Items.Add(remise[tel]);
form3.listbox8.Items.Add(verloren[tel]);
form3.listbox10.Items.Add(punten[tel]);
form3.listbox9.Items.Add(gemiddeld[tel]);
end;
form3.show;
end;
{bereken knop}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
schrijfdata;
berekenalles;
sorteerspelers(gemiddeld,gespeeld,wit,zwart,gewonnen,
remise,verloren,punten,namen,1,15);
end;
end.