Programmeren met Delphi  3  

Naar start

 

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.