Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verrückt...Func-Ergebnisse werden durch Komponenten falsch (https://www.delphipraxis.net/142829-verrueckt-func-ergebnisse-werden-durch-komponenten-falsch.html)

Uwe Raabe 4. Nov 2009 16:15

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
Schau mal auf diese Zeile:

Delphi-Quellcode:
TagArray[i].Werktag:=Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte)
Für i = 0 greifst du knapp vor das Array! Range-Check einschalten, bitte!

Codix32 4. Nov 2009 16:37

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
Zitat:

Zitat von Uwe Raabe
Schau mal auf diese Zeile:

Delphi-Quellcode:
TagArray[i].Werktag:=Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte)
Für i = 0 greifst du knapp vor das Array! Range-Check einschalten, bitte!

Ja, hm, ich kriege es nicht anders hin, Uwe. Dabei ist 'i' sogar eine Variable vom Typ Word und die geht doch eigentlich von 0 bis +... aber nicht, wie bei Integer -3-2-1 0 1 2 3.
Aber auch wenn ich 'i' als Integervariable declariere, ist der Fehler da.

Achja, da ist ja noch 'setlength(TagArray,tg)'

Was meinst Du mit Range-Check?

Uwe Raabe 4. Nov 2009 16:47

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
Zitat:

Zitat von Codix32
Zitat:

Zitat von Uwe Raabe
Schau mal auf diese Zeile:

Delphi-Quellcode:
TagArray[i].Werktag:=Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte)
Für i = 0 greifst du knapp vor das Array! Range-Check einschalten, bitte!

Ja, hm, ich kriege es nicht anders hin, Uwe. Dabei ist 'i' sogar eine Variable vom Typ Word und die geht doch eigentlich von 0 bis +... aber nicht, wie bei Integer -3-2-1 0 1 2 3.
Aber auch wenn ich 'i' als Integervariable declariere, ist der Fehler da.

Das hat mit dem Typ von i gar nichts zu tun. Tagarray[i-1] liefert für i=0 halt irgendetwas unbrauchbares, da es Tagarray[-1] gar nicht gibt. Ein eingeschalteter Range-Check (siehe Compiler Optionen) hätte dir das gleich gesagt.

Lösung:

Delphi-Quellcode:
if I = 0 then
  TagArray[i].Werktag := Weekend(TagArray,i)
else
  TagArray[i].Werktag := Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte)

Codix32 5. Nov 2009 12:41

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
Zitat:

Zitat von Uwe Raabe
Zitat:

Zitat von Codix32
Zitat:

Zitat von Uwe Raabe
Schau mal auf diese Zeile:

Delphi-Quellcode:
TagArray[i].Werktag:=Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte)
Für i = 0 greifst du knapp vor das Array! Range-Check einschalten, bitte!

Ja, hm, ich kriege es nicht anders hin, Uwe. Dabei ist 'i' sogar eine Variable vom Typ Word und die geht doch eigentlich von 0 bis +... aber nicht, wie bei Integer -3-2-1 0 1 2 3.
Aber auch wenn ich 'i' als Integervariable declariere, ist der Fehler da.

Das hat mit dem Typ von i gar nichts zu tun. Tagarray[i-1] liefert für i=0 halt irgendetwas unbrauchbares, da es Tagarray[-1] gar nicht gibt. Ein eingeschalteter Range-Check (siehe Compiler Optionen) hätte dir das gleich gesagt.

Lösung:

Delphi-Quellcode:
if I = 0 then
  TagArray[i].Werktag := Weekend(TagArray,i)
else
  TagArray[i].Werktag := Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte)

Danke Dir Uwe,

habe schon früher mal bemerkt, daß bestimmte Variablen, die nicht auf null gesetzt wurden, merkwürdige Werte ausgegeben haben.
Ich habe das Dingens hier so gelöst:
Delphi-Quellcode:
procedure TForm1.Run(Datum:TDateTime);
var
 i,idx: byte;
 tg:integer;
begin    //<-proc
 tg:=TageinMonat(datum);
 Form1.Caption:=NamendesMonats(Now)+' '+inttostr(CurrentYear);
 Label1.Caption:=' Der Monat hat '+inttostr(tg)+' Tage';
 idx:=0;
 FTArray:=GetHolidayTable(YearOf(Datum));
 setlength(TagArray,tg);
  for i:= 0 to tg-1 do
   begin   //<-for
    inc(idx);
    TagArray[i].TNum:=i+1;
    TagArray[i].abwBegin:= '';
    TagArray[i].abwEnde:= '';
    TagArray[0].Werktag:= 0;    //<- Für mich immer noch unlogisch, da '0' größer ist als '-1'
                                 //<- aber jetzt funktioniert jetzt
    if LblFeiertag(i+1,monthOf(Datum),FTArray)<>'' then...
...
...
end;

hoika 5. Nov 2009 12:55

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
Hallo,

dein

Tag[i].Werktag:= Tag[i-1].Werktag+ XXX

ist ja das Grundproblem.
Klappt immer, bis auf i=0 ;)


Lösung 1:
eigene Summenvariable nehmen

Delphi-Quellcode:
var
  SumWerktag: Integer;
begin
  SumWerktag:= 0;

  for
    Tag[i].Werktag:= SumWerktag+ XXX

    SumWerktag:= Tag[i].Werktag // für den nächsten Tag
Lösung2:
Direkt ein Tag-Record als Zwischensummen-Halter.
Dann muss nicht für WerkTag, Feiertag usw. ja eine Variable benutzt werden.


Beides hat den Vorteil,
dass man das auch besser Debuggen kann.

Und da fällt mir dann auch noch bei
SumWerktag+Weekend(TagArray,i); //

Den Aufruf in eine lokale Variable, auch besser zu Debuggen.



Heiko

Codix32 5. Nov 2009 13:10

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
Zitat:

Zitat von hoika
Hallo,

dein

Tag[i].Werktag:= Tag[i-1].Werktag+ XXX

ist ja das Grundproblem.
Klappt immer, bis auf i=0 ;)


Lösung 1:
eigene Summenvariable nehmen

Delphi-Quellcode:
var
  SumWerktag: Integer;
begin
  SumWerktag:= 0;

  for
    Tag[i].Werktag:= SumWerktag+ XXX

    SumWerktag:= Tag[i].Werktag // für den nächsten Tag
Lösung2:
Direkt ein Tag-Record als Zwischensummen-Halter.
Dann muss nicht für WerkTag, Feiertag usw. ja eine Variable benutzt werden.


Beides hat den Vorteil,
dass man das auch besser Debuggen kann.

Und da fällt mir dann auch noch bei
SumWerktag+Weekend(TagArray,i); //

Den Aufruf in eine lokale Variable, auch besser zu Debuggen.



Heiko

Danke Heiko,
werde ich mal ausprobieren. Das macht meinen SpaghettiCode übersichtlicher ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz