Page 3 of 5 FirstFirst 1 2 3 4 5 LastLast
Results 31 to 45 of 74

Thread: Integer Overflow bij sommige getallen

  1. #31
    Quote Originally Posted by Bart B View Post
    Zie post #26.

    Bart
    Dat is inderdaad wel een bug maar veroorzaakt niet het probleem. Het lijkt een verzameling van omstandigheden te zijn maar ben er nog niet geheel achter welke verzameling

    in de code staat een verwijzing naar een num array die verder niet gebruikt wordt en als opmerking dat als deze verwijderd wordt de app crashed. Dat klopt. Echter in tmyform.Createeditboxes staat parent := myform, vervang deze door parent :=self en num kan verwijderd worden.

    Direct na deze verwijdering zal ongeacht welk getal je invult een foutmelding geven

    Deze foutmelding treed op in Rijentel

    In rijentel wordt
    Code:
    for y := 0 to High(hokje) do
    echter tijdens de debug run is de eerste waarde van y 144! en daar klapt de code op.
    Last edited by Miep; 27-Sep-21 at 19:12.

  2. #32
    vervang de code door
    Code:
    yy:=high(hokje);
    for Y:=0 to yy do
    en ook die foutmelding is verdwenen

    @Bart, kan mij overigs volledig vinden in de opmerking om alle functies/procedure die direct een element van het form aanspreken als functie/procedure van het form opgenomen zouden moeten worden.

  3. #33
    PS En daar waar de elementen aan worden gesproken in een procedure van het form dient myform verwijderd to worden
    zoals bijv hier
    Code:
    procedure TMyForm.CheckBox2Click(Sender: TObject);
    begin
       if myform.CheckBox2.Checked = True then
       begin
          myform.CheckBox1.Checked := False;
          myform.CheckBox3.Checked := False;
          Rijenleeg;
          Kolommentel;
       end
       else
          Kolommenleeg;
    end;
    
    procedure TMyForm.CheckBox3Click(Sender: TObject);
    begin
       if myform.CheckBox3.Checked = True then
       begin
          myform.CheckBox1.Checked := False;
          myform.CheckBox2.Checked := False;
          Rijentel;
          Kolommentel;
       end
       else
       begin
          Rijenleeg;
          Kolommenleeg;
       end;
    end;

  4. #34
    Quote Originally Posted by Miep View Post
    Dat is inderdaad wel een bug maar veroorzaakt niet het probleem. Het lijkt een verzameling van omstandigheden te zijn maar ben er nog niet geheel achter welke verzameling

    in de code staat een verwijzing naar een num array die verder niet gebruikt wordt en als opmerking dat als deze verwijderd wordt de app crashed. Dat klopt.
    Num kan wel degelijk verwijderd worden, zoals ik al eerder liet zien.
    Er staat ook niet dat de app crasht, er staat: "// WAARVOOR ?? Weghalen is ERROR"
    De error is een compilatie error, aangezien num gebruikt wordt in Wissen (en daarna nooit meer, dus die var is overbodig).

    Zegt de debugger dat y 144 is aan het begin van de loop???
    Als je de waarde uitvraagt in je code (ik had hier als debug statement "//writeln('RijenTel: arHokje[',y,']:=StrToInt(hokje[',y,'].text');" staan) dan begint die bij mij gewoon te tellen op 0.

    Als y daadwerkelijk niet nul is aan het begin van de loop, zoals je zegt zijn er maar 2 oorzaken die ik kan bedenken:
    1. compiler bug (niet bijster waarschijnlijk).
    2. de waarde van y wordt ergens overschreven.

    Heb jij Range Checking aanstaan?
    arHokje[0] is out of range, en daar klapt hij op (als je range checking aan hebt staan, anders moet je maar afwachten wat er gebeurt. In Lazarus krijg ik een Access Violation op die regel, kennelijk schrijft hij naar geheugen waar hij niet bij mag, maar dat kan anders zijn in een andere compiler, daar zou arHokje[0] kunnen overlappen met een andere variabele, zodat je later een andere foutmelding krijgt).

    Bart

  5. #35
    Quote Originally Posted by Bart B View Post
    Num kan wel degelijk verwijderd worden, zoals ik al eerder liet zien.
    Er staat ook niet dat de app crasht, er staat: "// WAARVOOR ?? Weghalen is ERROR"
    De error is een compilatie error, aangezien num gebruikt wordt in Wissen (en daarna nooit meer, dus die var is overbodig).
    nope, weghalen is direct crash bij opstarten, uiteraard na het weghalen in wissen
    Quote Originally Posted by Bart B View Post
    Zegt de debugger dat y 144 is aan het begin van de loop???
    Als je de waarde uitvraagt in je code (ik had hier als debug statement "//writeln('RijenTel: arHokje[',y,']:=StrToInt(hokje[',y,'].text');" staan) dan begint die bij mij gewoon te tellen op 0.
    bij mij dus op 144

    Quote Originally Posted by Bart B View Post
    Als y daadwerkelijk niet nul is aan het begin van de loop, zoals je zegt zijn er maar 2 oorzaken die ik kan bedenken:
    1. compiler bug (niet bijster waarschijnlijk).
    2. de waarde van y wordt ergens overschreven.
    of the scope is lost

    Quote Originally Posted by Bart B View Post
    Heb jij Range Checking aanstaan?
    arHokje[0] is out of range, en daar klapt hij op (als je range checking aan hebt staan, anders moet je maar afwachten wat er gebeurt. In Lazarus krijg ik een Access Violation op die regel, kennelijk schrijft hij naar geheugen waar hij niet bij mag, maar dat kan anders zijn in een andere compiler, daar zou arHokje[0] kunnen overlappen met een andere variabele, zodat je later een andere foutmelding krijgt).

    Bart
    geen veranderingen gemaakt in de project options compiler settings aangezien het idee was om de oorspronkelijke bug te vinden. Maar runtime range checking stond uit evenals overflow.

    Eea gedaan in D7

  6. #36
    Dit is wat ik tot nu toe heb gemaakt van de code (in Lazarus, dus een paar ifdef's erbij):
    Delphi Code:
    1. unit Kaartje;
    2.  
    3. {$IFDEF FPC}
    4.   {$MODE Delphi}
    5. {$ENDIF}
    6.  
    7. interface
    8.  
    9. uses
    10. {$IFnDEF FPC}
    11.   Jpeg, XPMan,
    12. {$ELSE}
    13. {$ENDIF}
    14.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    15.   Dialogs, StdCtrls, ClipBrd, DateUtils, Buttons,StrUtils,
    16.   ShellAPI, ExtCtrls, Menus, LCLProc;
    17.  
    18.  
    19. const
    20.   NrEdits = 144;
    21.  
    22. type
    23.   THokjes = array[0..NrEdits-1] of TEdit;
    24.   THokjesValues = array[0..NrEdits-1] of Integer;
    25.  
    26.   TMyForm = class(TForm)
    27.     CopyCode: TButton;
    28.     Shape1: TShape;
    29.     btWissen: TButton;
    30.     //XPManifest1: TXPManifest;
    31.     MAXDeck: TEdit;
    32.     K1: TLabel;
    33.     K2: TLabel;
    34.     K3: TLabel;
    35.     K4: TLabel;
    36.     K5: TLabel;
    37.     K6: TLabel;
    38.     K7: TLabel;
    39.     K8: TLabel;
    40.     K9: TLabel;
    41.     K10: TLabel;
    42.     K11: TLabel;
    43.     K12: TLabel;
    44.     R1: TLabel;
    45.     R2: TLabel;
    46.     R3: TLabel;
    47.     R4: TLabel;
    48.     R5: TLabel;
    49.     R6: TLabel;
    50.     R7: TLabel;
    51.     R8: TLabel;
    52.     R9: TLabel;
    53.     R10: TLabel;
    54.     R11: TLabel;
    55.     R12: TLabel;
    56.     CheckBox1: TCheckBox;
    57.     CheckBox2: TCheckBox;
    58.     CheckBox3: TCheckBox;
    59.     Uittellen: TButton;
    60.     PopupMenu1: TPopupMenu;
    61.     N29kaarten1: TMenuItem;
    62.     N310kaarten1: TMenuItem;
    63.     N3201: TMenuItem;
    64.     btHelp: TButton;
    65.     lbMagCard: TLabel;
    66.     N515kaarten1: TMenuItem;
    67.     Label1: TLabel;
    68.     lbHorizon: TLabel;
    69.     lbVertial: TLabel;
    70.     URLlabel: TLabel;
    71.     Label2: TLabel;
    72.     meKlembord: TMemo;
    73.     procedure CopyCodeClick(Sender: TObject);
    74.     procedure FormCreate(Sender: TObject);
    75.     procedure FormDestroy(Sender: TObject);
    76.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    77.     procedure btWissenClick(Sender: TObject);
    78.     procedure FormShow(Sender: TObject);
    79.     procedure CheckBox1Click(Sender: TObject);
    80.     procedure CheckBox2Click(Sender: TObject);
    81.     procedure CheckBox3Click(Sender: TObject);
    82.     procedure UittellenClick(Sender: TObject);
    83.     procedure N29kaarten1Click(Sender: TObject);
    84.     procedure N310kaarten1Click(Sender: TObject);
    85.     procedure N3201Click(Sender: TObject);
    86.     procedure btHelpClick(Sender: TObject);
    87.     procedure MAXDeckChange(Sender: TObject);
    88.     procedure N515kaarten1Click(Sender: TObject);
    89.     procedure URLlabelClick(Sender: TObject);
    90.  
    91.   private
    92.     { Private declarations }
    93.     hokje: THokjes;
    94.     arHokje: THokjesValues;
    95.     MC, MaxW: Integer;
    96.     KaartCode:string;
    97.     //FFocusedEditIndex: Integer;
    98.     procedure OnEditBoxesKeyPress(Sender: TObject; var Key: Char);
    99.     procedure OnEditBoxesChange(Sender: TObject);
    100.     procedure OnEditBoxesKeydown (Sender: TObject; var Key: Word; Shift: TShiftState);
    101.     procedure CreateEditBoxes; // Free bij FormDestroy
    102.     //procedure OnEditBoxesClick(Sender: TObject);
    103.     //Deze is noodzakelijk als je de tabtoets wilt gebruiken!
    104.     procedure CMDialogKey( Var msg: TCMDialogKey );
    105.               message CM_DIALOGKEY;
    106.  
    107.  
    108.     procedure Kaarttel;
    109.     procedure Klembord;
    110.     procedure Rijentel;
    111.     procedure Rijenleeg;
    112.     procedure Kolommentel;
    113.     procedure Kolommenleeg;
    114.     procedure Wissen;
    115.  
    116.   public
    117.     { Public declarations }
    118.  
    119. end;
    120.  
    121.  
    122. var
    123.   MyForm: TMyForm;
    124.  
    125.   //num: array[0..143] of integer;    // WAARVOOR ?? Weghalen is ERROR
    126.  
    127.   //codestr0, codestr1, codestr2, codestr3, tmp: String;
    128.   //x : integer;
    129.  
    130.  
    131. implementation
    132.  
    133. uses
    134. {$IFnDEF FPC}
    135.   VistaAltFixUnit,
    136. {$ELSE}
    137. {$ENDIF}
    138.   Data;
    139.  
    140. {$IFnDEF FPC}
    141.   {$R *.dfm}
    142. {$ELSE}
    143.   {$R *.lfm}
    144. {$ENDIF}
    145.  
    146. Procedure TMyForm.Kaarttel;
    147. var k, y: integer;
    148.     blVlag: boolean;
    149. begin
    150.   kaartcode:='';
    151.   k:=0; MC:=0;
    152.   blVlag:=false;
    153.  
    154.   for y := 0 to High(hokje) do                    // is van hokje 1 t/m 144
    155.   begin
    156.    inc(k,1);                                       // Rijtjes van 12 maken
    157.     //-----
    158.     if hokje[y].Text <> '' then                    // Edithokje is standaard tekst
    159.     begin
    160.       blVlag:=true;
    161.      if StrToInt(hokje[y].text) > 0 then          // Alle hokjes voor verschillende forums
    162.      begin
    163.      Inc(MC,strtoint(hokje[y].Text));
    164.      if MaxW <= 36 then
    165.        kaartcode:=kaartcode+' - '+kaartxt[strtoint(hokje[y].Text)]
    166.        else
    167.        kaartcode:=kaartcode+' - '+(hokje[y].Text);
    168.      end;
    169.     end;
    170.     //-----
    171.     if k=12 then
    172.     begin
    173.      if blVlag=true then     // Knip de verschillende Tekststrings in stukjes van 12
    174.      begin
    175.       kaartcode:=kaartcode+Chr(13)+Chr(10);
    176.       kaartcode:=stringreplace(kaartcode,chr(13)+chr(10)+' -',chr(13)+chr(10),[]);
    177.      end;
    178.      k:=0;
    179.      blVlag:=false;
    180.     end;
    181.     //-----
    182.   end;
    183.   Delete(kaartcode,1,2);  // De 1e 2 karakters uit de Tekststring strippen.
    184.   //--------------------
    185.   if MC>MaxW then MC:=MC mod MaxW;
    186.   if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!
    187.   if (MaxW=36)and (MC>0) and (MC<37) then MyForm.lbMagCard.Caption:=kaartxt[MC]
    188.      else MyForm.lbMagCard.Caption:='Nr. '+inttostr(MC);
    189. end;
    190. procedure TMyForm.Rijentel;
    191. var x, y: integer;
    192.     blVlag: boolean;
    193.     RR1,RR2,RR3,RR4,RR5,RR6,RR7,RR8,RR9,RR10,RR11,RR12:integer;    // ivm labels optelling
    194.  
    195. Begin
    196.   // STARTWAARDE OPTELLINGEN:
    197.   RR1:=0;RR2:=0;RR3:=0;RR4:=0;RR5:=0;RR6:=0;RR7:=0;RR8:=0;RR9:=0;RR10:=0;RR11:=0;RR12:=0;
    198. //------------------------------
    199.   for y := 0 to High(hokje) do                      // is van hokje 0 t/m 143
    200.   begin
    201.      //-----
    202.     if hokje[y].Text <>'' then                    // Edithokje is standaard tekst
    203.     begin
    204.       arHokje[y]:=StrToInt(hokje[y].text);        // Vul array met integerwaarde
    205.     end else
    206.       arHokje[y]:=0;
    207.   end;
    208.  
    209. //----- Nu gaan we optellen... Horizontaal
    210.   blVlag:=false;                                    // bij waarde in rijtje vlag = true
    211.   for x := 0 to 11 do
    212.   begin
    213.     RR1:=RR1+arHokje[x];
    214.     if arHokje[x]>0 then blVlag:=true;               // Start = al False, maakt niet uit hoe vaak>0!
    215.   end;
    216.   RR1:= RR1 mod MaxW ; // Uikomst 0 is kaart MaxW !!
    217.   if (RR1=0) and (blVlag=false) then RR1:=0 else if (RR1=0) and (blVlag=true) then RR1:=MaxW;
    218.   R1.Caption:=inttostr(RR1);
    219.  
    220.   blVlag:=false;
    221.   for x := 12 to 23 do
    222.   begin
    223.     RR2:=RR2+arHokje[x];
    224.     if arHokje[x]>0 then blVlag:=true;
    225.   end;
    226.   RR2:= RR2 mod MaxW ;
    227.   if (RR2=0) and (blVlag=false) then RR2:=0 else if (RR2=0) and (blVlag=true) then RR2:=MaxW;
    228.   R2.Caption:=inttostr(RR2);
    229.  
    230.   blVlag:=false;
    231.   for x := 24 to 35 do
    232.   begin
    233.     RR3:=RR3+arHokje[x];
    234.     if arHokje[x]>0 then blVlag:=true;
    235.   end;
    236.   RR3:= RR3 mod MaxW ;
    237.   if (RR3=0) and (blVlag=false) then RR3:=0 else
    238.     if (RR3=0) and (blVlag=true) then RR3:=MaxW;
    239.   R3.Caption:=inttostr(RR3);
    240.  
    241.   blVlag:=false;
    242.   for x := 36 to 47 do
    243.   begin
    244.     RR4:=RR4+arHokje[x];
    245.     if arHokje[x]>0 then blVlag:=true;
    246.   end;
    247.   RR4:= RR4 mod MaxW ;
    248.   if (RR4=0) and (blVlag=false) then RR4:=0 else if (RR4=0) and (blVlag=true) then RR4:=MaxW;
    249.   R4.Caption:=inttostr(RR4);
    250.  
    251.   blVlag:=false;
    252.   for x := 48 to 59 do
    253.   begin
    254.     RR5:=RR5+arHokje[x];
    255.     if arHokje[x]>0 then blVlag:=true;
    256.   end;
    257.   RR5:= RR5 mod MaxW ;
    258.   if (RR5=0) and (blVlag=false) then RR5:=0 else if (RR5=0) and (blVlag=true) then RR5:=MaxW;
    259.   R5.Caption:=inttostr(RR5);
    260.  
    261.   blVlag:=false;
    262.   for x := 60 to 71 do
    263.   begin
    264.     RR6:=RR6+arHokje[x];
    265.     if arHokje[x]>0 then blVlag:=true;
    266.   end;
    267.   RR6:= RR6 mod MaxW ;
    268.   if (RR6=0) and (blVlag=false) then RR6:=0 else if (RR6=0) and (blVlag=true) then RR6:=MaxW;
    269.   R6.Caption:=inttostr(RR6);
    270.  
    271.   blVlag:=false;
    272.   for x := 72 to 83 do
    273.   begin
    274.     RR7:=RR7+arHokje[x];
    275.     if arHokje[x]>0 then blVlag:=true;
    276.   end;
    277.   RR7:= RR7 mod MaxW ;
    278.   if (RR7=0) and (blVlag=false) then RR7:=0 else if (RR7=0) and (blVlag=true) then RR7:=MaxW;
    279.   R7.Caption:=inttostr(RR7);
    280.  
    281.   blVlag:=false;
    282.   for x := 84 to 95 do
    283.   begin
    284.     RR8:=RR8+arHokje[x];
    285.     if arHokje[x]>0 then blVlag:=true;
    286.   end;
    287.   RR8:= RR8 mod MaxW ;
    288.   if (RR8=0) and (blVlag=false) then RR8:=0 else if (RR8=0) and (blVlag=true) then RR8:=MaxW;
    289.   R8.Caption:=inttostr(RR8);
    290.  
    291.   blVlag:=false;
    292.   for x := 96 to 107 do
    293.   begin
    294.     RR9:=RR9+arHokje[x];
    295.     if arHokje[x]>0 then blVlag:=true;
    296.   end;
    297.   RR9:= RR9 mod MaxW ;
    298.   if (RR9=0) and (blVlag=false) then RR9:=0 else if (RR9=0) and (blVlag=true) then RR9:=MaxW;
    299.   R9.Caption:=inttostr(RR9);
    300.  
    301.   blVlag:=false;
    302.   for x := 108 to 119 do
    303.   begin
    304.     RR10:=RR10+arHokje[x];
    305.     if arHokje[x]>0 then blVlag:=true;
    306.   end;
    307.   RR10:= RR10 mod MaxW ;
    308.   if (RR10=0) and (blVlag=false) then RR10:=0 else if (RR10=0) and (blVlag=true) then RR10:=MaxW;
    309.   R10.Caption:=inttostr(RR10);
    310.  
    311.   blVlag:=false;
    312.   for x := 120 to 131 do
    313.   begin
    314.     RR11:=RR11+arHokje[x];
    315.     if arHokje[x]>0 then blVlag:=true;
    316.   end;
    317.   RR11:= RR11 mod MaxW ;
    318.   if (RR11=0) and (blVlag=false) then RR11:=0 else if (RR11=0) and (blVlag=true) then RR11:=MaxW;
    319.   R11.Caption:=inttostr(RR11);
    320.  
    321.   blVlag:=false;
    322.   for x := 132 to 143 do        // START = 0 !!
    323.   begin
    324.    RR12:=RR12+arHokje[x];
    325.    if arHokje[x]>0 then blVlag:=true;
    326.   end;
    327.   RR12:= RR12 mod MaxW ;
    328.   if (RR12=0) and (blVlag=false) then RR12:=0 else if (RR12=0) and (blVlag=true) then RR12:=MaxW;
    329.   R12.Caption:=inttostr(RR12);
    330. End;
    331.  
    332. procedure TMyForm.Rijenleeg;
    333. Begin
    334.   R1.Caption:='---';R2.Caption:='---';R3.Caption:='---';R4.Caption:='---';
    335.   R5.Caption:='---';R6.Caption:='---';R7.Caption:='---';R8.Caption:='---';
    336.   R9.Caption:='---';R10.Caption:='---';R11.Caption:='---';R12.Caption:='---';
    337. End;
    338.  
    339. procedure TMyForm.Kolommentel;
    340. var y: integer;
    341.     blVlag: boolean;
    342.     KK1,KK2,KK3,KK4,KK5,KK6,KK7,KK8,KK9,KK10,KK11,KK12:integer;
    343. Begin
    344.   // STARTWAARDE OPTELLINGEN:
    345.   KK1:=0;KK2:=0;KK3:=0;KK4:=0;KK5:=0;KK6:=0;KK7:=0;KK8:=0;KK9:=0;KK10:=0;KK11:=0;KK12:=0;
    346. //------------------------------
    347.   for y := 0 to High(hokje) do                      // is van hokje 0 t/m 143
    348.   begin
    349.      //-----
    350.     if hokje[y].Text <>'' then                    // Edithokje is standaard tekst
    351.     begin
    352.       arHokje[y]:=StrToInt(hokje[y].text);        // Vul array met integerwaarde
    353.     end else
    354.       arHokje[y]:=0;
    355.   end;
    356.  
    357.   //----- Nu gaan we optellen... Vertikaal
    358.   y:=0;
    359.   blVlag:=false;
    360.   while (y>=0) And (y<=132) do
    361.   begin
    362.     KK1:=KK1+arHokje[y];
    363.     if arHokje[y]>0 then blVlag:=true;                // 1 keer True is genoeg! Alles false = 0
    364.     inc (y,12);
    365.   end;
    366.   KK1:= KK1 mod MaxW ;                                  // Uikomst 0 is kaart MaxW !!
    367.   if (KK1=0) and (blVlag=false) then KK1:=0 else if (KK1=0) and (blVlag=true) then KK1:=MaxW;
    368.   K1.Caption:=inttostr(KK1);
    369.   y:=1;
    370.   blVlag:=false;
    371.   while (y>=1) And (y<=133) do
    372.   begin
    373.     KK2:=KK2+arHokje[y];
    374.     if arHokje[y]>0 then blVlag:=true;
    375.     inc (y,12);
    376.   end;
    377.   KK2:= KK2 mod MaxW ;
    378.   if (KK2=0) and (blVlag=false) then KK2:=0 else if (KK2=0) and (blVlag=true) then KK2:=MaxW;
    379.   K2.Caption:=inttostr(KK2);
    380.   y:=2;
    381.   blVlag:=false;
    382.   while (y>=2) And (y<=134) do
    383.   begin
    384.     KK3:=KK3+arHokje[y];
    385.     if arHokje[y]>0 then blVlag:=true;
    386.     inc (y,12);
    387.   end;
    388.   KK3:= KK3 mod MaxW ;
    389.   if (KK3=0) and (blVlag=false) then KK3:=0 else if (KK3=0) and (blVlag=true) then KK3:=MaxW;
    390.   K3.Caption:=inttostr(KK3);
    391.   y:=3;
    392.   blVlag:=false;
    393.   while (y>=3) And (y<=135) do
    394.   begin
    395.     KK4:=KK4+arHokje[y];
    396.     if arHokje[y]>0 then blVlag:=true;
    397.     inc (y,12);
    398.   end;
    399.   KK4:= KK4 mod MaxW ;
    400.   if (KK4=0) and (blVlag=false) then KK4:=0 else if (KK4=0) and (blVlag=true) then KK4:=MaxW;
    401.   K4.Caption:=inttostr(KK4);
    402.   y:=4;
    403.   blVlag:=false;
    404.   while (y>=4) And (y<=136) do
    405.   begin
    406.     KK5:=KK5+arHokje[y];
    407.     if arHokje[y]>0 then blVlag:=true;
    408.     inc (y,12);
    409.   end;
    410.   KK5:= KK5 mod MaxW ;
    411.   if (KK5=0) and (blVlag=false) then KK5:=0 else if (KK5=0) and (blVlag=true) then KK5:=MaxW;
    412.   K5.Caption:=inttostr(KK5);
    413.   y:=5;
    414.   blVlag:=false;
    415.   while (y>=5) And (y<=137) do
    416.   begin
    417.     KK6:=KK6+arHokje[y];
    418.     if arHokje[y]>0 then blVlag:=true;
    419.     inc (y,12);
    420.   end;
    421.   KK6:= KK6 mod MaxW ;
    422.   if (KK6=0) and (blVlag=false) then KK6:=0 else if (KK6=0) and (blVlag=true) then KK6:=MaxW;
    423.   K6.Caption:=inttostr(KK6);
    424.   y:=6;
    425.   blVlag:=false;
    426.   while (y>=6) And (y<=138) do
    427.   begin
    428.     KK7:=KK7+arHokje[y];
    429.     if arHokje[y]>0 then blVlag:=true;
    430.     inc (y,12);
    431.   end;
    432.   KK7:= KK7 mod MaxW ;
    433.   if (KK7=0) and (blVlag=false) then KK7:=0 else if (KK7=0) and (blVlag=true) then KK7:=MaxW;
    434.   K7.Caption:=inttostr(KK7);
    435.   y:=7;
    436.   blVlag:=false;
    437.   while (y>=7) And (y<=139) do
    438.   begin
    439.     KK8:=KK8+arHokje[y];
    440.     if arHokje[y]>0 then blVlag:=true;
    441.     inc (y,12);
    442.   end;
    443.   KK8:= KK8 mod MaxW ;
    444.   if (KK8=0) and (blVlag=false) then KK8:=0 else if (KK8=0) and (blVlag=true) then KK8:=MaxW;
    445.   K8.Caption:=inttostr(KK8);
    446.   y:=8;
    447.   blVlag:=false;
    448.   while (y>=8) And (y<=140) do
    449.   begin
    450.     KK9:=KK9+arHokje[y];
    451.     if arHokje[y]>0 then blVlag:=true;
    452.     inc (y,12);
    453.   end;
    454.   KK9:= KK9 mod MaxW ;
    455.   if (KK9=0) and (blVlag=false) then KK9:=0 else if (KK9=0) and (blVlag=true) then KK9:=MaxW;
    456.   K9.Caption:=inttostr(KK9);
    457.   y:=9;
    458.   blVlag:=false;
    459.   while (y>=9) And (y<=141) do
    460.   begin
    461.     KK10:=KK10+arHokje[y];
    462.     if arHokje[y]>0 then blVlag:=true;
    463.     inc (y,12);
    464.   end;
    465.   KK10:= KK10 mod MaxW ;
    466.   if (KK10=0) and (blVlag=false) then KK10:=0 else if (KK10=0) and (blVlag=true) then KK10:=MaxW;
    467.   K10.Caption:=inttostr(KK10);
    468.   y:=10;
    469.   blVlag:=false;
    470.   while (y>=10) And (y<=142) do
    471.   begin
    472.     KK11:=KK11+arHokje[y];
    473.     if arHokje[y]>0 then blVlag:=true;
    474.     inc (y,12);
    475.   end;
    476.   KK11:= KK11 mod MaxW ;
    477.   if (KK11=0) and (blVlag=false) then KK11:=0 else if (KK11=0) and (blVlag=true) then KK11:=MaxW;
    478.   K11.Caption:=inttostr(KK11);
    479.   y:=11;
    480.   blVlag:=false;
    481.   while (y>=11) And (y<=143) do        // STAKT = 0 !!
    482.   begin
    483.     KK12:=KK12+arHokje[y];
    484.     if arHokje[y]>0 then blVlag:=true;
    485.     inc (y,12);
    486.   end;
    487.   KK12:= KK12 mod MaxW ;
    488.   if (KK12=0) and (blVlag=false) then KK12:=0 else if (KK12=0) and (blVlag=true) then KK12:=MaxW;
    489.   K12.Caption:=inttostr(KK12);
    490.  
    491. end;
    492.  
    493. procedure TMyForm.Kolommenleeg;
    494. Begin
    495.   myform.K1.Caption:='---';myform.K2.Caption:='---';myform.K3.Caption:='---';myform.K4.Caption:='---';
    496.   myform.K5.Caption:='---';myform.K6.Caption:='---';myform.K7.Caption:='---';myform.K8.Caption:='---';
    497.   myform.K9.Caption:='---';myform.K10.Caption:='---';myform.K11.Caption:='---';myform.K12.Caption:='---';
    498. End;
    499.  
    500. procedure TMyForm.Wissen;
    501. var
    502.   i : integer;
    503. begin
    504.   //for k := 0 to 143 do num[k] := 0; // ?? Waarom / arry op 0 zetten moet ook bij start!
    505.   for i := 0 to High(hokje) do
    506.   begin
    507.     hokje[i].Clear;
    508.     hokje[i].Color:=clWindow;
    509.   end;
    510.   CheckBox1.Checked:= false;
    511.   CheckBox2.Checked:= false;
    512.   CheckBox3.Checked:= false;
    513.   Rijenleeg;
    514.   Kolommenleeg;
    515.   lbMagCard.Caption:='??';
    516.   meKlembord.Clear;
    517. End;
    518.  
    519. procedure TMyForm.Klembord;
    520. var
    521.   myDate: TDateTime;
    522.   myJaar, myMaand, myDag : Word;
    523.   myUur, myMin, mySec, myMilli : Word;
    524.   DagTijd: String;
    525. begin
    526.   myDate:=Now;
    527.   DecodeDateTime(myDate, myJaar, myMaand, myDag,
    528.                  myUur, myMin, mySec, myMilli);
    529.   DagTijd:='Mijn Legging van '+IntToStr(myDag)+ '-' + IntToStr(myMaand)+ '-' +IntToStr(myJaar)+ ' / '
    530.               +IntToStr(myUur)+ ':' + IntToStr(myMin)+ ':' + IntToStr(mySec)+chr(10);
    531.  
    532.   Clipboard.AsText:= DagTijd+chr(13)+chr(10)
    533.                     +kaartcode+chr(13)+chr(10)
    534.                     +' MagicCard= '+kaartxt[MC];
    535.  
    536.  meKlembord.Clear;
    537.  meKlembord.Lines.Add(Clipboard.AsText);
    538. end;
    539.  
    540. procedure TMyForm.UittellenClick(Sender: TObject);
    541. var
    542.  p : TPoint ;   // Popup op de juiste plek laten verschijnen -- eig. menu.OwnerDrawn = True !!
    543. begin
    544.  P := Uittellen.ClientToScreen(Point(0, Uittellen.Height)); // Point 0 is x,y van Knop
    545.  Popupmenu1.Popup(P.X, P.Y);
    546. end;
    547.  
    548. // ------ Uittellen 2 >  9 krt
    549. procedure TMyForm.N29kaarten1Click(Sender: TObject);
    550. var inkrt1, inkrt2, inx: integer;
    551. begin
    552.   if MessageBox(0,'Hokje 1 + 2 wordt uitgeteld tot 3x3=9 kaarten.'+#13+#13
    553.               +'k1 + k2 = kaart 3'+#13
    554.               +'k4=k3 -- k5=k2+k3 -- k6=k3+k4'+#13
    555.               +'k7=k6 -- k8=k5+k6 -- k9=k7+k8'+#13+#13
    556.               +'Alle andere hokjes worden GEWIST!'+#13
    557.               ,'Uittellen?', MB_YesNo)=mrYes then
    558.    begin
    559.     inkrt1:=0; inkrt2:=0;
    560.     if hokje[0].Text<>'' then inkrt1:=strtoint(hokje[0].text);   // eerste 2 kaarten bewaar in geheugen
    561.     if hokje[1].Text<>'' then inkrt2:=strtoint(hokje[1].text);
    562.     Wissen;                                                      // alle hokjes wissen
    563.     hokje[0].Text:=inttostr(inkrt1);                             // eerste 2 kaarten weer terugplaatsen
    564.     hokje[1].Text:=inttostr(inkrt2);
    565.     // Rij 1
    566.     inx:=(inkrt1+inkrt2) mod MaxW; if inx=0 then hokje[2].Text:=inttostr(MaxW)
    567.         else hokje[2].Text:=inttostr(inx);
    568.     // Rij 2
    569.     hokje[12].Text:=hokje[2].Text;
    570.     inx:=(strtoint(hokje[1].Text)+strtoint(hokje[2].Text)) mod MaxW; if inx=0 then hokje[13].Text:=inttostr(MaxW)
    571.           else hokje[13].Text:=inttostr(inx);
    572.     inx:=(strtoint(hokje[12].Text)+strtoint(hokje[13].Text)) mod MaxW; if inx=0 then hokje[14].Text:=inttostr(MaxW)
    573.           else hokje[14].Text:=inttostr(inx);
    574.     // Rij 3
    575.     hokje[24].Text:=hokje[14].Text;
    576.     inx:=(strtoint(hokje[13].Text)+strtoint(hokje[14].Text)) mod MaxW; if inx=0 then hokje[25].Text:=inttostr(MaxW)
    577.           else hokje[25].Text:=inttostr(inx);
    578.     inx:=(strtoint(hokje[24].Text)+strtoint(hokje[25].Text)) mod MaxW; if inx=0 then hokje[26].Text:=inttostr(MaxW)
    579.           else hokje[26].Text:=inttostr(inx);
    580.    end;
    581.    Kaarttel;  // Voor MagicCard�
    582. end;
    583.  
    584. // ------ Uittellen 3 > 10 krt
    585. procedure TMyForm.N310kaarten1Click(Sender: TObject);
    586. var
    587.   inkrt1, inkrt2, inkrt3, inx: integer;
    588. begin
    589.  if MessageBox(0,'Hokjes 1 + 2 + 3 worden uitgeteld tot 10 kaarten.'+#13+#13
    590.              +'k1 + k2 + k3 = kaart 4'+#13
    591.              +'k5=k1+k2 -- k6=k2+k3 -- k7=k3+k4'+#13
    592.              +'k8=k5+k6 -- k9=k7+k8'+#13
    593.              +'k10=k8+k9'+#13+#13
    594.              +'Alle andere hokjes worden GEWIST!'+#13
    595.              ,'Uittellen?', MB_YesNo)=mrYes then
    596.   begin
    597.     inkrt1:=0; inkrt2:=0; inkrt3:=0;
    598.     if hokje[0].Text<>'' then inkrt1:=strtoint(hokje[0].text);
    599.     if hokje[1].Text<>'' then inkrt2:=strtoint(hokje[1].text);
    600.     if hokje[2].Text<>'' then inkrt3:=strtoint(hokje[2].text);
    601.     Wissen;
    602.     hokje[0].Text:=inttostr(inkrt1);
    603.     hokje[1].Text:=inttostr(inkrt2);
    604.     hokje[2].Text:=inttostr(inkrt3);
    605.     // Rij 1
    606.     inx:=(inkrt1+inkrt2+inkrt3) mod MaxW;
    607.         if inx=0 then hokje[3].Text:=inttostr(MaxW)  else hokje[3].Text:=inttostr(inx);
    608.     // Rij 2
    609.     inx:=(strtoint(hokje[0].Text)+strtoint(hokje[1].Text)) mod MaxW;
    610.         if inx=0 then hokje[12].Text:=inttostr(MaxW) else hokje[12].Text:=inttostr(inx);
    611.     inx:=(strtoint(hokje[1].Text)+strtoint(hokje[2].Text)) mod MaxW;
    612.         if inx=0 then hokje[13].Text:=inttostr(MaxW) else hokje[13].Text:=inttostr(inx);
    613.     inx:=(strtoint(hokje[2].Text)+strtoint(hokje[3].Text)) mod MaxW;
    614.         if inx=0 then hokje[14].Text:=inttostr(MaxW) else hokje[14].Text:=inttostr(inx);
    615.     // Rij 3
    616.     inx:=(strtoint(hokje[12].Text)+strtoint(hokje[13].Text)) mod MaxW;
    617.         if inx=0 then hokje[24].Text:=inttostr(MaxW) else hokje[24].Text:=inttostr(inx);
    618.     inx:=(strtoint(hokje[13].Text)+strtoint(hokje[14].Text)) mod MaxW;
    619.         if inx=0 then hokje[25].Text:=inttostr(MaxW) else hokje[25].Text:=inttostr(inx);
    620.     // Rij 4
    621.     inx:=(strtoint(hokje[24].Text)+strtoint(hokje[25].Text)) mod MaxW;
    622.         if inx=0 then hokje[36].Text:=inttostr(MaxW) else hokje[36].Text:=inttostr(inx);
    623.   end;
    624.   Kaarttel;  // Voor MagicCard�
    625. end;
    626.  
    627.  
    628. // ------ Uittellen 3 > 16 krt
    629. procedure TMyForm.N3201Click(Sender: TObject);
    630. var inkrt1, inkrt2, inkrt3, inx: integer;
    631. begin
    632.   if MessageBox(0,'Hokjes 1 + 2 + 3 worden uitgeteld tot 16 kaarten.'+#13+#13
    633.               +'k1 + k2 + k3 = kaart 4'+#13
    634.               +'k5=k1+k2 -- k6=k2+k3 -- k7=k3+k4 -- k8=k5+k6+k7'+#13
    635.               +'k9=k5+k6 -- k10=k7+k8 -- k11=k7+k8 -- k12=k9+10+11'+#13
    636.               +'k13=k9+k10 -- k14=10+11 -- 15=11+12 -- 16=13+14+15'+#13+#13
    637.               +'Alle andere hokjes worden GEWIST!'+#13
    638.               ,'Uittellen?', MB_YesNo)=6 then
    639.    begin
    640.     inkrt1:=0; inkrt2:=0; inkrt3:=0;
    641.     if hokje[0].Text<>'' then inkrt1:=strtoint(hokje[0].text);
    642.     if hokje[1].Text<>'' then inkrt2:=strtoint(hokje[1].text);
    643.     if hokje[2].Text<>'' then inkrt3:=strtoint(hokje[2].text);
    644.     Wissen;
    645.     hokje[0].Text:=inttostr(inkrt1);
    646.     hokje[1].Text:=inttostr(inkrt2);
    647.     hokje[2].Text:=inttostr(inkrt3);
    648.     // Rij 1
    649.     inx:=(inkrt1+inkrt2+inkrt3) mod MaxW;
    650.         if inx=0 then hokje[3].Text:=inttostr(MaxW)  else hokje[3].Text:=inttostr(inx);
    651.     // Rij 2
    652.     inx:=(strtoint(hokje[0].Text)+strtoint(hokje[1].Text)) mod MaxW;
    653.         if inx=0 then hokje[12].Text:=inttostr(MaxW) else hokje[12].Text:=inttostr(inx);
    654.     inx:=(strtoint(hokje[1].Text)+strtoint(hokje[2].Text)) mod MaxW;
    655.         if inx=0 then hokje[13].Text:=inttostr(MaxW) else hokje[13].Text:=inttostr(inx);
    656.     inx:=(strtoint(hokje[2].Text)+strtoint(hokje[3].Text)) mod MaxW;
    657.         if inx=0 then hokje[14].Text:=inttostr(MaxW) else hokje[14].Text:=inttostr(inx);
    658.     inx:=(strtoint(hokje[12].Text)+strtoint(hokje[13].Text)+strtoint(hokje[14].Text)) mod MaxW;
    659.         if inx=0 then hokje[15].Text:=inttostr(MaxW) else hokje[15].Text:=inttostr(inx);
    660.     // Rij 3
    661.     inx:=(strtoint(hokje[12].Text)+strtoint(hokje[13].Text)) mod MaxW;
    662.         if inx=0 then hokje[24].Text:=inttostr(MaxW) else hokje[24].Text:=inttostr(inx);
    663.     inx:=(strtoint(hokje[13].Text)+strtoint(hokje[14].Text)) mod MaxW;
    664.         if inx=0 then hokje[25].Text:=inttostr(MaxW) else hokje[25].Text:=inttostr(inx);
    665.     inx:=(strtoint(hokje[14].Text)+strtoint(hokje[15].Text)) mod MaxW;
    666.         if inx=0 then hokje[26].Text:=inttostr(MaxW) else hokje[26].Text:=inttostr(inx);
    667.     inx:=(strtoint(hokje[24].Text)+strtoint(hokje[25].Text)+strtoint(hokje[26].Text)) mod MaxW;
    668.         if inx=0 then hokje[27].Text:=inttostr(MaxW) else hokje[27].Text:=inttostr(inx);
    669.     // Rij 4
    670.     inx:=(strtoint(hokje[24].Text)+strtoint(hokje[25].Text)) mod MaxW;
    671.         if inx=0 then hokje[36].Text:=inttostr(MaxW) else hokje[36].Text:=inttostr(inx);
    672.     inx:=(strtoint(hokje[25].Text)+strtoint(hokje[26].Text)) mod MaxW;
    673.         if inx=0 then hokje[37].Text:=inttostr(MaxW) else hokje[37].Text:=inttostr(inx);
    674.     inx:=(strtoint(hokje[26].Text)+strtoint(hokje[27].Text)) mod MaxW;
    675.         if inx=0 then hokje[38].Text:=inttostr(MaxW) else hokje[38].Text:=inttostr(inx);
    676.     inx:=(strtoint(hokje[36].Text)+strtoint(hokje[37].Text)+strtoint(hokje[38].Text)) mod MaxW;
    677.         if inx=0 then hokje[39].Text:=inttostr(MaxW) else hokje[39].Text:=inttostr(inx);
    678.    end;
    679.    Kaarttel;  // Voor MagicCard�
    680. end;
    681.  
    682. // ------ Uittellen 5 > 15 krt
    683. procedure TMyForm.N515kaarten1Click(Sender: TObject);
    684. var inkrt1, inkrt2, inkrt3, inkrt4, inkrt5, inx: integer;
    685. begin
    686.   if MessageBox(0,'Hokjes 1 + 2 + 3 + 4 + 5 worden uitgeteld tot 15 kaarten.'+#13+#13
    687.             +'k06=k1+k2 -- k07=k2+k3 -- k08=k3+k4 -- k09=k4+k5'+#13
    688.             +'k10=k6+k7 -- k11=k7+k8 -- k12=k8+k9'+#13
    689.             +'k13=k10+k11 -- k14=k11+k12'+#13
    690.             +'k15=k13+k14'+#13+#13
    691.             +'Alle andere hokjes worden GEWIST!'+#13
    692.             ,'Uittellen?', MB_YesNo)=6 then
    693.   begin
    694.     inkrt1:=0; inkrt2:=0; inkrt3:=0; inkrt4:=0; inkrt5:=0;
    695.     if hokje[0].Text<>'' then inkrt1:=strtoint(hokje[0].text);
    696.     if hokje[1].Text<>'' then inkrt2:=strtoint(hokje[1].text);
    697.     if hokje[2].Text<>'' then inkrt3:=strtoint(hokje[2].text);
    698.     if hokje[3].Text<>'' then inkrt4:=strtoint(hokje[3].text);
    699.     if hokje[4].Text<>'' then inkrt5:=strtoint(hokje[4].text);
    700.     Wissen;
    701.     hokje[0].Text:=inttostr(inkrt1);
    702.     hokje[1].Text:=inttostr(inkrt2);
    703.     hokje[2].Text:=inttostr(inkrt3);
    704.     hokje[3].Text:=inttostr(inkrt4);
    705.     hokje[4].Text:=inttostr(inkrt5);
    706.     //// Rij 1   // Valt weg?
    707.     //      inx:=(inkrt1+inkrt2+inkrt3+inkrt4+inkrt5) mod MaxW;
    708.     //          if inx=0 then hokje[3].Text:=inttostr(MaxW)  else hokje[3].Text:=inttostr(inx);
    709.     // Rij 2
    710.     inx:=(strtoint(hokje[0].Text)+strtoint(hokje[1].Text)) mod MaxW;
    711.     if inx=0 then hokje[12].Text:=inttostr(MaxW) else hokje[12].Text:=inttostr(inx);
    712.     inx:=(strtoint(hokje[1].Text)+strtoint(hokje[2].Text)) mod MaxW;
    713.     if inx=0 then hokje[13].Text:=inttostr(MaxW) else hokje[13].Text:=inttostr(inx);
    714.     inx:=(strtoint(hokje[2].Text)+strtoint(hokje[3].Text)) mod MaxW;
    715.     if inx=0 then hokje[14].Text:=inttostr(MaxW) else hokje[14].Text:=inttostr(inx);
    716.     inx:=(strtoint(hokje[3].Text)+strtoint(hokje[4].Text)) mod MaxW;
    717.     if inx=0 then hokje[15].Text:=inttostr(MaxW) else hokje[15].Text:=inttostr(inx);
    718.     // Rij 3
    719.     inx:=(strtoint(hokje[12].Text)+strtoint(hokje[13].Text)) mod MaxW;
    720.     if inx=0 then hokje[24].Text:=inttostr(MaxW) else hokje[24].Text:=inttostr(inx);
    721.     inx:=(strtoint(hokje[13].Text)+strtoint(hokje[14].Text)) mod MaxW;
    722.     if inx=0 then hokje[25].Text:=inttostr(MaxW) else hokje[25].Text:=inttostr(inx);
    723.     inx:=(strtoint(hokje[14].Text)+strtoint(hokje[15].Text)) mod MaxW;
    724.     if inx=0 then hokje[26].Text:=inttostr(MaxW) else hokje[26].Text:=inttostr(inx);
    725.     // Rij 4
    726.     inx:=(strtoint(hokje[24].Text)+strtoint(hokje[25].Text)) mod MaxW;
    727.     if inx=0 then hokje[36].Text:=inttostr(MaxW) else hokje[36].Text:=inttostr(inx);
    728.     inx:=(strtoint(hokje[25].Text)+strtoint(hokje[26].Text)) mod MaxW;
    729.     if inx=0 then hokje[37].Text:=inttostr(MaxW) else hokje[37].Text:=inttostr(inx);
    730.     // Rij 5
    731.     inx:=(strtoint(hokje[36].Text)+strtoint(hokje[37].Text)) mod MaxW;
    732.     if inx=0 then hokje[48].Text:=inttostr(MaxW) else hokje[48].Text:=inttostr(inx);
    733.   end;
    734.   Kaarttel; // Voor MagicCard
    735. end;
    736.  
    737. // ------ Vertikaal / Horizontaal - 3x Optellingen kiezen
    738. procedure TMyForm.CheckBox1Click(Sender: TObject);
    739. begin
    740. If myform.CheckBox1.Checked = True then
    741. begin
    742.   myform.CheckBox2.Checked:= False;
    743.   myform.CheckBox3.Checked:= False;
    744.   Kolommenleeg;
    745.   Rijentel;
    746.   end else Rijenleeg;
    747. end;
    748.  
    749.  
    750. procedure TMyForm.CheckBox2Click(Sender: TObject);
    751. begin
    752.   If myform.CheckBox2.Checked = True then
    753.   begin
    754.     myform.CheckBox1.Checked:= False;
    755.     myform.CheckBox3.Checked:= False;
    756.     Rijenleeg;
    757.     Kolommentel;
    758.   end
    759.   else Kolommenleeg;
    760. end;
    761.  
    762.  
    763. procedure TMyForm.CheckBox3Click(Sender: TObject);
    764. begin
    765.   If myform.CheckBox3.Checked = True then
    766.   begin
    767.    myform.CheckBox1.Checked:= False;
    768.    myform.CheckBox2.Checked:= False;
    769.    Rijentel;
    770.    Kolommentel;
    771.   end else
    772.   begin
    773.    Rijenleeg;
    774.    Kolommenleeg;
    775.   end;
    776. end;
    777.  
    778. procedure TMyForm.CreateEditBoxes;
    779. var i:integer;
    780. begin
    781. for i := 0 to 143 do
    782.   begin
    783.     hokje[i] := TEdit.Create(nil);
    784.     with hokje[i] do
    785.     begin
    786.       parent:=MyForm;
    787.       top:= 40 + trunc(i/12)*22;   //  is ? rijen van 12 kaarten >
    788.       left:=40 + i mod 12*22;      //  bij for 0-35 do
    789.       height:=21;
    790.       width:=21;
    791.       MaxLength:=2;
    792.       tag := i;                    // ter identificatie mogen ook de zelfde nummers hebben
    793.       OnKeyPress := OnEditBoxesKeyPress;
    794.       OnChange := OnEditBoxesChange;
    795.       OnKeydown:= OnEditBoxesKeydown;
    796.       //OnClick:= OnEditBoxesClick;
    797.   end;
    798.   end;
    799. end;
    800.  
    801. // ------ MAXIMUM Kaarten
    802. procedure TMyForm.MAXDeckChange(Sender: TObject);
    803. begin
    804.   MaxW:=StrToInt(MaxDeck.Text);
    805.   MyForm.lbMagCard.Caption:='??';
    806.   Wissen;
    807. end;
    808.  
    809. // Uitgetelde waarde zelf in raster voegen om te gebruiken.
    810. procedure TMyForm.CopyCodeClick(Sender: TObject);
    811. begin
    812.   Kaarttel;
    813.   Klembord;
    814. end;
    815.  
    816. procedure TMyForm.btWissenClick(Sender: TObject);
    817. begin
    818.   Wissen;
    819.   // Wat ook kan:
    820.   //  for i := 0 to (ComponentCount -1) do begin
    821.   //   if (Component[i] is TEdit) then
    822.   //    (Component[i] as TEdit).Clear;          // of TEdit(Components[i]).Clear;
    823.   //   If (Components[I] Is TLabel) And (TLabel(Components[I]).Tag = 1) Then
    824.   //    TLabel(Components[I]).Caption := '';   // voor alleen sommige labels met tag = 1
    825.   //// Controls en ControlCount gebruiken voor andere objecten als het niet lukt
    826.   //  end;
    827. end;
    828.  
    829. procedure TMyForm.URLlabelClick(Sender: TObject);
    830. begin
    831.   {Vergeet niet bij uses: ShellApi toe te voegen}
    832.   ShellExecute(Application.Handle,'open','http://www.marieke-esoterie.nl','',nil,SW_NORMAL);
    833. end;
    834. // ------ Help
    835. procedure TMyForm.btHelpClick(Sender: TObject);
    836. begin
    837.   Showmessage('Standaard Kaartnummers zijn 1-36. Lege vakjes worden genegeerd.'+#13+
    838.     'Rijen / Kolommen kunnen apart of tegelijk worden uitgeteld.'+#13+
    839.     'Op dit moment zijn er alleen titels voor de Lenormand kaarten'+#13+
    840.     'Getallen hoger dan 36 kunnen wel worden gebruikt.' +#13+
    841.     'Uittellen: geeft verschillende keuzes voor een speciale legging.'+#13+
    842.     'Met de Entertoets wordt opnieuw de MagicCard berekend.'+#13+#13+
    843.     'Kopieer met de Kopieerknop de uitkomst naar het pc-geheugen en'+#13+
    844.     'plak de code vervolgens in de doellocatie met de toetsen Ctrl+V.'+#13+
    845.     'Toets Esc = Sluiten.'+#13+
    846.     '(vs 1.0 26.09.2021)');
    847. end;
    848.  
    849. // ------ Zet Kleur in hokje en Voer telling uit
    850. procedure TMyForm.OnEditBoxesChange(Sender: TObject);
    851. var i: integer;
    852. begin
    853.   //writeln('OnEditBoxesChange');
    854.   for i := 0 to High(hokje) do
    855.   begin
    856.   if hokje[i].text <> '' then
    857.    if StrToInt(hokje[i].text) > MaxW then
    858.    begin
    859.      hokje[i].text := '';
    860.      hokje[i].Color:=clWindow;
    861.    end else
    862.    if StrToInt(hokje[i].text) > 0 then
    863.      hokje[i].Color:=clYellow else hokje[i].color:=clMoneyGreen
    864.      else hokje[i].Color:=clWindow;
    865.   end;
    866.   lbMagCard.Caption:='??';
    867.   If CheckBox3.Checked = True then
    868.    begin
    869.     Rijentel;
    870.     Kolommentel;
    871.    end
    872.    else if CheckBox1.Checked = True then Rijentel
    873.      else if CheckBox2.Checked = True then Kolommentel;
    874. end;
    875.  
    876. //OPM BB: Niet meer nodig
    877.  
    878. // ------ Onthoud in welk hokje een muisklik is
    879. //procedure TMyform.OnEditBoxesClick(Sender: TObject);
    880. //var i:integer;
    881. //begin
    882. //  for i := 0 to High(hokje) do
    883. //  begin
    884. //   if hokje[i].Focused = true then
    885. //   begin
    886. //    FFocusedEditIndex:=i;
    887. //    Exit;
    888. //   end;
    889. //  end;
    890. //end;
    891. // ------ Onthoud in welk hokje een pijltoets wordt gebruikt
    892. procedure TMyForm.OnEditBoxesKeyDown(Sender: TObject; var Key: Word; shift: TShiftState);
    893. var
    894.   x: Integer;
    895. begin
    896.   x := (Sender as TEdit).Tag;
    897.   Case Key of
    898.    VK_Left :
    899.    begin
    900.      if x >= 1 then
    901.      begin
    902.       dec(x,1);
    903.       hokje[x].SetFocus;
    904.      end;
    905.     end;
    906.    VK_Right:
    907.    begin
    908.      if x <= 142 then
    909.      begin
    910.       inc(x,1);
    911.       hokje[x].SetFocus;
    912.      end;
    913.     end;
    914.    VK_UP :
    915.    begin
    916.      if x >= 12 then
    917.      begin
    918.       dec(x,12);
    919.       hokje[x].SetFocus;
    920.      end;
    921.     end;
    922.    VK_DOWN :
    923.    begin
    924.      if x < 132 then
    925.      begin
    926.       inc(x,12);
    927.       hokje[x].SetFocus;
    928.      end;
    929.    end;
    930.    VK_TAB :      // was niet zo simpel!  Zie procedure dialogkey
    931.    begin
    932.      if x <= 142 then
    933.      begin
    934.       inc(x,1);
    935.       hokje[x].SetFocus;
    936.      end;
    937.    end;
    938.   end;
    939.   //====
    940. end;
    941.  
    942. // ------ Controleer op geldige input
    943. procedure TMyForm.OnEditBoxesKeyPress(Sender: TObject; var Key: Char);
    944. begin
    945.   { Deze proecedure wordt uitgevoerd als een van je 144 editboxes een keypress signaleerd }
    946.   //Self.Caption := Key; // ? is dit nodig - zonder gaat ook.
    947.   if not (Key in ['1'..'9', #10, #8]) then Key := #0;
    948.   // #0 = geen toets.  //#37, #38, #39, #40 = pijlen
    949.   {combineer:['a'..'z','A'..'Z'], #48=0 of andere ascii waarde - zie nummerceck.txt
    950.   // #3, #8, #13,#22, #24, #9, #10 = Ctrl C, Backspace, EnterRet, Ctrl V, Ctrl X, TAB, Enter.
    951.   // if Key in [#13] then form1.Convert1Click(nil)end; // Handig bij 1 knop = Enteren}
    952.  
    953.   //OPM BB: is het getal "10" verboden om in te typen?
    954. end;
    955.  
    956. // ------ Om VK_TAB toets te kunnen gebruiken op form niveau
    957. procedure TMyForm.CMDialogKey(var msg: TCMDialogKey);
    958. begin
    959.   if msg.Charcode <> VK_TAB then // lees onderaan hoe het precies zit
    960.    inherited;                    // wordt benut in de OnEditBoxesKeyDown procedure
    961. end;
    962.  
    963. procedure TMyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    964. begin
    965.  If Key = VK_ESCAPE then Close;                      // is event plus prop keypreview moet aan!
    966.  If Key = VK_RETURN then CopyCodeClick(Self);        // is event plus prop keypreview moet aan!
    967. end;
    968.  
    969. procedure TMyForm.FormShow(Sender: TObject);
    970. begin
    971.   hokje[0].setfocus;
    972.   //self.FFocusedEditIndex := 0;
    973. end;
    974.  
    975. procedure TMyForm.FormDestroy(Sender: TObject);
    976. var
    977.   i: integer;
    978. begin
    979.   for i := 0 to 143 do
    980.     hokje[i].Free;
    981. end;
    982. procedure TMyForm.FormCreate(Sender: TObject);
    983. begin
    984.   CreateEditBoxes;
    985.   MaxW:=36;
    986. end;
    987.  
    988. End.

    Heb her en der wat lokale variabelen moeten hernoemen om name-clashes te voorkomen.

    Bart
    Last edited by Bart B; 27-Sep-21 at 20:48. Reason: typo

  7. #37
    Quote Originally Posted by Miep View Post
    nope, weghalen is direct crash bij opstarten, uiteraard na het weghalen in wissen
    Bij mij niet dus.


    Quote Originally Posted by Miep View Post
    of the scope is lost
    Vandaar mijn writeln() debug statement.

    Quote Originally Posted by Miep View Post
    geen veranderingen gemaakt in de project options compiler settings aangezien het idee was om de oorspronkelijke bug te vinden. Maar runtime range checking stond uit evenals overflow.
    Tja, eerst alle checks aanzetten als je gaat debuggen zou ik zeggen.
    Sterker nog: pas uitzetten als je gaat releasen.

    Bart

  8. #38
    Quote Originally Posted by Bart B View Post
    Bij mij niet dus.
    Vandaar mijn writeln() debug statement.
    Tja, eerst alle checks aanzetten als je gaat debuggen zou ik zeggen.
    Sterker nog: pas uitzetten als je gaat releasen.
    Bart
    Ik dacht dat ik die checks had aangezet - zeker vanzelf uitgegaan - dus weer aangezet.
    Nu krijg ik als Error Message: Range Check Error.
    De array arHokje[x] van 1..144 naar 0..143 gezet - Gaf geen verschil.

    Ik heb wat tijd nodig om alle suggesties uit te proberen.
    Maar jullie mogen gerust je gang gaan....
    Ik kan alleen niet zo snel reageren - wat een ander in 5 minuten programmeert daar doe ik 5 dagen over.
    Last edited by Marieke; 27-Sep-21 at 22:41.

  9. #39
    @ Bart - wat betreft post #29
    Het is veel om rekening mee te houden maar ben er blij mee!
    Ik zal het allemaal proberen te begrijpen in eerste instantie en dan toe te passen.
    Het is moeilijk om aan al die wijsheid te komen. Op internet is alles Engels en boeken zijn er niet veel.
    Ik heb een paar jaar een abonnement op Blaise Pascal gehad maar kwam erop neer dat ik daar niet veel aan had.
    In de jaren 90 een paar boeken gekocht maar er bleven veel vragen over.
    Pas toen we op het internet zaten konden we pas goed van start en veel aan de weet komen.
    Het is een leerproces en een hobby - Ik hoop weer even vooruit te kunnen met of zonder die bug.

    Iedereen - bedankt voor de antwoorden.

  10. #40
    Rijentel en Kolommentel kunnen nog wel wat eenvoudiger, mits je je labels als R1..R12 en K1..K12 anders organiseert.
    En arHokjes kan eigenlijk ook wel weg (vervangen door een property die gelijk de waarde als integer van een hokje teruggeeft).

    Kom daar morgen nog op terug.

    Bart

  11. #41
    y kan 144 zijn aan het begin van de loop door compiler optimization.
    De code kan omgeschreven worden, zodat de lus aftelt, omdat dat soms efficienter is. Op de plekken waar y gebruikt wordt in de loop, wordt dat dan weer vervangen door 144-y ofzo. Kortom, het werkt zoals het zou moeten, maar de inspector zet je op het verkeerde been.
    Bij het debuggen van dat soort zaken kan het handig zijn om Optimization uit te zetten in de compiler-opties, om dit soort bijverschijnselen te onderdrukken.
    1+1=b

  12. #42
    Quote Originally Posted by GolezTrol View Post
    y kan 144 zijn aan het begin van de loop door compiler optimization.
    De code kan omgeschreven worden, zodat de lus aftelt, omdat dat soms efficienter is. Op de plekken waar y gebruikt wordt in de loop, wordt dat dan weer vervangen door 144-y ofzo. Kortom, het werkt zoals het zou moeten, maar de inspector zet je op het verkeerde been.
    Bij het debuggen van dat soort zaken kan het handig zijn om Optimization uit te zetten in de compiler-opties, om dit soort bijverschijnselen te onderdrukken.
    Dank! Weer wat geleerd

    Maar waarom begint het met 144 als de hoogste waarde 143 zou moeten zijn vanwege high(hokje);

  13. #43
    OK, ik heb me even uitgeleefd

    Wat heb ik allemaal gedaan:

    Ik heb een aantal dingen verwijderd omdat ze niet meer noodzakelijk zijn:
    • OnEditBoxesClick: gebruikt om te bepalen welk hokje focus heeft. Zie opmerking in OnEditBoxesKeydown hoe dit opgelost wordt.
    • CMDialogKey: Ieder Hokje heeft nu een passende TabOrder, daardoor werkt Tab out of the box, en ook Shift-Tab werkt nu zoals het hoort.
    • FormDestroy: Hokjes worden nu gemaakt met het form als eigenaar, dus ze worden automatisch ook weer opgeruimd.
    • arHokjes: overbodig na de introductie van de functie GetHokjesValue



    Ik heb wat helper functies en properties toegevoegd:
    • RowColToIndex en IndexToRowCol: om Hokjes te kunnen benaderen vanuit Rij en Kolom waardes en vice versa
    • GetHokjesValue: geeft waarde in integer terug van de inhoud van een Hokje. Te benaderen via Rij + Kolom, of via Index. Deze gebruikt op alle plaatsen waar strtoint(hokje[x]) stond.
    • property HokjesValues, als voorbeeld hoe je via een property GetHokjesValue(ARow, AIndex) kunt lezen. Niet omdat het moet, maar omdat het kan.
    • properties RowLabels en ColLabels: hierin stop ik de labels die de rij en kolomtotalen weergeven, zodat ik ze in een loop kan benaderen.


    Ik heb diverse componenten een andere naam gegeven, o.a. de checkboxes en alle labels voor rij- en kolomtotalen.
    Ik heb vrijwel alle globale variabelen opgeruimd.
    Ik heb type definities gemaakt voor alle "niet standaard" types, om de leesbaarheid te vergroten.
    Ik heb geprobeerd om een consistente indentatie aan te houden.
    Ik heb constructies als "ïf SomeValue=True" vervangen door "if SomeValue"

    RijenTel en KolommenTel: compleet herschreven door gebruik te maken van de mogelijkheid om Hokjes te benaderen middels Rij en Kolom index en ook de bijbehorende labels als array te benaderen.
    Wissen: ervoor gezord dat de onchange van de edits niet worden uitgevoerd.
    OnEditBoxesKeydown: Als Ctrl, Alt of Shift is ingedrukt doe dan wat normaal is in een edit.

    Vragen:
    • Het is niet mogelijk om 10, 20, 30 etc. te typen in de hokjes: is dat de bedoeling?
    • procedure KaartTel: "Knip de verschillende Tekststrings in stukjes van 12", dat gaat denk ik niet helemaal zolas je wilt, maar ik weet niet precies wat de bedoeling is.
    • procedure KaartTel: "if (MC>0) and (MC<MaxW) then MC:=MC;" Die regel doet helemaal niets. Wat is precies de bedoeling?


    Suggesties:
    • Hernoem RijenLeeg en KolommenLeeg: de procedure wijzigt label.captions, maar maakt geen rijen/kolommen (hokjes) leeg
    • In de procedures voor Uitdelen zijn diverse indexen voor Hokjes[] "hardcoded". Je kunt overwegen om die te definieren aan de hand van ColCount en RowCount.


    Ik heb e.e.a. gedaan in Lazarus.
    Daartoe heb in o.a. wat code moeten uitzetten:
    • VistaAltFixUnit en bijbehorende code in FormCreate: die code moet je zelf weer toevoegen.
    • XPManifest: die heb ik van het form afgegooid, anders kon ik het form niet openen in Lazarus. Moet je handmatig er weer opzetten.


    Hoe maak je er weer een Delphi project van?
    • Maak eerst een backup van je originele code (forms en units).
    • Delete de oude kaartje.dfm en kaartje.pas bestanden (niet de backups deleten!!!)
    • Kopieer mijn versie van kaartje.pas en kaartje.lfm naar de folder van het project.
    • Hernoem Kaartje.lfm naar Kaartje.dfm
    • Kaartje.pas kan in principe zo blijven (mijn versie dus), alle code die specifiek is voor Lazarus wordt via compiler directives uitgezet onder Delphi.
    • Probeer het project te openen in Delphi
    • Drop je XPManifest weer op het form
    • Heractiveer in code de VistaAltBugFix (in FromCreate denk ik?)
    Attached Files Attached Files
    Last edited by Bart B; 28-Sep-21 at 14:07. Reason: typo

  14. #44
    Quote Originally Posted by Bart B View Post
    OK, ik heb me even uitgeleefd
    Wat heb ik allemaal gedaan:
    Ik heb een aantal dingen verwijderd omdat ze niet meer noodzakelijk zijn:

    Vragen:
    Het is niet mogelijk om 10, 20, 30 etc. te typen in de hokjes: is dat de bedoeling?
    procedure KaartTel: "Knip de verschillende Tekststrings in stukjes van 12", dat gaat denk ik niet helemaal zolas je wilt, maar ik weet niet precies wat de bedoeling is.
    procedure KaartTel: "if (MC>0) and (MC<MaxW) then MC:=MC;" Die regel doet helemaal niets. Wat is precies de bedoeling?
    1) Het is wel de bedoeling om 10, 20, 30 te kunnen typen - ik had de invoer van O 'per ongeluk' uitgezet.
    2) Eerst worden alle hokjes naar een Datatekststring omgezet en die moet het aantal regels worden zoals ze in de matrix staan. (Zie de list)
    3) Ik heb daar een elsif regel weggehaald geloof ik. Als MC > MAxW is moet er een andere tekststring komen (uit de Data die ik nog moet toevoegen).

    @ Bart - De Programma optimalisatie werkt na wat aanpassingen (behalve dat de bug er nog steeds inzit).
    Ik heb: [property HokjesValues[ARow, ACol: Integer]:Integer read GetHokjesValue;] van Published naar Private verhuisd anders werkte dat niet.
    En de Const NrEdits kan net zo goed 144 zijn i.p.v. 12x12; Ook stond ergens MW wat MaxW moest zijn.
    Vista dingen en XP weggelaten lijkt me nu wel eens verouderd.
    [// writeln('RijenTel: RowLabels[',ARow:2,'].Caption = ',Sum:2);] verwijderd want dat gaat fout.

    Ik kijk / vergelijk nog even verder. Bedankt alvast voor support!
    Last edited by Marieke; 28-Sep-21 at 18:33.

  15. #45
    Quote Originally Posted by Marieke View Post
    1) Het is wel de bedoeling om 10, 20, 30 te kunnen typen - ik had de invoer van O 'per ongeluk' uitgezet.
    Nou, dat lijkt me simpel op te lossen dan.
    Is het ook toegestaan dat de gebruiker "0" invult in een edit?
    Zo niet, dan wordt het weer wat lastiger.

    Quote Originally Posted by Marieke View Post
    3) Ik heb daar een elsif regel weggehaald geloof ik.
    Prima, maar niet noodzakelijk.
    Alles tussen {$ifdef fpc} en {$endif} wordt volkomen genegeerd door Delphi.

    Quote Originally Posted by Marieke View Post
    Ik heb: [property HokjesValues[ARow, ACol: Integer]:Integer read GetHokjesValue;] van Published naar Private verhuisd anders werkte dat niet.
    Hmm, wellicht kan je een dergelijke property niet "published" hebben (Lazarus klaagt daar niet over, maar ik zou ook niet weten hoe een dergerlijke property dan in de Object Inspector gezet zou moeten worden). Waarschijnlijk is verplaatsen naar "Public" voldoende. "Private" vind ik nou net weer wat overdreven, maar voor hoe het programma werkt maakt het natuurlijk niet uit.
    Mocht je dit form ooit vanuit een andere uinit (in een ander programma) gaan aanmaken en uitvoeren, dan maakt het natuurlijk wel uit waar al die properties en methods staan...



    Quote Originally Posted by Marieke View Post
    @ Bart - De Programma optimalisatie werkt na wat aanpassingen (behalve dat de bug er nog steeds inzit).
    Ik krijg die bug op geen enkele manier getriggerd hier.
    Niet met 32-bit en niet met 64-bit gecompileerde versie.
    In welke procedure dan?

    Zorg dat je alle checks aan hebt staan.
    Heb je nog meer veranderd aan mijn versie dan de property Hokjes verplaatsen naar "private"?

    Quote Originally Posted by Marieke View Post
    En de Const NrEdits kan net zo goed 144 zijn i.p.v. 12x12;
    Natuurlijk kan dat, maar RowCount en ColCount zijn de dimensies van de (viruele) 2-D array.
    Voor de compiler maakt het allemaal niet uit, die ziet ColCount*RowCount gewoon als een constante (=144), maar voor de lezer van de code is het direct duidelijk dat deze twee zaken (nrEdits en ColCount, RowCount) aan elkaar zijn gerelateerd.

    Quote Originally Posted by Marieke View Post
    Ook stond ergens MW wat MaxW moest zijn.
    Ik kan me niet herinneren dat ik dat veranderd heb.
    De tekenreeks "mw" (zonder quotes, al dan niet met hoofdletters, komt in mijn Kaartje.pas bestand niet voor.

    Quote Originally Posted by Marieke View Post
    [// writeln('RijenTel: RowLabels[',ARow:2,'].Caption = ',Sum:2);] verwijderd want dat gaat fout.
    Pardon?
    Dat is een uitgecommentarieerd stuk code.
    De compiler staat die tekst gewoon over en doet er helemaal niets mee.
    Wat gaat daar fout mee dan?
    Als je de // weghaalt, dan krijg je natuurlijk een foutmelding omdat er standaard geen console geopend is en je dus een IO Error krijgt op de writeln(). In mijn build opties in Lazarus zorg ik ervoor dat er wel een console is.
    In Delphi kun je dat regelen door {$apptype console} toe te voegen aan het begin van je .dpr bestand (als ik me dat goed herinner).
    Maar goed, dat zou allemaal niet nodig moeten zijn (zolang je de // niet weghaalt).

    Bart

Page 3 of 5 FirstFirst 1 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
  •