Results 1 to 9 of 9

Thread: Stringgrid getallen optellen

  1. #1
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Question Stringgrid getallen optellen

    Gebruik CodeTyphon met Windows 8.1.
    Na veel opzoekwerk en bijkomende steun kon ik reeds een deel v.h. programma opmaken.

    Misschien kan er iemand mij de code verschaffen voor volgend probleem:
    Als ik op "bewaar" klil dan zou er telkens de som moeten gemaakt worden van de vorige totaallijn(geel).
    In het voorbeeld (Wiezen.jpg),
    zou NA de 1 ste (gele)totaallijn,
    de 2de(gele) totaallijn moeten zijn:
    ipv 0+-5 0+15 0+-5 0+-5
    -6 14 -2 -6
    de 3de(gele) totaallijn moeten zijn:
    -4 16 -4 -8
    de 4de(gele) totaallijn moeten zijn:
    -5 15 -5 -5
    enz.... tot de laatste (gele) totaallijn.

    Zie bijlage!
    Attached Files Attached Files

  2. #2
    Ik heb Wiezen.jpg opgehaald en heb die voor me op het scherm.
    Helaas zie ik geen direct verband tussen (1) de uitleg hoe de totaallijnen moeten zijn en (2) de informatie op de jpg.
    Wil je de vraag nog eens formuleren?

  3. #3
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Question

    Dank voor reactie.
    De JPG is blijkbaar geen goed voorbeeld. Sorry.
    Als men het spel begint dan moet men de punten invullen nadat men op de button "Spel gedaan" heeft gedrukt. De punten worden dan bij de vier spelers ingevuld en vervolgens op de button "Bewaar" drukken om op te slaan in de stringgrid.
    Het resultaat per lijn moet altijd "0" zijn. Het verlies en winst moet gelijk zijn.
    Voorbeeld:
    1ste spel:Spelers 1,2,3 verliezen 1 punt; speler 4 wint dus 3 punten.
    Dan staat er op de eerste lijn: -1 -1 -1 +3
    Op de tweede lijn staat de som: 0+-1 0+-1 0+-1 0+3
    2de spel: Spelers 1 en 2 verliezen 4 punten; spelers 3 en 4 winnen 4 punten.
    Dan staat er op de derde lijn: -4 -4 +4 +4
    Op de vierde lijn staat er dan: -5 -5 +3 +7
    === speler 1: -1 en -4 = -5
    === speler 2: -1 en -4 = -5
    === speler 3: -1 en +4= +3
    === speler 4: +3 en +4=+7
    3de spel: Spelers 2 en 4 verliezen 2 punten; spelers 1 en 3 winnen 2 punten.
    Dan staat er op de vijfdede lijn: +2 -2 +2 -2
    Op de zesde lijn staat er dan: -3 -7 +5 +5
    === speler 1: -5 en +2 = -3
    === speler 2: -5 en -2 = -7
    === speler 3: +3 en +2 = +5
    === speler 4: +7 en -2 =+5
    enz.... enz.... tot laatste spel.

    Hopelijk is het nu iets duidelijker!

  4. #4
    Ik mis de plaats waar jij je vSpelerXTotaal ophoogt.
    Als je dit niet doet blijft die 0 en geef je elke keer alleen maar 0 + X.

    Als je dus onder de 0 + 5 weergave de volgende regels zet lijkt het mij wat beter te gaan.
    (je hebt alleen niet direct het totaal per speler want dat zie je pas weer bij het volgende spel)

    Delphi Code:
    1. // de nieuwe totaal score
    2.     StringGrid1.Cells[1, vRijTotaal]:= IntToStr(vSpeler1Totaal) + ' + ' + EDITSpeler1.Text;
    3.     StringGrid1.Cells[2, vRijTotaal]:= IntToStr(vSpeler2Totaal) + ' + ' + EDITSpeler2.Text;
    4.     StringGrid1.Cells[3, vRijTotaal]:= IntToStr(vSpeler3Totaal) + ' + ' + EDITSpeler3.Text;
    5.     StringGrid1.Cells[4, vRijTotaal]:= IntToStr(vSpeler4Totaal) + ' + ' + EDITSpeler4.Text;
    6.  
    7.     vSpeler1Totaal := vSpeler1Totaal + StrToInt(EDITSpeler1.Text); // <----- deze 4 regels toevoegen
    8.     vSpeler2Totaal := vSpeler2Totaal + StrToInt(EDITSpeler2.Text);
    9.     vSpeler3Totaal := vSpeler3Totaal + StrToInt(EDITSpeler3.Text);
    10.     vSpeler4Totaal := vSpeler4Totaal + StrToInt(EDITSpeler4.Text);

    Je zou de eerstvolgende witte regel als totaal kunnen gebruiken:

    Delphi Code:
    1. // de nieuwe totaal score
    2.     StringGrid1.Cells[1, vRijTotaal]:= IntToStr(vSpeler1Totaal) + ' + ' + EDITSpeler1.Text;
    3.     StringGrid1.Cells[2, vRijTotaal]:= IntToStr(vSpeler2Totaal) + ' + ' + EDITSpeler2.Text;
    4.     StringGrid1.Cells[3, vRijTotaal]:= IntToStr(vSpeler3Totaal) + ' + ' + EDITSpeler3.Text;
    5.     StringGrid1.Cells[4, vRijTotaal]:= IntToStr(vSpeler4Totaal) + ' + ' + EDITSpeler4.Text;
    6.  
    7.     vSpeler1Totaal := vSpeler1Totaal + StrToInt(EDITSpeler1.Text);
    8.     vSpeler2Totaal := vSpeler2Totaal + StrToInt(EDITSpeler2.Text);
    9.     vSpeler3Totaal := vSpeler3Totaal + StrToInt(EDITSpeler3.Text);
    10.     vSpeler4Totaal := vSpeler4Totaal + StrToInt(EDITSpeler4.Text);
    11.  
    12.     StringGrid1.Cells[1, vRijTotaal + 1]:= IntToStr(vSpeler1Totaal); // <-- deze 4 regels geven het TOTAAL van de speler op de laatste witte regel
    13.     StringGrid1.Cells[2, vRijTotaal + 1]:= IntToStr(vSpeler2Totaal); //       <--- wordt weer overschreven bij het volgende spel
    14.     StringGrid1.Cells[3, vRijTotaal + 1]:= IntToStr(vSpeler3Totaal);
    15.     StringGrid1.Cells[4, vRijTotaal + 1]:= IntToStr(vSpeler4Totaal);

    Let op !!! Die witte regel wordt dan bij het volgende spel wel overschreven door de totalen van dat spel.
    Dus misschien is het duidelijker die regel in het rood weer te geven (wat je weer in de Paint van de TStringGrid zou kunnen doen).

    Click image for larger version. 

Name:	2017-03-30 12_36_25-WIEZEN.png 
Views:	110 
Size:	25.4 KB 
ID:	7527

  5. #5
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Question

    rvk, Bedankt dat je wil helpen voor de zoveelste keer.
    Jouw eerste deel code geeft op de eerste lijn een nummer weer van de speler.
    Dit is niet nodig want de naam van de speler staat in de hoofding via hey "ini" bestandje.
    Heb jouw tweede deel code gebruikt, maar het werkt alleen voor + optellingen.
    Als ik een -(min) waarde invoeg dan komt er een getal zoals 65535 ...
    De spelers kunnen dus onder NUL gaan.
    Voorbeeld: Leo: +12 Mariette: +12 Felix: -12 Rita: -12
    Er moet dus telkens een controle gebeuren dat de -(min) en de +(plus) gelijk zijn.
    Een gele lijn met volgende mag niet: +12 +12 -12 -11
    Maar wat ik wilde is dat er telkens in de gele lijn het totaal wordt weergegeven.
    Dus niet in de volgende witte lij.
    Deze totalen moeten niet met de waarde van het vorige spel beginnen, dus niet 0 + 2 .... maar dadelijk +2 of -2
    Er worden telkens max. 20 spelletjes gespeeld.
    Misschien lijkt het nogal complex qua uitleg!

  6. #6
    Quote Originally Posted by seghele View Post
    Jouw eerste deel code geeft op de eerste lijn een nummer weer van de speler.
    Nee hoor, ik had gewoon getest met punten 1, 2, 3, 4. Vandaar dat die onder de kopjes stonden.

    Heb jouw tweede deel code gebruikt, maar het werkt alleen voor + optellingen.
    Als ik een -(min) waarde invoeg dan komt er een getal zoals 65535 ...
    Dat komt omdat jij vSpeler1Totaal, vSpeler2Totaal, vSpeler3Totaal, vSpeler4Totaal als Word gedefinieerd hebt.

    Maak er een integer van en het werkt wel:
    Delphi Code:
    1. vSpeler1Totaal, vSpeler2Totaal, vSpeler3Totaal, vSpeler4Totaal: Integer;

    Click image for larger version. 

Name:	B9AWE1Y.png 
Views:	109 
Size:	24.4 KB 
ID:	7528

    Zet de Position van je form overigens NOOIT op poDesktopCenter want bij mij staat ie nu tussen twee beeldschermen in.
    Je kunt dan Position van je form beter op poMainFormCenter zetten.

    Controle op alle getallen kan natuurlijk door gewoon te kijken of de optelling 0 is
    Delphi Code:
    1. procedure TFmain.btnBEWAARClick(Sender: TObject);
    2. var
    3.    vMessage: String;
    4.    vRijGift, vRijTotaal: Integer;
    5. begin
    6.  
    7.   if StrToInt(EDITSpeler1.Text) + StrToInt(EDITSpeler2.Text) +
    8.     StrToInt(EDITSpeler3.Text) + StrToInt(EDITSpeler4.Text) <> 0 then
    9.   begin
    10.     Showmessage('Je mag niet bewaren. Som van getallen is niet 0.');
    11.     exit;
    12.   end;
    13.  
    14.   //....

    En als je gewoon in de gele lijn de optelling wilt doe je dit:
    Delphi Code:
    1. // de nieuwe totaal score
    2.     vSpeler1Totaal := vSpeler1Totaal + StrToInt(EDITSpeler1.Text);
    3.     vSpeler2Totaal := vSpeler2Totaal + StrToInt(EDITSpeler2.Text);
    4.     vSpeler3Totaal := vSpeler3Totaal + StrToInt(EDITSpeler3.Text);
    5.     vSpeler4Totaal := vSpeler4Totaal + StrToInt(EDITSpeler4.Text);
    6.  
    7.     StringGrid1.Cells[1, vRijTotaal] := IntToStr(vSpeler1Totaal);
    8.     StringGrid1.Cells[2, vRijTotaal] := IntToStr(vSpeler2Totaal);
    9.     StringGrid1.Cells[3, vRijTotaal] := IntToStr(vSpeler3Totaal);
    10.     StringGrid1.Cells[4, vRijTotaal] := IntToStr(vSpeler4Totaal);

    Click image for larger version. 

Name:	z8kAORT.png 
Views:	104 
Size:	23.8 KB 
ID:	7529
    Last edited by rvk; 30-Mar-17 at 18:06.

  7. #7
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Question

    Dat komt omdat jij vSpeler1Totaal, vSpeler2Totaal, vSpeler3Totaal, vSpeler4Totaal als Word gedefinieerd hebt.
    Maak er een integer van en het werkt wel:
    Gedaan.
    Zet de Position van je form overigens NOOIT op poDesktopCenter want bij mij staat ie nu tussen twee beeldschermen in.
    Je kunt dan Position van je form beter op poMainFormCenter zetten.
    Gedaan.
    Code:
    7.  if StrToInt(EDITSpeler1.Text) + StrToInt(EDITSpeler2.Text) +8.    StrToInt(EDITSpeler3.Text) + StrToInt(EDITSpeler4.Text) <> 0 then9.  begin10.    Showmessage('Je mag niet bewaren. Som van getallen is niet 0.');11.    exit;12.  end;
    Weet niet waar deze code moet ingebracht worden.
    Als er inderdaad een foutief getal ingevuld wordt dan zou de boodschap moet komen, maar dan moet er terug een aanpassing kunnen op dezelfde lijn.
    Code:
    procedure TFmain.btnBEWAARClick(Sender: TObject);
    var
       vMessage: String;
       vRijGift, vRijTotaal: Integer;
    begin
      // blokkeer input
      btnSPELGEDAAN.Enabled:= false;
      ChBoxTROEL.Enabled:= false;
      ChBoxRONDEPAS.Enabled:= false;
      btnBEWAAR.Enabled:= false;
      EDITSpeler1.Enabled:= false;
      EDITSpeler2.Enabled:= false;
      EDITSpeler3.Enabled:= false;
      EDITSpeler4.Enabled:= false;
    
      // vraag bewaarbevestiging
      vMessage:= 'Gift ' + IntToStr(vGift) +':';
      if (ChBoxTROEL.Checked) then
      begin
        vMessage:= vMessage + ' Troel';
      end;
      if (ChBoxRONDEPAS.Checked) then
      begin
        vMessage:= vMessage + ' Dubbel';
      end;
      //vMessage := vMessage + ' Bewaar?';
      //ShowMessage(vMessage);
      If QuestionDlg ('KEUZE !',vMessage + #13 + 'Gegevens opslaan?' + #13 + '',
                       mtConfirmation,[mrYes,'OK', mrNo, 'Annuleren'],'') = mrYes then
      begin
        // bewaar => pas de grid aan
        vRijGift:= (vGift * 2) - 1;
        vRijTotaal:= (vGift * 2);
        // de score van deze gift
        StringGrid1.Cells[1, vRijGift]:= EDITSpeler1.Text;
        StringGrid1.Cells[2, vRijGift]:= EDITSpeler2.Text;
        StringGrid1.Cells[3, vRijGift]:= EDITSpeler3.Text;
        StringGrid1.Cells[4, vRijGift]:= EDITSpeler4.Text;
        // de nieuwe totaal score
        StringGrid1.Cells[1, vRijTotaal]:= IntToStr(vSpeler1Totaal) + ' + ' + EDITSpeler1.Text;
        StringGrid1.Cells[2, vRijTotaal]:= IntToStr(vSpeler2Totaal) + ' + ' + EDITSpeler2.Text;
        StringGrid1.Cells[3, vRijTotaal]:= IntToStr(vSpeler3Totaal) + ' + ' + EDITSpeler3.Text;
        StringGrid1.Cells[4, vRijTotaal]:= IntToStr(vSpeler4Totaal) + ' + ' + EDITSpeler4.Text;
        // rvk
        // de nieuwe totaal score
           vSpeler1Totaal := vSpeler1Totaal + StrToInt(EDITSpeler1.Text);
           vSpeler2Totaal := vSpeler2Totaal + StrToInt(EDITSpeler2.Text);
           vSpeler3Totaal := vSpeler3Totaal + StrToInt(EDITSpeler3.Text);
           vSpeler4Totaal := vSpeler4Totaal + StrToInt(EDITSpeler4.Text);
           StringGrid1.Cells[1, vRijTotaal] := IntToStr(vSpeler1Totaal);
           StringGrid1.Cells[2, vRijTotaal] := IntToStr(vSpeler2Totaal);
           StringGrid1.Cells[3, vRijTotaal] := IntToStr(vSpeler3Totaal);
           StringGrid1.Cells[4, vRijTotaal] := IntToStr(vSpeler4Totaal);
        // rvk
        if (vGift < vMaxGift) then
        begin
          // maak nieuwe gift beschikbaar
          vGift:= vGift + 1;
          Label1.Caption:= 'Gift ' + IntToStr(vGift) + ' van ' + IntToStr(vMaxGift) + '.';
          btnSPELGEDAAN.Enabled:= true;
          ChBoxTROEL.Enabled:= true;
          ChBoxTROEL.Checked:= false;
          ChBoxRONDEPAS.Enabled:= true;
          ChBoxRONDEPAS.Checked:= false;
          EDITSpeler1.Text:='';
          EDITSpeler2.Text:='';
          EDITSpeler3.Text:='';
          EDITSpeler4.Text:='';
        end
        else
        begin
          // GEDAAN!
          ShowMessage('Het zit er weer op! "Dingske" heeft gewonnen.');
        end;
      end
      else
      begin
         ChBoxTROEL.Enabled:= true;
         ChBoxRONDEPAS.Enabled:= true;
         btnBEWAAR.Enabled:= true;
         EDITSpeler1.Enabled:= true;
         EDITSpeler2.Enabled:= true;
         EDITSpeler3.Enabled:= true;
         EDITSpeler4.Enabled:= true;
      end;
    end;

  8. #8
    Quote Originally Posted by seghele View Post
    7. if StrToInt(EDITSpeler1.Text) + StrToInt(EDITSpeler2.Text) +8. StrToInt(EDITSpeler3.Text) + StrToInt(EDITSpeler4.Text) <> 0 then9. begin10. Showmessage('Je mag niet bewaren. Som van getallen is niet 0.');11. exit;12. end;
    Weet niet waar deze code moet ingebracht worden.
    Dat begrijp ik niet. Ik liet toch zien dat deze regel helemaal bovenin btnBEWAARClick() gezet kon worden...?

    Dan druk je dus op bewaar, krijg je deze melding en spring je er gelijk weer uit.
    Dan heb je dus nog geen optelling gedaan dus je hoeft ook niets te corrigeren.

    Je kunt het natuurlijk ook nog mooier maken en de bewaar-knop alleen actief maken als de optelling 0 is. Dat zou je dan in alle editchange moeten doen van je 4 editboxen.

    Overigens kun je die regels van jou, die de stringgrid vult met die + '+' + , wel weghalen. Dat gaat nu dubbelop. (die StringGrid1.Cells[1, vRijTotaal] := ... want die zijn hetzelfde als die van mij)
    Last edited by rvk; 30-Mar-17 at 19:43.

  9. #9
    Senior Member
    Join Date
    Sep 2004
    Location
    BELGIE(Vilvoorde)
    Posts
    685

    Thumbs up

    rvk,
    Ben soms iets te snel in lezen en sla dan belangrijke dingen over.
    Het werkt voorlopig prima met jouw steun.
    Tot later......
    Dikke, dikke merci.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •