[delphi] endless loop?!

Pagina: 1
Acties:

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
QOrdreg.First;
  While not QOrdReg.EoF do
    begin
    QOrdReg.Active := true;
    Onderdeelnummer := QOrdRegOnderdeelnr.Value;
    Aantal := QOrdRegAantal.Value;
    Stukprijs := QOrdRegStukprijs.Value;
    Bedrag := QOrdRegBedrag.Value;
    QOrdReg.Active := false;
    QOrdReg.Active := true;
    WriteLn(Factuur,IntToStr(Onderdeelnummer)+'              '+IntToStr(Aantal)+'       '+FloatToStr(Stukprijs)+'        '+FloatToStr(Bedrag));
    QOrdReg.Next;
    end;


query resulteert in 2 records, hij laat ze allebei zien maar de 2e over en over again wat er ongeveer zo uitziet:

Onderdeelnummer: Aantal: Stukprijs: Bedrag:
363 2 120 240
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500
922 1 500 500

enz enz enz... wat doe ik verkeerd? het is de bedoeling dat ie na de 2e ophoudt (maar dat hadden de meesten van jullie zelf al gedacht natuurlijk...;))

  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

IceSoftware schreef op 20 January 2003 @ 23:32:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
QOrdreg.First;
  While not QOrdReg.EoF do
    begin
*    QOrdReg.Active := true;
        Onderdeelnummer := QOrdRegOnderdeelnr.Value;
        Aantal := QOrdRegAantal.Value;
        Stukprijs := QOrdRegStukprijs.Value;
        Bedrag := QOrdRegBedrag.Value;
*    QOrdReg.Active := false;
*    QOrdReg.Active := true;
        WriteLn(...);
        QOrdReg.Next;
    end;
Is dat niet enigzins onlogisch op deze manier :?
Je zet die waarde QOrdReg op true, doet wat bewerkingen, zet de waarde op false en meteen weer op true. Die logica ontgaat mij even :)

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838


  • Paul
  • Registratie: September 2000
  • Laatst online: 19:38
IceSoftware schreef op 20 January 2003 @ 23:32:
[...]

query resulteert in 2 records, hij laat ze allebei zien maar de 2e over en over again wat er ongeveer zo uitziet:

[...]

enz enz enz... wat doe ik verkeerd? het is de bedoeling dat ie na de 2e ophoudt (maar dat hadden de meesten van jullie zelf al gedacht natuurlijk...;))
Als je er eerst alle Actives eens uitgooit. Niet een van je operaties behoeft een gesloten dataset, en misschien dat je cursor wel verschuift iedere keer dat je hem opent.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QOrdReg.Active := true;
QOrdreg.First;
while not QOrdReg.EoF do
  begin
    Onderdeelnummer := QOrdRegOnderdeelnr.Value;
    Aantal          := QOrdRegAantal.Value;
    Stukprijs       := QOrdRegStukprijs.Value;
    Bedrag          := QOrdRegBedrag.Value;
    WriteLn(Factuur, IntToStr(Onderdeelnummer) +
                     '              '          +
                     IntToStr(Aantal)          +
                     '       '                 +
                     FloatToStr(Stukprijs)     + 
                     '        '                +
                     FloatToStr(Bedrag));
    QOrdReg.Next;
  end;
QOrdReg.Active := false;


En hebben die Q-gevallen geen property AsString? De meeste DB-components wel nl.

[ Voor 8% gewijzigd door Paul op 20-01-2003 23:45 . Reden: Layout ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
dude ok, dat zijn al 10000 922-tjes minder.... maar nu is de output dit (ik heb
code:
1
2
 QOrdReg.Active := false;
    QOrdReg.Active := true;
weggehaalt)

Onderdeelnummer: Aantal: Stukprijs: Bedrag:
363 2 120 240
922 1 500 500
363 2 120 240
922 1 500 500

doet het alsnog dubbel op...

  • Paul
  • Registratie: September 2000
  • Laatst online: 19:38
IceSoftware schreef op 20 January 2003 @ 23:44:
dude ok, dat zijn al 10000 922-tjes minder.... maar nu is de output dit (ik heb
code:
1
2
 QOrdReg.Active := false;
    QOrdReg.Active := true;
weggehaalt)

Onderdeelnummer: Aantal: Stukprijs: Bedrag:
363 2 120 240
922 1 500 500
363 2 120 240
922 1 500 500

doet het alsnog dubbel op...
En blijft dat doorgaan of doet hij het maar 2x?

Je roept niet per ongeluk 2x die methode aan of zo?

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
neej die q-gevallen worden toegekend aan integers en reals dus het blijft .Value ipv .AsString

output nu:

--------------------------------------------

Onderdeelnummer: Aantal: Stukprijs: Bedrag:
363 2 120 240
922 1 500 500
363 2 120 240
922 1 500 500

-------------------------------------------- :)

