Page 4 of 5 FirstFirst ... 2 3 4 5 LastLast
Results 46 to 60 of 74

Thread: Integer Overflow bij sommige getallen

  1. #46
    @ Bart
    -- Ik heb de regel [property HokjesValues[ARow, ACol: Integer]:Integer read GetHokjesValue;]
    verplaatst naar Public wat ook geen bezwaar was.
    -- Waar die Verkeerde variabele MW vandaan kwam?.
    -- Het invullen van 0 waardes geeft geen probleem.
    -- Die 2 Comments [//Writeln...] Kan toch wel weg neem ik aan, ik dacht ik probeer het gewoon.
    -- Ik ga ervan uit dat de bug nog steeds op dezelfde plaats zit i.i.g. de regel die het veroorzaakt.
    [ Inc(MC,Value); ] Bij Procedure Kaarttel -- Nu krijg ik de melding Range Check Error.
    -- Ik heb het ook eens op de reserve Delphi op een andere computer geprobeerd maar ook fout.
    -- Fout checks staan aan bij de Compiler opties.
    Last edited by Marieke; 28-Sep-21 at 22:40.

  2. #47
    Quote Originally Posted by Marieke View Post
    -- Ik heb de regel [property HokjesValues[ARow, ACol: Integer]:Integer read GetHokjesValue;]
    verplaatst naar Public wat ook geen bezwaar was.
    -- Waar die Verkeerde variabele MW vandaan kwam?.
    -- Het invullen van 0 waardes geeft geen probleem.
    -- Die 2 Comments [//Writeln...] Kan toch wel weg neem ik aan, ik dacht ik probeer het gewoon.
    Prima.

    Quote Originally Posted by Marieke View Post
    -- Ik ga ervan uit dat de bug nog steeds op dezelfde plaats zit i.i.g. de regel die het veroorzaakt.
    [ Inc(MC,Value); ] Bij Procedure Kaarttel -- Nu krijg ik de melding Range Check Error.
    -- Ik heb het ook eens op de reserve Delphi op een andere computer geprobeerd maar ook fout.
    -- Fout checks staan aan bij de Compiler opties.
    Merkwaardig.
    Zelfs als alle 144 edits de waarde 14913080 zouden hebben, dan nog zou er geen overflow of range check mogen optreden: 144*14913080 is namelijk nog steeds kleiner dan MaxInt.

    In de huidige configuratie, met MaxW=36 kan MC nooit hoger worden dan 144*36=5184.

    Je hebt niet ergens Integer geherdefinieerd als ShortInt of Byte of zo?

    OK, verder debuggen dan maar, aangezien ik het zelf niet kan reproduceren moet jij dat dan doen.
    Voor zover ik kan zien wordt KaartTel alleen aangeroepen in de diverse Uittel varianten en in CopyCodeClick.
    Dus niet als je getallen aan het invullen was (zoals ik eerst begreep?).

    In Kaartje.pas, voeg de volgende regel toe, direct onder "unit kaartje;":
    Delphi Code:
    1. {$ASSERTIONS ON}

    En verander nu KaartTel als volgt (gewoon kopiëren en plakken vanuit hier):
    Delphi Code:
    1. Procedure TMyForm.Kaarttel;
    2. var k, y, Value: integer;
    3.     blVlag: boolean;
    4. begin
    5.   kaartcode:='';
    6.   k:=0; MC:=0;
    7.   blVlag:=false;
    8.  
    9.   for y := 0 to High(Hokjes) do                    // is van Hokjes 1 t/m 144
    10.   begin
    11.     inc(k);                                       // Rijtjes van 12 maken
    12.     //-----
    13.     if Hokjes[y].Text <> '' then                    // Edithokje is standaard tekst
    14.     begin
    15.       Value := GetHokjesValue(y);
    16.       //******************
    17.       Assert(Value <= MaxW,'Error: Value > MaxW');
    18.       //******************
    19.       blVlag:=true;
    20.       if Value > 0 then          // Alle hokjes voor verschillende forums
    21.       begin
    22.         //******************
    23.         Assert(MC <= 143*MaxW,'Error: MC > 143*MaxW');
    24.         //******************
    25.         Inc(MC,Value);
    26.         if MaxW <= 36 then
    27.           kaartcode:=kaartcode+' - '+kaartxt[Value]
    28.         else
    29.           kaartcode:=kaartcode+' - '+(Hokjes[y].Text);
    30.       end;
    31.     end;
    32.     //-----
    33.     if k=12 then
    34.     begin
    35.      if blVlag then     // Knip de verschillende Tekststrings in stukjes van 12
    36.      begin
    37.       kaartcode:=kaartcode+Chr(13)+Chr(10);
    38.       kaartcode:=stringreplace(kaartcode,chr(13)+chr(10)+' -',chr(13)+chr(10),[]);
    39.      end;
    40.      k:=0;
    41.      blVlag:=false
    42.     end;
    43.     //-----
    44.   end;
    45.   Delete(kaartcode,1,2);  // De 1e 2 karakters uit de Tekststring strippen.
    46.   //--------------------
    47.   if MC>MaxW then MC:=MC mod MaxW;
    48.   //OPM BB: Onderstaande regel doet helemaal niets !!!
    49.   if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!
    50.   if (MaxW=36)and (MC>0) and (MC<37) then
    51.     lbMagCard.Caption:=kaartxt[MC]
    52.   else
    53.     lbMagCard.Caption:='Nr. '+inttostr(MC);
    54. end;

    Ben benieuwd of je een van de assertions weet te triggeren (in plaats van de originele exception dus).

    Ik weet verder niet hoe jouw Delphi in elkaar zit, maar kun je op een of andere wijze laten zien welke compiler opties je gebruikt?
    Zet in ieder geval RangeCheck, Overflow Check, alle opties bij "Debugging" (D7 heeft die optie, geen idee bij jouw versie) en zet optimization op uit (D7 heeft maar 1 optimization level, Lazarus 4, jouw Delphi: geen idee. Hoe hoger de optimization level, hoe meer kans op bugs).

    Bart

  3. #48
    Iets anders.
    In OnEditBoxesChange, is het wel nodig om alle 144 hokjes na te lopen (om de kleur te bepalen)?
    In principe is er in dit event maat 1 hokje gewijzigd, namelijk (Sender as TEdit).

    Kan zijn dat ik iets mis hoor.

    Maar goed, eerst die irritante bug oplossen.

    Bart

  4. #49
    Ik heb de assert messages wat aangepast zodat ze ook wat relevante info laten zien, dus hier nogmaals de aangepaste KaartTel procedure:
    Delphi Code:
    1. Procedure TMyForm.Kaarttel;
    2. var k, y, Value: integer;
    3.     blVlag: boolean;
    4. begin
    5.   kaartcode:='';
    6.   k:=0; MC:=0;
    7.   blVlag:=false;
    8.  
    9.   for y := 0 to High(Hokjes) do                    // is van Hokjes 1 t/m 144
    10.   begin
    11.     inc(k);                                       // Rijtjes van 12 maken
    12.     //-----
    13.     if Hokjes[y].Text <> '' then                    // Edithokje is standaard tekst
    14.     begin
    15.       Value := GetHokjesValue(y);
    16.       //******************
    17.       Assert(Value <= MaxW,Format('Error Hokje[%d]: Value (%d) > MaxW (%d)',[y,Value,MaxW]));
    18.       //******************
    19.       blVlag:=true;
    20.       if Value > 0 then          // Alle hokjes voor verschillende forums
    21.       begin
    22.         //******************
    23.         Assert(MC <= 143*MaxW,format('Error: MC (%d) > 143*MaxW (%d), when y=%d',[MC, 143*MaxW,y]));
    24.         //******************
    25.         Inc(MC,Value);
    26.         if MaxW <= 36 then
    27.           kaartcode:=kaartcode+' - '+kaartxt[Value]
    28.         else
    29.           kaartcode:=kaartcode+' - '+(Hokjes[y].Text);
    30.       end;
    31.     end;
    32.     //-----
    33.     if k=12 then
    34.     begin
    35.      if blVlag then     // Knip de verschillende Tekststrings in stukjes van 12
    36.      begin
    37.       kaartcode:=kaartcode+Chr(13)+Chr(10);
    38.       kaartcode:=stringreplace(kaartcode,chr(13)+chr(10)+' -',chr(13)+chr(10),[]);
    39.      end;
    40.      k:=0;
    41.      blVlag:=false
    42.     end;
    43.     //-----
    44.   end;
    45.   Delete(kaartcode,1,2);  // De 1e 2 karakters uit de Tekststring strippen.
    46.   //--------------------
    47.   if MC>MaxW then MC:=MC mod MaxW;
    48.   //OPM BB: Onderstaande regel doet helemaal niets !!!
    49.   if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!
    50.   if (MaxW=36)and (MC>0) and (MC<37) then
    51.     lbMagCard.Caption:=kaartxt[MC]
    52.   else
    53.     lbMagCard.Caption:='Nr. '+inttostr(MC);
    54. end;

    Bart

  5. #50
    Overigens, als je de edit voor MAXDeck leeg maakt krijg je ook een leuke exception:
    TApplication.HandleException: EConvertError
    "" is an invalid integer

    Bart

  6. #51
    Quote Originally Posted by Bart B View Post
    Overigens, als je de edit voor MAXDeck leeg maakt krijg je ook een leuke exception:
    Tijdelijke oplossing hiervoor (visueel niet fraai overigens):
    Delphi Code:
    1. // ------ MAXIMUM Kaarten
    2. procedure TMyForm.MAXDeckChange(Sender: TObject);
    3. var
    4.   OldMaxW: Integer;
    5. begin
    6.   OldMaxW := MaxW;
    7.   if not (TryStrToInt(MaxDeck.Text, MaxW) and (MaxW > 0)) then
    8.   begin
    9.     MaxW := OldMaxW;
    10.     MaxDeck.Text := IntToStr(MaxW);
    11.   end;
    12.   MyForm.lbMagCard.Caption:='??';
    13.   Wissen;
    14. end;

    Ik zou de logica verplaatsen van OnChange naar de OnEditingDone (of OnExit) van MaxDeck.

    NB. Als MaxW 0 is, dan krijg je een delen door 0 error in de Uittel procedures.

    Bart

  7. #52
    @ Bart --- Ik ben eruit! ---
    Ik loop alle interessante aanvullingen van je even door en zal ze blijven gebruiken.
    Bij de Assertions kreeg ik geen resultaten te zien.
    Als ik het project in de Release Mode Run met alle Checks (Overflow / Range / I.O. / Optimalisatie) uit dan heb ik geen probleem met de Range Error.
    Maar zo doen we dat niet dus weer terug naar de Debug Compiler opties met de Checks aangevinkt.

    Ik heb regel 19 toegevoegd en de Fout is verdwenen!
    Nu zitten er alleen nog wat schoonheidsfoutjes in (hoop ik)
    Het is ook nog niet af natuurlijk en zoals als MaxW = 0 dan krijg je een fout en dat soort dingetjes.

    Code:
    01   Procedure TMyForm.Kaarttel;
    02   var k, y, Value: integer;
    03       blVlag: boolean;
    04   begin
    05     kaartcode:='';
    06     k:=0; MC:=0;
    07     blVlag:=false;
    08   
    09     for y := 0 to High(Hokjes) do                    // is van Hokjes 1 t/m 144
    10     begin
    11       inc(k);                                        // Rijtjes van 12 maken
    12       //-----
    13       if Hokjes[y].Text <> '' then                   // Edithokje is standaard tekst
    14       begin
    15         Value := GetHokjesValue(y);
    16         blVlag:=true;
    17         if Value > 0 then
    18         begin
    19         If Value > 0 then
    20           Inc(MC,Value);
    21         if MaxW <= 36 then
    22            kaartcode:=kaartcode+' - '+kaartxt[Value]
    23          else
    24          kaartcode:=kaartcode+' - '+(Hokjes[y].Text);
    25         end;
    26       end;
    27       //-----
    28       if k=12 then
    29       begin
    30        if blVlag then     // Knip de verschillende Tekststrings in stukjes van 12
    31        begin
    32         kaartcode:=kaartcode+Chr(13)+Chr(10);
    33         kaartcode:=stringreplace(kaartcode,chr(13)+chr(10)+' -',chr(13)+chr(10),[]);
    34        end;
    35        k:=0;
    36        blVlag:=false
    37       end;
    38       //-----
    39     end;
    40     Delete(kaartcode,1,2);  // De 1e 2 karakters uit de Tekststring strippen.
    41     //--------------------
    42     if MC>MaxW then MC:=MC mod MaxW;
    43     //OPM BB: Onderstaande regel doet helemaal niets !!!
    44     //if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!
    45     if (MaxW=36)and (MC>0) and (MC<37) then
    46       lbMagCard.Caption:=kaartxt[MC]
    47     else
    48       lbMagCard.Caption:='Nr. '+inttostr(MC);
    49   end;
    Dit is een basisprogramma dat ik voor diverse doelen gebruik
    - het is dus wel fijn als dat geoptimaliseerd is.
    Ik heb ze ook gekoppeld aan een HTML programma > zie voorbeeld:
    https://pannekmj.home.xs4all.nl/html...orm+speel.html
    Last edited by Marieke; 29-Sep-21 at 12:11.

  8. #53
    Quote Originally Posted by Bart B View Post
    Overigens, als je de edit voor MAXDeck leeg maakt krijg je ook een leuke exception:
    TApplication.HandleException: EConvertError
    "" is an invalid integer Bart
    Dat wist ik wel en moest er nog wat aan doen.
    Ik heb er een bevestigingsknop naast gezet.

    -- IK BEN ERUIT Nr.2 ---
    Die regel 19 was natuurlijk onzin en het ging weer fout.... en weer weggehaald.
    Het blijft allemaal onlogisch maar ik heb de uitvoer naar het memo / clipboard veranderd naar:

    Code:
      Clipboard.AsText:= MyForm.lbMagCard.Caption;
    Mij benieuwen of het goed blijft gaan...

  9. #54
    Ik ben nog wat meer aan het spelen geweest.
    Ik heb alle Hokjes edits vervangen door TNumEdit, een TEdit die als property Value (read en write) heeft. Daarnaast heeft die ingebakken dat je alleen 0..9 kunt intypen.
    Delphi Code:
    1. unit NumEdit;
    2.  
    3. {$ifdef fpc}
    4. {$mode Delphi}
    5. {$endif fpc}
    6.  
    7. interface
    8.  
    9. uses
    10.   Classes, StdCtrls, SysUtils;
    11.  
    12. type
    13.  
    14.   { TNumEdit }
    15.  
    16.   TNumEdit = class(TEdit)
    17.   protected
    18.     function GetValue: Integer;
    19.     procedure SetValue(AValue: Integer);
    20.     procedure KeyPress(var Key: Char); override;
    21.   public
    22.     property Value: Integer read GetValue write SetValue;
    23.   end;
    24.  
    25. implementation
    26.  
    27. { TNumEdit }
    28.  
    29. function TNumEdit.GetValue: Integer;
    30. begin
    31.   if not TryStrToInt(Text, Result) then
    32.     Result := 0;
    33. end;
    34.  
    35. procedure TNumEdit.SetValue(AValue: Integer);
    36. begin
    37.   Text := IntToStr(AValue);
    38. end;
    39.  
    40. procedure TNumEdit.KeyPress(var Key: Char);
    41. begin
    42.   inherited KeyPress(Key);
    43.   if not (Key in ['0'..'9',#3, #8, #10, #13]) then
    44.     Key := #0;
    45. end;
    46.  
    47. end.

    Dit maakt een heleboel IntToStr() en SrtToInt() in Kaartjes.pas overbodig.
    Ook is de hulp property HokjesValues (en de getter en setter) niet meer nodig.
    Dat ruimt lekker op.

    Voorts kwam ik in de code voort uittellen heel veel herhalingen tegen van code als dit:
    Delphi Code:
    1. if inx=0 then
    2.     Hokjes[27].Text:=inttostr(MaxW)
    3.   else
    4.     Hokjes[27].Text:=inttostr(inx);

    Als je heel vaak zoiets schrijft, is het altijd verstandig of je dit niet wat eenvoudiger (voor jezelf dan) kunt maken.
    Gebruik makend van de mogelijkheid om nu Value van eenhokje rechtstreeks te zetten heb ik eerst een helper functie gemaakt:
    Delphi Code:
    1. function TMyForm.NotZero(AValue: Integer; ValueIfZero: Integer): Integer;
    2. begin
    3.   if (AValue = 0) then
    4.     Result := ValueIfZero
    5.   else
    6.     Result := AValue;
    7. end;

    En nu kan ik bovenstaande code vereenvoudigen tot
    Delphi Code:
    1. Hokjes[27].Value := NotZero(inx, MaxW);

    Dat scheelt niet alleen veel typwerk, maar het maakt de code korter (minder regels) en daardoor makkelijker te overzien.

    Mijn Kaartjes.pas ziet er nu zo uit:
    Delphi Code:
    1. unit Kaartje;
    2.  
    3. {$IFDEF FPC}
    4.   {$MODE Delphi}
    5. {$ENDIF}
    6.  
    7. {$ASSERTIONS ON}
    8.  
    9. interface
    10.  
    11. uses
    12. {$IFnDEF FPC}
    13.   Jpeg, XPMan,
    14. {$ELSE}
    15. {$ENDIF}
    16.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    17.   Dialogs, StdCtrls, ClipBrd, DateUtils, Buttons,StrUtils,
    18.   ShellAPI, ExtCtrls, Menus,
    19.   NumEdit;
    20.  
    21.  
    22. const
    23.   ColCount = 12;
    24.   RowCount = 12;
    25.   NrEdits = RowCount * ColCount;
    26.  
    27. type
    28.   THokjes = array[0..NrEdits-1] of TNumEdit;
    29.   THokjesValues = array[0..NrEdits-1] of Integer;
    30.   TRowLabels = array[0..RowCount] of TLabel;
    31.   TColLabels = array[0..ColCount] of TLabel;
    32.  
    33.   { TMyForm }
    34.  
    35.   TMyForm = class(TForm)
    36.   private
    37.     { Private declarations }
    38.     FSuppressEditBoxesOnChange: Boolean;
    39.     FHokjes: THokjes;
    40.     MC, MaxW: Integer;
    41.     KaartCode:string;
    42.     RowLabels: TRowLabels;
    43.     ColLabels: TColLabels;
    44.  
    45.     procedure OnEditBoxesChange(Sender: TObject);
    46.     procedure OnEditBoxesKeydown (Sender: TObject; var Key: Word; Shift: TShiftState);
    47.     procedure CreateEditBoxes;
    48.  
    49.     function GetHokjes(AIndex: Integer): TNumEdit;  overload;
    50.     function GetHokjes(ARow, ACol: Integer): TNumEdit; overload;
    51.  
    52.     procedure RowColToIndex(const ARow, ACol: Integer; out AIndex: Integer);
    53.     procedure IndexToRowCol(const AIndex: Integer; out ARow, ACol: Integer);
    54.     procedure Kaarttel;
    55.     procedure Klembord;
    56.     procedure RijenTel;
    57.     procedure RijenLeeg;
    58.     procedure KolommenTel;
    59.     procedure KolommenLeeg;
    60.     procedure Wissen;
    61.     procedure CreateRowColLabels;
    62.  
    63.     function NotZero(AValue: Integer; ValueIfZero: Integer): Integer;
    64.  
    65.     procedure DoDebugTesting;
    66.  
    67.   published
    68.     CopyCode: TButton;
    69.     Shape1: TShape;
    70.     btWissen: TButton;
    71.     MAXDeck: TEdit;
    72.     lblCol1: TLabel;
    73.     lblCol2: TLabel;
    74.     lblCol3: TLabel;
    75.     lblCol4: TLabel;
    76.     lblCol5: TLabel;
    77.     lblCol6: TLabel;
    78.     lblCol7: TLabel;
    79.     lblCol8: TLabel;
    80.     lblCol9: TLabel;
    81.     lblCol10: TLabel;
    82.     lblCol11: TLabel;
    83.     lblCol12: TLabel;
    84.     lblRow1: TLabel;
    85.     lblRow2: TLabel;
    86.     lblRow3: TLabel;
    87.     lblRow4: TLabel;
    88.     lblRow5: TLabel;
    89.     lblRow6: TLabel;
    90.     lblRow7: TLabel;
    91.     lblRow8: TLabel;
    92.     lblRow9: TLabel;
    93.     lblRow10: TLabel;
    94.     lblRow11: TLabel;
    95.     lblRow12: TLabel;
    96.     TelRijenCB: TCheckBox;
    97.     TelKolommenCB: TCheckBox;
    98.     TelAllesCB: TCheckBox;
    99.     Uittellen: TButton;
    100.     PopupMenu1: TPopupMenu;
    101.     N29kaarten1: TMenuItem;
    102.     N310kaarten1: TMenuItem;
    103.     N3201: TMenuItem;
    104.     btHelp: TButton;
    105.     lbMagCard: TLabel;
    106.     N515kaarten1: TMenuItem;
    107.     Label1: TLabel;
    108.     lbHorizon: TLabel;
    109.     lbVertial: TLabel;
    110.     URLlabel: TLabel;
    111.     Label2: TLabel;
    112.     meKlembord: TMemo;
    113.     procedure CopyCodeClick(Sender: TObject);
    114.     procedure FormCreate(Sender: TObject);
    115.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    116.     procedure btWissenClick(Sender: TObject);
    117.     procedure FormShow(Sender: TObject);
    118.     procedure TelRijenCBClick(Sender: TObject);
    119.     procedure TelKolommenCBClick(Sender: TObject);
    120.     procedure TelAllesCBClick(Sender: TObject);
    121.     procedure UittellenClick(Sender: TObject);
    122.     procedure N29kaarten1Click(Sender: TObject);
    123.     procedure N310kaarten1Click(Sender: TObject);
    124.     procedure N3201Click(Sender: TObject);
    125.     procedure btHelpClick(Sender: TObject);
    126.     procedure MAXDeckChange(Sender: TObject);
    127.     procedure N515kaarten1Click(Sender: TObject);
    128.     procedure URLlabelClick(Sender: TObject);
    129.  
    130.   public
    131.     { Public declarations }
    132.     property Hokjes[AIndex: Integer]: TNumEdit read GetHokjes;
    133.     property HokjesMatrix[ARow, ACol: Integer]: TNumEdit read GetHokjes;
    134.  
    135. end;
    136.  
    137.  
    138. var
    139.   MyForm: TMyForm;
    140.  
    141. implementation
    142.  
    143. uses
    144.   Data;
    145.  
    146. {$IFnDEF FPC}
    147.   {$R *.dfm}
    148. {$ELSE}
    149.   {$R *.lfm}
    150. {$ENDIF}
    151.  
    152. Procedure TMyForm.Kaarttel;
    153. var k, y, Value: integer;
    154.     blVlag: boolean;
    155. begin
    156.   kaartcode:='';
    157.   k:=0;
    158.   MC:=0;
    159.   blVlag:=false;
    160.  
    161.   for y := 0 to NrEdits-1 do                    // is van Hokjes 1 t/m 144
    162.   begin
    163.     inc(k);                                       // Rijtjes van 12 maken
    164.     //-----
    165.     if Hokjes[y].Text <> '' then                    // Edithokje is standaard tekst
    166.     begin
    167.       Value := Hokjes[y].Value; //GetHokjesValue(y);
    168.       //******************
    169.       Assert(Value <= MaxW,Format('Error Hokje[%d]: Value (%d) > MaxW (%d)',[y,Value,MaxW]));
    170.       //******************
    171.       blVlag:=true;
    172.       if Value > 0 then          // Alle hokjes voor verschillende forums
    173.       begin
    174.         //******************
    175.         Assert(MC <= 143*MaxW,format('Error: MC (%d) > 143*MaxW (%d), when y=%d',[MC, 143*MaxW,y]));
    176.         //******************
    177.         Inc(MC,Value);
    178.         if MaxW <= 36 then
    179.           kaartcode:=kaartcode+' - '+kaartxt[Value]
    180.         else
    181.           kaartcode:=kaartcode+' - '+(Hokjes[y].Text);
    182.       end;
    183.     end;
    184.     //-----
    185.     if k=12 then
    186.     begin
    187.      if blVlag then     // Knip de verschillende Tekststrings in stukjes van 12
    188.      begin
    189.       kaartcode:=kaartcode+Chr(13)+Chr(10);
    190.       kaartcode:=stringreplace(kaartcode,chr(13)+chr(10)+' -',chr(13)+chr(10),[]);
    191.      end;
    192.      k:=0;
    193.      blVlag:=false
    194.     end;
    195.     //-----
    196.   end;
    197.   Delete(kaartcode,1,2);  // De 1e 2 karakters uit de Tekststring strippen.
    198.   //--------------------
    199.   if MC>MaxW then MC:=MC mod MaxW;
    200.   //OPM BB: Onderstaande regel doet helemaal niets !!!
    201.   if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!
    202.   if (MaxW=36)and (MC>0) and (MC<37) then
    203.     lbMagCard.Caption:=kaartxt[MC]
    204.   else
    205.     lbMagCard.Caption:='Nr. '+inttostr(MC);
    206. end;
    207.  
    208. procedure TMyForm.Rijentel;
    209. var
    210.   ACol, ARow, Sum: Integer;
    211. Begin
    212.   for ARow := 0 to RowCount - 1 do
    213.   begin
    214.     Sum := 0;
    215.     for ACol := 0 to ColCount - 1 do
    216.       Sum := Sum + HokjesMatrix[ARow, ACol].Value;
    217.     //als Sum Mod MaxW = 0 dan wordt Sum MaxW als tenminste 1 van de hokjeswaardes > 0 is
    218.     //dat is alleen het geval als Sum > 0 is
    219.     //en Mod MaxW is alleen nodig als Sum > MaxW is derhalve
    220.     if (Sum > MaxW) then
    221.     begin
    222.       Sum := Sum mod MaxW ;
    223.       if (Sum = 0) then
    224.         Sum := MaxW
    225.     end;
    226.     RowLabels[ARow].Caption:=IntToStr(Sum);
    227.     //writeln('RijenTel: RowLabels[',ARow:2,'].Caption = ',Sum:2);
    228.   end;
    229. End;
    230.  
    231. procedure TMyForm.RijenLeeg;
    232. Begin
    233.   lblRow1.Caption:='---';lblRow2.Caption:='---';lblRow3.Caption:='---';lblRow4.Caption:='---';
    234.   lblRow5.Caption:='---';lblRow6.Caption:='---';lblRow7.Caption:='---';lblRow8.Caption:='---';
    235.   lblRow9.Caption:='---';lblRow10.Caption:='---';lblRow11.Caption:='---';lblRow12.Caption:='---';
    236. End;
    237.  
    238. procedure TMyForm.KolommenTel;
    239. var
    240.   ARow, Sum, ACol: Integer;
    241. Begin
    242.   for ACol := 0 to ColCount - 1 do
    243.   begin
    244.     Sum := 0;
    245.     for ARow := 0 to RowCount - 1 do
    246.       Sum := Sum + HokjesMatrix[ARow, ACol].Value;
    247.     //als Sum Mod MaxW = 0 dan wordt Sum MaxW als tenminste 1 van de hokjeswaardes > 0 is
    248.     //dat is alleen het geval als Sum > 0 is
    249.     //en Mod MaxW is alleen nodig als Sum > MaxW is derhalve
    250.     if (Sum > MaxW) then
    251.     begin
    252.       Sum := Sum mod MaxW ;
    253.       if (Sum = 0) then
    254.         Sum := MaxW
    255.     end;
    256.     ColLabels[ACol].Caption:=inttostr(Sum);
    257.   end;
    258. end;
    259.  
    260. procedure TMyForm.Kolommenleeg;
    261. Begin
    262.   lblCol1.Caption:='---';lblCol2.Caption:='---';lblCol3.Caption:='---';lblCol4.Caption:='---';
    263.   lblCol5.Caption:='---';lblCol6.Caption:='---';lblCol7.Caption:='---';lblCol8.Caption:='---';
    264.   lblCol9.Caption:='---';lblCol10.Caption:='---';lblCol11.Caption:='---';lblCol12.Caption:='---';
    265. End;
    266.  
    267.  
    268. procedure TMyForm.Wissen;
    269. var
    270.   i : integer;
    271. begin
    272.   FSuppressEditBoxesOnChange := True;
    273.   try
    274.     for i := 0 to NrEdits-1 do
    275.     begin
    276.       Hokjes[i].Clear;
    277.       Hokjes[i].Color:=clWindow;
    278.     end;
    279.     TelRijenCB.Checked:= false;
    280.     TelKolommenCB.Checked:= false;
    281.     TelAllesCB.Checked:= false;
    282.     Rijenleeg;
    283.     Kolommenleeg;
    284.     lbMagCard.Caption:='??';
    285.     meKlembord.Clear;
    286.   finally
    287.     FSuppressEditBoxesOnChange := False;
    288.   end;
    289. End;
    290.  
    291. procedure TMyForm.CreateRowColLabels;
    292. begin
    293.   RowLabels[0] := lblRow1;
    294.   RowLabels[1] := lblRow2;
    295.   RowLabels[2] := lblRow3;
    296.   RowLabels[3] := lblRow4;
    297.   RowLabels[4] := lblRow5;
    298.   RowLabels[5] := lblRow6;
    299.   RowLabels[6] := lblRow7;
    300.   RowLabels[7] := lblRow8;
    301.   RowLabels[8] := lblRow9;
    302.   RowLabels[9] := lblRow10;
    303.   RowLabels[10] := lblRow11;
    304.   RowLabels[11] := lblRow12;
    305.   ColLabels[0] := lblCol1;
    306.   ColLabels[1] := lblCol2;
    307.   ColLabels[2] := lblCol3;
    308.   ColLabels[3] := lblCol4;
    309.   ColLabels[4] := lblCol5;
    310.   ColLabels[5] := lblCol6;
    311.   ColLabels[6] := lblCol7;
    312.   ColLabels[7] := lblCol8;
    313.   ColLabels[8] := lblCol9;
    314.   ColLabels[9] := lblCol10;
    315.   ColLabels[10] := lblCol11;
    316.   ColLabels[11] := lblCol12;
    317. end;
    318.  
    319. function TMyForm.NotZero(AValue: Integer; ValueIfZero: Integer): Integer;
    320. begin
    321.   if (AValue = 0) then
    322.     Result := ValueIfZero
    323.   else
    324.     Result := AValue;
    325. end;
    326.  
    327.  
    328. procedure TMyForm.Klembord;
    329. var
    330.   myDate: TDateTime;
    331.   myJaar, myMaand, myDag : Word;
    332.   myUur, myMin, mySec, myMilli : Word;
    333.   DagTijd: String;
    334. begin
    335.   myDate:=Now;
    336.   DecodeDateTime(myDate, myJaar, myMaand, myDag,
    337.                  myUur, myMin, mySec, myMilli);
    338.   DagTijd:='Mijn Legging van '+IntToStr(myDag)+ '-' + IntToStr(myMaand)+ '-' +IntToStr(myJaar)+ ' / '
    339.               +IntToStr(myUur)+ ':' + IntToStr(myMin)+ ':' + IntToStr(mySec)+chr(10);
    340.  
    341.   Clipboard.AsText:= DagTijd+chr(13)+chr(10)
    342.                     +kaartcode+chr(13)+chr(10)
    343.                     +' MagicCard= '+kaartxt[MC];
    344.  
    345.  meKlembord.Clear;
    346.  meKlembord.Lines.Add(Clipboard.AsText);
    347. end;
    348.  
    349. procedure TMyForm.UittellenClick(Sender: TObject);
    350. var
    351.  p : TPoint ;   // Popup op de juiste plek laten verschijnen -- eig. menu.OwnerDrawn = True !!
    352. begin
    353.  P := Uittellen.ClientToScreen(Point(0, Uittellen.Height)); // Point 0 is x,y van Knop
    354.  Popupmenu1.Popup(P.X, P.Y);
    355. end;
    356.  
    357. // ------ Uittellen 2 >  9 krt
    358. procedure TMyForm.N29kaarten1Click(Sender: TObject);
    359. var
    360.   inkrt1, inkrt2, inx: integer;
    361. begin
    362.   if MessageBox(0,'Hokje 1 + 2 wordt uitgeteld tot 3x3=9 kaarten.'+#13+#13
    363.               +'k1 + k2 = kaart 3'+#13
    364.               +'k4=k3 -- k5=k2+k3 -- k6=k3+k4'+#13
    365.               +'k7=k6 -- k8=k5+k6 -- k9=k7+k8'+#13+#13
    366.               +'Alle andere hokjes worden GEWIST!'+#13
    367.               ,'Uittellen?', MB_YesNo)=mrYes then
    368.    begin
    369.     inkrt1:=Hokjes[0].Value;   // eerste 2 kaarten bewaar in geheugen
    370.     inkrt2:=Hokjes[1].Value;
    371.     Wissen;                                                      // alle hokjes wissen
    372.     Hokjes[0].Value:=inkrt1;//Text:=inttostr(inkrt1);                             // eerste 2 kaarten weer terugplaatsen
    373.     Hokjes[1].Value:=inkrt2;//inttostr(inkrt2);
    374.     // Rij 1
    375.     inx:=(inkrt1+inkrt2) mod MaxW;
    376.     if inx=0 then Hokjes[2].Value := NotZero(inx, MaxW);
    377.  
    378.     // Rij 2
    379.     Hokjes[12].Text:=Hokjes[2].Text;
    380.     inx:=(Hokjes[1].Value+Hokjes[2].Value) mod MaxW;
    381.     Hokjes[13].Value := NotZero(inx, MaxW);
    382.  
    383.  
    384.     inx:=(Hokjes[12].Value+Hokjes[13].Value) mod MaxW;
    385.     Hokjes[14].Value := NotZero(inx, MaxW);
    386.  
    387.     // Rij 3
    388.     Hokjes[24].Text:=Hokjes[14].Text;
    389.     inx:=(Hokjes[13].Value+Hokjes[14].Value) mod MaxW;
    390.     Hokjes[25].Value := NotZero(inx, MaxW);
    391.  
    392.     inx:=(Hokjes[25].Value+Hokjes[25].Value) mod MaxW;
    393.     Hokjes[26].Value := NotZero(inx, MaxW);
    394.  
    395.    end;
    396.    Kaarttel;  // Voor MagicCard�
    397. end;
    398.  
    399. // ------ Uittellen 3 > 10 krt
    400. procedure TMyForm.N310kaarten1Click(Sender: TObject);
    401. var
    402.   inkrt1, inkrt2, inkrt3, inx: integer;
    403. begin
    404.  if MessageBox(0,'Hokjes 1 + 2 + 3 worden uitgeteld tot 10 kaarten.'+#13+#13
    405.              +'k1 + k2 + k3 = kaart 4'+#13
    406.              +'k5=k1+k2 -- k6=k2+k3 -- k7=k3+k4'+#13
    407.              +'k8=k5+k6 -- k9=k7+k8'+#13
    408.              +'k10=k8+k9'+#13+#13
    409.              +'Alle andere hokjes worden GEWIST!'+#13
    410.              ,'Uittellen?', MB_YesNo)=mrYes then
    411.   begin
    412.     inkrt1:=Hokjes[0].Value;
    413.     inkrt2:=Hokjes[1].Value;
    414.     inkrt3:=Hokjes[2].Value;
    415.     Wissen;
    416.     Hokjes[0].Value:=inkrt1;//Text:=inttostr(inkrt1);
    417.     Hokjes[1].Value:=inkrt2;//Text:=inttostr(inkrt2);
    418.     Hokjes[2].Value:=inkrt3;//Text:=inttostr(inkrt3);
    419.     // Rij 1
    420.     inx:=(inkrt1+inkrt2+inkrt3) mod MaxW;
    421.     Hokjes[3].Value := NotZero(inx, MaxW);
    422.  
    423.     // Rij 2
    424.     inx:=(Hokjes[0].Value+Hokjes[1].Value) mod MaxW;
    425.     Hokjes[12].Value := NotZero(inx, MaxW);
    426.  
    427.     inx:=(Hokjes[1].Value+Hokjes[2].Value) mod MaxW;
    428.     Hokjes[13].Value := NotZero(inx, MaxW);
    429.  
    430.     inx:=(Hokjes[2].Value+Hokjes[3].Value) mod MaxW;
    431.     Hokjes[14].Value := NotZero(inx, MaxW);
    432.  
    433.     // Rij 3
    434.     inx:=(Hokjes[12].Value+Hokjes[13].Value) mod MaxW;
    435.     Hokjes[24].Value := NotZero(inx, MaxW);
    436.  
    437.     inx:=(Hokjes[13].Value+Hokjes[14].Value) mod MaxW;
    438.     Hokjes[25].Value := NotZero(inx, MaxW);
    439.  
    440.     // Rij 4
    441.     inx:=(Hokjes[24].Value+Hokjes[25].Value) mod MaxW;
    442.     Hokjes[36].Value := NotZero(inx, MaxW);
    443.   end;
    444.   Kaarttel;  // Voor MagicCard�
    445. end;
    446.  
    447.  
    448. // ------ Uittellen 3 > 16 krt
    449. procedure TMyForm.N3201Click(Sender: TObject);
    450. var
    451.   inkrt1, inkrt2, inkrt3, inx: integer;
    452. begin
    453.   if MessageBox(0,'Hokjes 1 + 2 + 3 worden uitgeteld tot 16 kaarten.'+#13+#13
    454.               +'k1 + k2 + k3 = kaart 4'+#13
    455.               +'k5=k1+k2 -- k6=k2+k3 -- k7=k3+k4 -- k8=k5+k6+k7'+#13
    456.               +'k9=k5+k6 -- k10=k7+k8 -- k11=k7+k8 -- k12=k9+10+11'+#13
    457.               +'k13=k9+k10 -- k14=10+11 -- 15=11+12 -- 16=13+14+15'+#13+#13
    458.               +'Alle andere hokjes worden GEWIST!'+#13
    459.               ,'Uittellen?', MB_YesNo)=mrYes then
    460.    begin
    461.     inkrt1:=Hokjes[0].Value;
    462.     inkrt2:=Hokjes[1].Value;
    463.     inkrt3:=Hokjes[2].Value;
    464.     Wissen;
    465.     Hokjes[0].Value:=inkrt1;//Text:=inttostr(inkrt1);
    466.     Hokjes[1].Value:=inkrt2;//Text:=inttostr(inkrt2);
    467.     Hokjes[2].Value:=inkrt3;//Text:=inttostr(inkrt3);
    468.     // Rij 1
    469.     inx:=(inkrt1+inkrt2+inkrt3) mod MaxW;
    470.     Hokjes[3].Value := NotZero(inx, MaxW);
    471.  
    472.     // Rij 2
    473.     inx:=(Hokjes[0].Value+Hokjes[1].Value) mod MaxW;
    474.     Hokjes[12].Value := NotZero(inx, MaxW);
    475.  
    476.     inx:=(Hokjes[1].Value+Hokjes[2].Value) mod MaxW;
    477.     Hokjes[13].Value := NotZero(inx, MaxW);
    478.  
    479.     inx:=(Hokjes[2].Value+Hokjes[3].Value) mod MaxW;
    480.     Hokjes[14].Value := NotZero(inx, MaxW);
    481.  
    482.     inx:=(Hokjes[12].Value+Hokjes[13].Value+Hokjes[14].Value) mod MaxW;
    483.     Hokjes[15].Value := NotZero(inx, MaxW);
    484.  
    485.     // Rij 3
    486.     inx:=(Hokjes[12].Value+Hokjes[13].Value) mod MaxW;
    487.     Hokjes[24].Value := NotZero(inx, MaxW);
    488.  
    489.     inx:=(Hokjes[13].Value+Hokjes[14].Value) mod MaxW;
    490.     Hokjes[25].Value := NotZero(inx, MaxW);
    491.  
    492.     inx:=(Hokjes[14].Value+Hokjes[15].Value) mod MaxW;
    493.     Hokjes[26].Value := NotZero(inx, MaxW);
    494.  
    495.     inx:=(Hokjes[24].Value+Hokjes[25].Value+Hokjes[26].Value) mod MaxW;
    496.     Hokjes[27].Value := NotZero(inx, MaxW);
    497.  
    498.     // Rij 4
    499.     inx:=(Hokjes[24].Value+Hokjes[25].Value) mod MaxW;
    500.     Hokjes[36].Value := NotZero(inx, MaxW);
    501.  
    502.     inx:=(Hokjes[25].Value+Hokjes[26].Value) mod MaxW;
    503.     Hokjes[37].Value := NotZero(inx, MaxW);
    504.  
    505.     inx:=(Hokjes[26].Value+Hokjes[27].Value) mod MaxW;
    506.     Hokjes[38].Value := NotZero(inx, MaxW);
    507.  
    508.     inx:=(Hokjes[36].Value+Hokjes[37].Value+Hokjes[38].Value) mod MaxW;
    509.     Hokjes[39].Value := NotZero(inx, MaxW);
    510.    end;
    511.    Kaarttel;  // Voor MagicCard�
    512. end;
    513.  
    514. // ------ Uittellen 5 > 15 krt
    515. procedure TMyForm.N515kaarten1Click(Sender: TObject);
    516. var
    517.   inkrt1, inkrt2, inkrt3, inkrt4, inkrt5, inx: integer;
    518. begin
    519.   if MessageBox(0,'Hokjes 1 + 2 + 3 + 4 + 5 worden uitgeteld tot 15 kaarten.'+#13+#13
    520.             +'k06=k1+k2 -- k07=k2+k3 -- k08=k3+k4 -- k09=k4+k5'+#13
    521.             +'k10=k6+k7 -- k11=k7+k8 -- k12=k8+k9'+#13
    522.             +'k13=k10+k11 -- k14=k11+k12'+#13
    523.             +'k15=k13+k14'+#13+#13
    524.             +'Alle andere hokjes worden GEWIST!'+#13
    525.             ,'Uittellen?', MB_YesNo)=6 then
    526.   begin
    527.     inkrt1:=Hokjes[0].Value;
    528.     inkrt2:=Hokjes[1].Value;
    529.     inkrt3:=Hokjes[2].Value;
    530.     inkrt4:=Hokjes[3].Value;
    531.     inkrt5:=Hokjes[4].Value;
    532.     Wissen;
    533.     Hokjes[0].Value:=inkrt1;//Text:=inttostr(inkrt1);
    534.     Hokjes[1].Value:=inkrt2;//Text:=inttostr(inkrt2);
    535.     Hokjes[2].Value:=inkrt3;//Text:=inttostr(inkrt3);
    536.     Hokjes[3].Value:=inkrt4;//Text:=inttostr(inkrt4);
    537.     Hokjes[4].Value:=inkrt5;//Text:=inttostr(inkrt5);
    538.     //// Rij 1   // Valt weg?
    539.     //      inx:=(inkrt1+inkrt2+inkrt3+inkrt4+inkrt5) mod MaxW;
    540.     //          if inx=0 then Hokjes[3].Text:=inttostr(MaxW)  else Hokjes[3].Text:=inttostr(inx);
    541.     // Rij 2
    542.  
    543.     inx:=(Hokjes[0].Value+Hokjes[1].Value) mod MaxW;
    544.     Hokjes[12].Value := NotZero(inx, MaxW);
    545.  
    546.     inx:=(Hokjes[1].Value+Hokjes[2].Value) mod MaxW;
    547.     Hokjes[13].Value := NotZero(inx, MaxW);
    548.  
    549.     inx:=(Hokjes[2].Value+Hokjes[3].Value) mod MaxW;
    550.     Hokjes[14].Value := NotZero(inx, MaxW);
    551.  
    552.     inx:=(Hokjes[3].Value+Hokjes[4].Value) mod MaxW;
    553.     Hokjes[15].Value := NotZero(inx, MaxW);
    554.  
    555.     // Rij 3
    556.     inx:=(Hokjes[12].Value+Hokjes[13].Value) mod MaxW;
    557.     Hokjes[24].Value := NotZero(inx, MaxW);
    558.  
    559.     inx:=(Hokjes[13].Value+Hokjes[14].Value) mod MaxW;
    560.     Hokjes[25].Value := NotZero(inx, MaxW);
    561.  
    562.     inx:=(Hokjes[14].Value+Hokjes[15].Value) mod MaxW;
    563.     Hokjes[26].Value := NotZero(inx, MaxW);
    564.  
    565.     // Rij 4
    566.     inx:=(Hokjes[24].Value+Hokjes[25].Value) mod MaxW;
    567.     Hokjes[36].Value := NotZero(inx, MaxW);
    568.  
    569.     inx:=(Hokjes[25].Value+Hokjes[26].Value) mod MaxW;
    570.     Hokjes[37].Value := NotZero(inx, MaxW);
    571.  
    572.     // Rij 5
    573.     inx:=(Hokjes[36].Value+Hokjes[37].Value) mod MaxW;
    574.     Hokjes[48].Value := NotZero(inx, MaxW);
    575.   end;
    576.   Kaarttel; // Voor MagicCard
    577. end;
    578.  
    579. // ------ Vertikaal / Horizontaal - 3x Optellingen kiezen
    580. procedure TMyForm.TelRijenCBClick(Sender: TObject);
    581. begin
    582.   If TelRijenCB.Checked  then
    583.   begin
    584.     TelKolommenCB.Checked := False;
    585.     TelAllesCB.Checked := False;
    586.     Kolommenleeg;
    587.     Rijentel;
    588.   end
    589.   else
    590.     Rijenleeg;
    591. end;
    592.  
    593.  
    594. procedure TMyForm.TelKolommenCBClick(Sender: TObject);
    595. begin
    596.   If TelKolommenCB.Checked then
    597.   begin
    598.     TelRijenCB.Checked := False;
    599.     TelAllesCB.Checked := False;
    600.     Rijenleeg;
    601.     Kolommentel;
    602.   end
    603.   else
    604.     Kolommenleeg;
    605. end;
    606.  
    607.  
    608. procedure TMyForm.TelAllesCBClick(Sender: TObject);
    609. begin
    610.   If TelAllesCB.Checked then
    611.   begin
    612.    TelRijenCB.Checked:= False;
    613.    TelKolommenCB.Checked:= False;
    614.    Rijentel;
    615.    Kolommentel;
    616.   end
    617.   else
    618.   begin
    619.    Rijenleeg;
    620.    Kolommenleeg;
    621.   end;
    622. end;
    623.  
    624. procedure TMyForm.CreateEditBoxes;
    625. var
    626.   Index, ARow, ACol:integer;
    627. const
    628.   TabOrderOffset = $1000;
    629. begin
    630.   for Index := 0 to NrEdits - 1 do
    631.   begin
    632.     FHokjes[Index] := TNumEdit.Create(Self);
    633.     IndexToRowCol(Index, ARow, ACol);
    634.     with FHokjes[Index] do
    635.     begin
    636.       Top:= 40 + ARow * 22; //trunc(Index/12)*22;   //  is ? rijen van 12 kaarten >
    637.       Left:=40 + ACol * 22; //(Index mod 12)*22;      //  bij for 0-35 do
    638.       Height:=21;
    639.       Width:=21;
    640.       MaxLength:=2;
    641.       Tag := Index;  //Nodig in OnEditBoxesKeyDown
    642.       TabOrder := TabOrderOffset + Index;
    643.       //OnKeyPress := OnEditBoxesKeyPress;
    644.       OnChange := OnEditBoxesChange;
    645.       OnKeydown:= OnEditBoxesKeydown;
    646.     end;
    647.     Hokjes[Index].Parent:=Self; //doe dat als laatste
    648.   end;
    649. end;
    650.  
    651. // ------ MAXIMUM Kaarten
    652. procedure TMyForm.MAXDeckChange(Sender: TObject);
    653. var
    654.   OldMaxW: Integer;
    655. begin
    656.   OldMaxW := MaxW;
    657.   if not (TryStrToInt(MaxDeck.Text, MaxW) and (MaxW > 0)) then
    658.   begin
    659.     MaxW := OldMaxW;
    660.     MaxDeck.Text := IntToStr(MaxW);
    661.   end;
    662.   MyForm.lbMagCard.Caption:='??';
    663.   Wissen;
    664. end;
    665.  
    666. function TMyForm.GetHokjes(AIndex: Integer): TNumEdit;
    667. begin
    668.   Result := FHokjes[AIndex];
    669. end;
    670.  
    671. function TMyForm.GetHokjes(ARow, ACol: Integer): TNumEdit;
    672. var
    673.   Index: Integer;
    674. begin
    675.   RowColToIndex(ARow, ACol, Index);
    676.   Result := GetHokjes(Index);
    677. end;
    678.  
    679.  
    680.  
    681. //function TMyForm.GetHokjesValue(AIndex: Integer): Integer;
    682. //begin
    683. //  if not TryStrToInt(Hokjes[AIndex].Text, Result) then
    684. //    Result := 0;
    685. //end;
    686.  
    687.  
    688.  
    689.  
    690. procedure TMyForm.RowColToIndex(const ARow, ACol: Integer; out AIndex: Integer);
    691. begin
    692.   AIndex := (ARow * RowCount) + ACol;
    693. end;
    694.  
    695. procedure TMyForm.IndexToRowCol(const AIndex: Integer; out ARow, ACol: Integer);
    696. begin
    697.   ARow :=  AIndex div RowCount;
    698.   ACol :=  AIndex mod RowCount;
    699. end;
    700.  
    701. // Uitgetelde waarde zelf in raster voegen om te gebruiken.
    702. procedure TMyForm.CopyCodeClick(Sender: TObject);
    703. begin
    704.   Kaarttel;
    705.   Klembord;
    706. end;
    707.  
    708. procedure TMyForm.btWissenClick(Sender: TObject);
    709. begin
    710.   Wissen;
    711.   // Wat ook kan:
    712.   //  for i := 0 to (ComponentCount -1) do begin
    713.   //   if (Component[i] is TEdit) then
    714.   //    (Component[i] as TEdit).Clear;          // of TEdit(Components[i]).Clear;
    715.   //   If (Components[I] Is TLabel) And (TLabel(Components[I]).Tag = 1) Then
    716.   //    TLabel(Components[I]).Caption := '';   // voor alleen sommige labels met tag = 1
    717.   //// Controls en ControlCount gebruiken voor andere objecten als het niet lukt
    718.   //  end;
    719. end;
    720.  
    721. procedure TMyForm.URLlabelClick(Sender: TObject);
    722. begin
    723.   {Vergeet niet bij uses: ShellApi toe te voegen}
    724.   ShellExecute(Application.Handle,'open','http://www.marieke-esoterie.nl','',nil,SW_NORMAL);
    725. end;
    726.  
    727. // ------ Help
    728. procedure TMyForm.btHelpClick(Sender: TObject);
    729. begin
    730.   Showmessage('Standaard Kaartnummers zijn 1-36. Lege vakjes worden genegeerd.'+#13+
    731.     'Rijen / Kolommen kunnen apart of tegelijk worden uitgeteld.'+#13+
    732.     'Op dit moment zijn er alleen titels voor de Lenormand kaarten'+#13+
    733.     'Getallen hoger dan 36 kunnen wel worden gebruikt.' +#13+
    734.     'Uittellen: geeft verschillende keuzes voor een speciale legging.'+#13+
    735.     'Met de Entertoets wordt opnieuw de MagicCard berekend.'+#13+#13+
    736.     'Kopieer met de Kopieerknop de uitkomst naar het pc-geheugen en'+#13+
    737.     'plak de code vervolgens in de doellocatie met de toetsen Ctrl+V.'+#13+
    738.     'Toets Esc = Sluiten.'+#13+
    739.     '(vs 1.0 26.09.2021)');
    740. end;
    741.  
    742. // ------ Zet Kleur in hokje en Voer telling uit
    743. procedure TMyForm.OnEditBoxesChange(Sender: TObject);
    744. var
    745.   i, Value: integer;
    746. begin
    747.   //writeln('OnEditBoxesChange: FSuppressEditBoxesOnChange=',FSuppressEditBoxesOnChange);
    748.   if FSuppressEditBoxesOnChange then
    749.     Exit;  //we zitten in procedure Wissen;
    750.  
    751.   i := (Sender as TEdit).Tag;
    752.  
    753.   //for i := 0 to High(Hokjes) do
    754.   //begin
    755.     if Hokjes[i].text <> '' then
    756.     begin //bevat text
    757.       Value := Hokjes[i].Value;
    758.       if Value > MaxW then
    759.       begin
    760.         Hokjes[i].Text := '';
    761.         Hokjes[i].Color:=clWindow;
    762.       end
    763.       else
    764.       begin
    765.         if Value > 0 then
    766.           Hokjes[i].Color:=clYellow
    767.         else
    768.           Hokjes[i].color:=clMoneyGreen
    769.       end
    770.     end
    771.     else //hokje is leeg
    772.       Hokjes[i].Color:=clWindow;
    773.   //end;
    774.  
    775.   lbMagCard.Caption:='??';
    776.   if TelAllesCB.Checked or TelRijenCB.Checked then
    777.     RijenTel;
    778.   if TelAllesCB.Checked or TelKolommenCB.Checked then
    779.     KolommenTel;
    780. end;
    781.  
    782. procedure TMyForm.OnEditBoxesKeyDown(Sender: TObject; var Key: Word; shift: TShiftState);
    783. var
    784.   Current, ARow, ACol: Integer;
    785.   procedure PrevHokje;
    786.   begin
    787.     if (Current > 0) then
    788.     begin
    789.       Dec(Current);
    790.       Hokjes[Current].SetFocus;
    791.     end;
    792.   end;
    793.   procedure NextHokje;
    794.   begin
    795.     if (Current < NrEdits - 1) then
    796.     begin
    797.       Inc(Current);
    798.       Hokjes[Current].SetFocus;
    799.     end;
    800.   end;
    801.   procedure NextRow;
    802.   begin
    803.     if (ARow < RowCount - 1) then
    804.     begin
    805.       Inc(ARow);
    806.       RowColToIndex(ARow, ACol, Current);
    807.       Hokjes[Current].SetFocus;
    808.     end;
    809.   end;
    810.   procedure PrevRow;
    811.   begin
    812.     if (ARow > 0) then
    813.     begin
    814.       Dec(ARow);
    815.       RowColToIndex(ARow, ACol, Current);
    816.       Hokjes[Current].SetFocus;
    817.     end;
    818.   end;
    819.  
    820. begin
    821.   if (Shift <> []) then
    822.     Exit;
    823.   //Sender moet hier de Edit zijn die focus heeft
    824.   Current := (Sender as TEdit).Tag;
    825.   IndexToRowCol(Current, ARow, ACol);
    826.   Case Key of
    827.    VK_Left: PrevHokje;
    828.    VK_Right: NextHokje;
    829.    VK_UP: PrevRow;
    830.    VK_DOWN: NextRow;
    831.   end;
    832. end;
    833.  
    834.  
    835. procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    836. begin
    837.  If Key = VK_ESCAPE then Close;                      // is event plus prop keypreview moet aan!
    838.  If Key = VK_RETURN then CopyCodeClick(Self);        // is event plus prop keypreview moet aan!
    839.  
    840.  if (Key=VK_F12) then DoDebugTesting;
    841. end;
    842.  
    843. procedure TMyForm.FormShow(Sender: TObject);
    844. begin
    845.   Hokjes[0].SetFocus;
    846. end;
    847.  
    848.  
    849. procedure TMyForm.FormCreate(Sender: TObject);
    850. begin
    851.   FSuppressEditBoxesOnChange := False;
    852.   CreateEditBoxes;
    853.   MaxW:=36;
    854.   CreateRowColLabels;
    855. end;
    856.  
    857.  
    858.  
    859. //*********************************************
    860. procedure TMyForm.DoDebugTesting;
    861. var
    862.   i: Integer;
    863. begin
    864.   for i := 0 to NrEdits - 1 do Hokjes[i].Value := MaxW;
    865. end;
    866.  
    867.  
    868. //*********************************************
    869.  
    870. End.

    DoDebugTesting wordt aangeroepen als je op F12 drukt.
    Ik gebruik die om allerlei testjes uit te voeren. Zoals je ziet was mijn laatste test om alle hokjes te vullen met de waarde MaxW om te bezien of ik ergens een error kon triggeren.

    En inderdaad hoef je in de OnEditBoxesChange niet alle hojes te doorlopen om de kleur bij te stellen, alleen het actieve hokje is genoeg.
    Dat heb ik ook maar aangepast dan.

    Bart

  10. #55
    Ik heb in KaartTel het opknippen in 12-tallen wat vereenvoudigd.
    Delphi Code:
    1. Procedure TMyForm.Kaarttel;
    2. var
    3.   k, y, Value: integer;
    4.   Sep: String;
    5. begin
    6.   kaartcode:='';
    7.   k:=0;
    8.   MC:=0;
    9.  
    10.   for y := 0 to NrEdits-1 do                    // is van Hokjes 1 t/m 144
    11.   begin
    12.     Value := Hokjes[y].Value;
    13.     //******************
    14.     Assert(Value <= MaxW,Format('Error Hokje[%d]: Value (%d) > MaxW (%d)',[y,Value,MaxW]));
    15.     //******************
    16.     if Value > 0 then          // Alle hokjes voor verschillende forums
    17.     begin
    18.       //******************
    19.       Assert(MC <= 143*MaxW,format('Error: MC (%d) > 143*MaxW (%d), when y=%d',[MC, 143*MaxW,y]));
    20.       //******************
    21.       Inc(k);
    22.       Inc(MC,Value);
    23.       if not ((KaartCode = '') or (k mod 12 = 1)) {nieuwe regel} then
    24.         KaartCode := KaartCode + ' - ';
    25.       if Value <= 36 then
    26.         kaartcode:=kaartcode + kaartxt[Value]
    27.       else
    28.         kaartcode:=kaartcode + (Hokjes[y].Text);
    29.       if (k mod 12 = 0) then
    30.       begin
    31.         KaartCode := KaartCode + #13#10;
    32.       end;
    33.     end;
    34.   end;
    35.   KaartCode := Trim(KaartCode);
    36.   if MC>MaxW then MC:=MC mod MaxW;
    37.   //OPM BB: Onderstaande regel doet helemaal niets !!!
    38.   if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!
    39.   if (MaxW=36)and (MC>0) and (MC<37) then
    40.     lbMagCard.Caption:=kaartxt[MC]
    41.   else
    42.     lbMagCard.Caption:='Nr. '+inttostr(MC);
    43. end;

    Bart

  11. #56
    @ Bart

    Ik kan de Uses NumEdit niet plaatsen, Geeft hier een fout maar kom er niet achter waar het dan kan staan:
    Ik heb Unit NumEdit als nieuwe unit toegevoegd en in de Uses list gezet.

    Code:
        uses
          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls, ClipBrd, DateUtils, Buttons,StrUtils,
          ShellAPI, ExtCtrls, Menus,
          NumEdit;
    Ik heb inmiddels wel gevonden hoe ik die fout kon verhelpen zie post #53
    Last edited by Marieke; 29-Sep-21 at 23:02.

  12. #57
    Quote Originally Posted by Marieke View Post
    Ik kan de Uses NumEdit niet plaatsen, Geeft hier een fout maar kom er niet achter waar het dan kan staan:
    Ik heb Unit NumEdit als nieuwe unit toegevoegd en in de Uses list gezet.
    Ik heb de unit gepost als code in post #54.
    Gewoon de tekst plakken in een lege unit (File->New->New unit??) en opslaan als numedit.pas (in de folder waar ook Kaartje.pas staat).

    Quote Originally Posted by Marieke View Post
    Ik heb inmiddels wel gevonden hoe ik die fout kon verhelpen zie post #53

    Delphi Code:
    1. Clipboard.AsText:= MyForm.lbMagCard.Caption;
    In welke procedure dan en wat stond er eerst?

    Bart

  13. #58
    Quote Originally Posted by Bart B View Post
    Gewoon de tekst plakken in een lege unit (File->New->New unit??) en opslaan als numedit.pas (in de folder waar ook Kaartje.pas staat).
    Ik heb nog eens wat heen en weer geknipt en geplakt en het schijnt nu te werken.

    Quote Originally Posted by Bart B View Post
    In welke procedure dan en wat stond er eerst? Bart
    Wat de Range Error / Integer Overflow fout herstelde:
    stond in de Procedure Klembord:
    Oud:
    Code:
    Procedure Klembord:
          Clipboard.AsText:= DagTijd+chr(13)+chr(10)
                            +kaartcode+chr(13)+chr(10)
                            +' MagicCard= '+kaartxt[MC];
    Nieuw:
    Code:
    Procedure Klembord:
       Clipboard.AsText:= DagTijd+chr(13)+chr(10)
                        +kaartcode+chr(13)+chr(10)
                        +MyForm.lbMagCard.Caption;
    Ik had zelf nog een extra knop bij het MAXedit veld ipv de Events van de Edit.
    De 0 waarde voor in het Raster had ik al teruggezet.
    Last edited by Marieke; 30-Sep-21 at 10:29.

  14. #59
    Quote Originally Posted by Marieke View Post
    Ik heb nog eens wat heen en weer geknipt en geplakt en het schijnt nu te werken.
    Mooi.

    Quote Originally Posted by Marieke View Post
    Wat de Range Error / Integer Overflow fout herstelde:
    stond in de Procedure Klembord: <snip>
    OK, dat zou alleen een error moeten geven als MC > 36 of < 0 is, wat als het goed is niet gebeurt als je MaxW niet een waarde > 36 geeft bij het testen. Dat had ik nog niet geprobeerd.
    Nice catch

    Vraagje tussendoor voor de goeroes hier: wordt een veldwaarde van een class geïnitialiseerd bij het instatiëren van de class?
    Zo niet dan is de waarde van MC ongedefineerd bij de start van het programma (en crasht KlemBord dus op kaartxt[MC]).


    Blijft (voor mij) dit stukje code in KaartTel:

    Delphi Code:
    1. if MC>MaxW then MC:=MC mod MaxW;
    2.   //OPM BB: Onderstaande regel doet helemaal niets !!!
    3.   if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!

    Wat wil je precies bereiken hier?

    En dit (direct eronder):
    Delphi Code:
    1. if (MaxW=36)and (MC>0) and (MC<37) then
    2.     lbMagCard.Caption:=kaartxt[MC]
    3.   else
    4.     lbMagCard.Caption:='Nr. '+inttostr(MC);

    De waarde van MaxW maakt hier niet uit, het gaat erom dat MC in de range 0..36 zit: de range van je Kaartxt array.

    Ik zou de conditie daarom veranderen in:
    Delphi Code:
    1. if MC in [Low(Kaartxt)..High(Kaartxt)] then
    Zo is ook direct duidelijk waar die grenzen vandaan komen.

    Bart

  15. #60
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by Bart B View Post
    Mooi.
    Vraagje tussendoor voor de goeroes hier: wordt een veldwaarde van een class geïnitialiseerd bij het instatiëren van de class?
    Voor zover ik weet wordt het geheugen van de instance genilled in InitInstance. In FPC simpelweg zo:

    Delphi Code:
    1. fillchar(instance^, InstanceSize, 0);
    2.            { insert VMT pointer into the new created memory area }
    3.            { (in class methods self contains the VMT!)           }
    4.            ppointer(instance)^:=pointer(self);


    Dit is onderdeel van de taaldefinitie.

Page 4 of 5 FirstFirst ... 2 3 4 5 LastLast

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
  •