[ Voor 64% gewijzigd door 0M3G4 op 20-01-2003 23:50 ]


  • Paul
  • Registratie: September 2000
  • Laatst online: 19:38
IceSoftware schreef op 20 januari 2003 @ 23:49:
neej die q-gevallen worden toegekend aan integers en reals dus het blijft .Value ipv .AsString

output nu:

--------------------------------------------

Onderdeelnummer: Aantal: Stukprijs: Bedrag:
363 2 120 240
922 1 500 500
363 2 120 240
922 1 500 500

-------------------------------------------- :)
Ja dat ze daaraan toegekend worden snap ik, maar als je meteen AsString gebruikt, dan heb je die hele variabelen niet nodig (wel makkelijk met debuggen) en zo te zien doe je er toch niets speciaals mee.

Misschien een stom idee, maar kijk eens met een tooltje rechtstreeks in je DB of je invoegmethode niet toevallig dubbel INSERT :P of debug je primaire key erbij in je output.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Zet eens een breakpoint op iedere regel en check je callstacks?

Professionele website nodig?


  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
WTF?!?! ok je mag me bij deze bombarderen tot deplhi-n00b 1e klas... wat zijn callstacks en wat zijn breakpoints? :)

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
de query klopt volgens mij wel (zonder deze functie pakte hij alleen de eerste record eruit) maar de code voor de output is als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
procedure TFOrderregel.BPrintClick(Sender: TObject);
Var
Adres : String;
Postcode : String;
Plaats : String;
Automerk : String;
Automodel : String;
Kenteken : String;
Onderdeelnummer : Integer;
Aantal : Integer;
Stukprijs : Real;
Bedrag : Real;
begin
QKlanten.Active := false;
QKlanten.ParamByName('Klantnr').Value := StrToInt(EKlantnr.Text);
QKlanten.Active := true;
QOrders.Active := false;
QOrders.ParamByName('Ordnr').Value := StrToInt(EOrdnr.Text);
QOrders.Active := true;
QOrdReg.Active := false;
QOrdReg.ParamByName('OrdRegnr').Value := StrToInt(EOrdnr.Text);
QOrdReg.Active := true;
Adres := QKlantenAdres.Value;
Postcode := QKlantenPostcode.Value;
Plaats := QKlantenPlaats.Value;
Automerk := QKlantenAutomerk.Value;
Automodel := QKlantenAutoModel.Value;
Kenteken := QKlantenKenteken.Value;
(*Onderdeelnummer := QOrdRegOnderdeelnr.Value;
Aantal := QOrdRegAantal.Value;
Stukprijs := QOrdRegStukprijs.Value;
Bedrag := QOrdRegBedrag.Value; *)
  AssignFile(Factuur, 'Factuur.txt');
  Rewrite(Factuur);
  WriteLn(Factuur,'Factuur Autogaragebedrijf Schasfoort Wierden');
  WriteLn(Factuur,'Datum: '+DateToStr(Date));
  WriteLn(Factuur,'');
  WriteLn(Factuur,'Klantnummer: '+EKlantnr.Text);
  WriteLn(Factuur,'Gegevens:');
  WriteLn(Factuur,ENaamPanel.Text);
  WriteLn(Factuur,Adres);
  WriteLn(Factuur,Postcode+' '+Plaats);
  WriteLn(Factuur,Automerk+' '+AutoModel);
  WriteLn(Factuur,Kenteken);
  WriteLn(Factuur,'');
  WriteLn(Factuur,'--------------------------------------------');
  WriteLn(Factuur,'');
  WriteLn(Factuur,'Ordernummer: '+EOrdnr.Text);
  WriteLn(Factuur,'Datum onderhoud: '+EDatum.Text);
  WriteLn(Factuur,'');
  WriteLn(Factuur,'--------------------------------------------');
  WriteLn(Factuur,'');
  WriteLn(Factuur,'Onderdeelnummer: '+'Aantal: '+'Stukprijs: '+'Bedrag: ');
QOrdreg.First;
while not QOrdReg.EoF do
  begin
    Onderdeelnummer := QOrdRegOnderdeelnr.Value;
    Aantal := QOrdRegAantal.Value;
    Stukprijs := QOrdRegStukprijs.Value;
    Bedrag := QOrdRegBedrag.Value;
    WriteLn(Factuur, IntToStr(Onderdeelnummer) +
                     '              ' +
                     IntToStr(Aantal) +
                     '       ' +
                     FloatToStr(Stukprijs) + 
                     '        ' +
                     FloatToStr(Bedrag));
    QOrdReg.Next;
  end;
QOrdReg.Active := false;
  WriteLn(Factuur,'');
  WriteLn(Factuur,'--------------------------------------------');
  WriteLn(Factuur,'');
  WriteLn(Factuur,'Totaalbedrag factuur:               '+ETotaalprijs.Text);
  CloseFile(Factuur);
end;

  • Paul
  • Registratie: September 2000
  • Laatst online: 19:38
IceSoftware schreef op 20 January 2003 @ 23:59:
WTF?!?! ok je mag me bij deze bombarderen tot deplhi-n00b 1e klas... wat zijn callstacks en wat zijn breakpoints? :)
Dat blijkt :)
Met breakpoints kun je debuggen. Je klikt met je muis in de kantlijn bij de regel waar je proggie moet stoppen, deze regel wordt dan (met de default kleureninstelling) rood, en er staat een rode punt in de kantlijn.

Als je nu runt, dan stopt je programma daar, en kun je, door met je muis te hoveren boven een variabele, kijken wat de waarde daarvan is. Ook kun je zo'n variabele als watch toevoegen (ergens in het menu, "add watch" en dan de naam van de variabele geven, @runtime zie je dan dynamisch wat de waarde ervan is.
Is je proggie eenmaal gestopt bij het breakpoint, dan kun je gaan steppen. Met F7 en F8 ga je 1 regel verder. Verschil tussen beiden is dat F7 functieaanroepen volgt, en F8 die regel uitvoert en dan weer terugkomt. Als je dus op een regel Foo(var) aanroept, zal F7 je regel voor regel door Foo heen laten lopen, terwijl F8 Foo(var) zal uitvoeren en het programma weer stopt op de regel na je aanroep.
Met F9 run je je programma weer.


Met je code is zo op het eerste gezicht niets mis.
Ik vind hem persoonlijk redelijk onoverzichtelijk, maar dat zal meer een puntje van stijl zijn :P
Wasigh (oud mod PW) heeft eens een hele mooie codestandaard gepost, was meen ik zelfs nog ooit sticky.
Even een paar puntjes voor de overzichtelijkheid:
• Witregels op het moment dat je iets anders gaat doen
• Alle := recht onder elkaar
• Maak gebruik van [*code=Delphi] ipv [*code]
maakt het al een stuk overzichtelijker:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
procedure TFOrderregel.BPrintClick(Sender: TObject);
var Adres, 
    Postcode, 
    Plaats, 
    Automerk, 
    Automodel, 
    Kenteken         : String;
    Onderdeelnummer,
    Aantal           : Integer;
    Stukprijs, 
    Bedrag           : Real;
begin
  QKlanten.Active                       := false;
  QOrders.Active                        := false;
  QOrdReg.Active                        := false;

  QKlanten.ParamByName('Klantnr').Value := StrToInt(EKlantnr.Text);
  QOrders.ParamByName('Ordnr').Value    := StrToInt(EOrdnr.Text);
  QOrdReg.ParamByName('OrdRegnr').Value := StrToInt(EOrdnr.Text);

  QKlanten.Active                       := true;
  QOrders.Active                        := true;
  QOrdReg.Active                        := true;

  Adres                                 := QKlantenAdres.Value;
  Postcode                              := QKlantenPostcode.Value;
  Plaats                                := QKlantenPlaats.Value;
  Automerk                              := QKlantenAutomerk.Value;
  Automodel                             := QKlantenAutoModel.Value;
  Kenteken                              := QKlantenKenteken.Value;


  AssignFile(Factuur, 'Factuur.txt');
  try
    Rewrite(Factuur);
    WriteLn(Factuur,'Factuur Autogaragebedrijf Schasfoort Wierden');
    WriteLn(Factuur,'Datum: '+DateToStr(Date));
    WriteLn(Factuur,'');
    WriteLn(Factuur,'Klantnummer: '+EKlantnr.Text);
    WriteLn(Factuur,'Gegevens:');
    WriteLn(Factuur,ENaamPanel.Text);
    WriteLn(Factuur,Adres);
    WriteLn(Factuur,Postcode+' '+Plaats);
    WriteLn(Factuur,Automerk+' '+AutoModel);
    WriteLn(Factuur,Kenteken);
    WriteLn(Factuur,'');
    WriteLn(Factuur,'--------------------------------------------');
    WriteLn(Factuur,'');
    WriteLn(Factuur,'Ordernummer: '+EOrdnr.Text);
    WriteLn(Factuur,'Datum onderhoud: '+EDatum.Text);
    WriteLn(Factuur,'');
    WriteLn(Factuur,'--------------------------------------------');
    WriteLn(Factuur,'');
    WriteLn(Factuur,'Onderdeelnummer: '+'Aantal: '+'Stukprijs: '+'Bedrag: ');

    QOrdreg.First;
    while not QOrdReg.EoF do
      begin
        Onderdeelnummer := QOrdRegOnderdeelnr.Value;
        Aantal          := QOrdRegAantal.Value;
        Stukprijs       := QOrdRegStukprijs.Value;
        Bedrag          := QOrdRegBedrag.Value;
        WriteLn(Factuur, IntToStr(Onderdeelnummer) +
                         '              ' +
                         IntToStr(Aantal) +
                         '       ' +
                         FloatToStr(Stukprijs) + 
                         '        ' +
                         FloatToStr(Bedrag));
        QOrdReg.Next;
      end;

    WriteLn(Factuur,'');
    WriteLn(Factuur,'--------------------------------------------');
    WriteLn(Factuur,'');
    WriteLn(Factuur,'Totaalbedrag factuur:               '+ETotaalprijs.Text);
  finally
    CloseFile(Factuur);
  end;

  QOrdReg.Active := false;
end;


Misschien mierens*x, maar als je het over een half jaar of een jaar weer onder ogen krijgt dan zul je door nu een klein beetje extra moeite te nemen, dan een hoop tijd besparen.

Oh ja, en een try..finally erbij :) ALS hij er ergens uitklapt (al zie ik zo geen spannende dingen) dan hou je op je oude manier een niet gesloten file over, en dan gaat Scandisk weer zeuren en zo :P

Maar hij kan er nu bijvoorbeeld ook uitklappen bij de ParamByName-regels, of specifieker, bij StrToInt. Je gaat er klakkeloos vanuit dat de gebruiker ook echt een getal invult. Vul maar eens "Bla" oid in bij EKlantnr: *BAM* exception :) Maar goed, daar ging dit topic niet over :P

[ Voor 64% gewijzigd door Paul op 21-01-2003 00:27 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
ok ik heb ff met die F7 en F8 gewerkt, na 3x loop ziet ie er zo uit:

--------------------------------------------

Onderdeelnummer: Aantal: Stukprijs: Bedrag:
363 2 1

na 4x loop zo:
--------------------------------------------

Onderdeelnummer: Aantal: Stukprijs: Bedrag:
363 2 120 240
922 1 500 500
363 2 120 240
922 1 500

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
ok harstikke bedankt! _/-\o_ ik klooi morgen nog wel wat verder... lukt denk ik wel...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:42
[nohtml]
Paul Nieuwkamp schreef op 21 January 2003 @ 00:05:
Wasigh (oud mod PW) heeft eens een hele mooie codestandaard gepost, was meen ik zelfs nog ooit sticky.
Miereneukerij, maar goed. ;)
Die guidelines zijn gemaakt door bijdragen van meerdere P&W 'ers en is terug te vinden in de P&W FAQ.

https://fgheysels.github.io/


  • Paul
  • Registratie: September 2000
  • Laatst online: 19:38
whoami schreef op 21 January 2003 @ 08:08:
[nohtml]
[...]

Miereneukerij, maar goed. ;)
Die guidelines zijn gemaakt door bijdragen van meerdere P&W 'ers en is terug te vinden in de P&W FAQ.
Gna gna :P wasigh in "Welkom in P&W (FAQ-21/2/2002)"
Hij heeft hem wel gepost :P (ff Hans ophemelen 8)7) Overigens wel een grote _/-\o_ voor die faq :)

Maaruh IceSoftware, ik heb NOG maar een keer je code bekeken (tja je moet iets :P ;) :+ ) maar ik begin toch echt te denken dat het dubbel in je DB staat. Kijk eens met een of ander tooltje rechtstreeks in je db (desnoods een TDBGrid en een TTable oid).

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 22:48
als je voor delphi meteen goed wilt doen:

http://community.borland.com/article/0,1410,10280,00.html

Dit is de guideline die borland ongeveer aanhoudt voor delphi.
Pagina: 1