![]() |
Verrückt...Func-Ergebnisse werden durch Komponenten falsch
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, da nerve ich mal wieder...
Mein Proggi errechnet die Arbeitstage des aktuellen Monats. Nun ziehe ich irgnedeine Komponente auf das Formular und compiliere. Jetzt hat der Monat plötzlich 136 Arbeitstage... Lösche ich die Komponente wieder, stimmt die Anzahl der Arbeitstage wieder. Was könnte denn das sein? Sowas habe ich noch nie erlebt. |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Solange du nichts von deinem Code zeigst, kann man sowieso nur spekulieren :zwinker:
Kann mir zwar nicht vorstellen, inwiefern der Button diese Berechnung beeinflussen sollte, aber offensichtlich passiert dabei ja irgendetwas. Wäre also von Vorteil wenn du das mal zeigen könntest ;) |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Da wirst du wohl irgendwelche wilden Zeiger haben die ohne Komps zufälligerweise keinen Fehler verursachen.
|
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Zitat:
Hier mal der Code:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Run(Now); end; //------------------------------------------------------------------------------------------------ procedure TForm1.Run(Datum:TDateTime); var i,idx: Word; tg:integer; begin //<-proc tg:=TageinMonat(datum); //<- Unit 'eigene Datumsroutinen.pas' Form1.Caption:=NamendesMonats(Now)+' '+inttostr(CurrentYear); Label1.Caption:=' Der Monat hat '+inttostr(tg)+' Tage'; idx:=0; FTArray:=GetHolidayTable(YearOf(Datum)); //<-- Unit 'Unit_Holidays.pas' 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:= ''; if LblFeiertag(i+1,monthOf(Datum),FTArray)<>'' then //FTArray enthält Feiertage begin TagArray[i].TgName:=LblFeiertag(i+1,monthOf(Datum),FTArray); //Feiertagsname, falls einer ist TagArray[i].Werktag:=Tagarray[i-1].Werktag + 0; //Feiertag ist kein Werktag end else begin TagArray[i].TgName:=NamendesTages(ArrIdxalsTagDatum(idx,MonthOf(Datum),YearOf(Datum))); {Hier werden die Arbeitstage berechnet und falsch berechnet, wenn Komponente aufs Form kommt} TagArray[i].Werktag:=Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte) end; //<-else { if (TagArray[i].TgName <> 'Samstag') and (TagArray[i].TgName <> 'Sonntag') then begin TagArray[i].abwBegin:= '18:00'; TagArray[i].abwEnde:= '20:00'; end; if (TagArray[i].TgName = 'Freitag') then begin TagArray[i].abwBegin:= '18:00'; TagArray[i].abwEnde:= '21:00'; end;} TagArray[i].LBH:= StdLohnmalMinuten(8.15, 132)*TagArray[i].Werktag; //132min/Tag = (4*2Std + 1*3Std/Woche) Label2.caption:= 'Im '+NamendesMonats(Now)+ ' ist der Monatsverdienst '+FloattostrF(TagArray[i].LBH,ffcurrency,5,2); Label3.Caption:='Der Monat hat '+inttostr(TagArray[High(TagArray)].werktag)+' Werktage'; //Listbox1.Items.Add(inttostr(TagArray[i].TNum)+' '+TagArray[i].TgName+' '+TagArray[i].abwBegin+' '+TagArray[i].abwEnde); end; //For end; |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Nach der for-Schleife hat i keinen Wert (der Compiler sollte eigentliche gemeckert haben, und sowas sollte man ernstnehmen). Außerdem könnte in inttostr(TagArray[High(TagArray)].werktag) der Index High(TagArray) nicht sinnvoll und/oder nicht belegt sein.
|
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Zitat:
und der Compiler moniert da nichts. Zitat:
Ich habe das auch so getestet:
Delphi-Quellcode:
Und so:
end; //Ende For Schleife
Label3.Caption:='Der Monat hat '+inttostr(TagArray[High(TagArray)].werktag)+' Werktage'; end; //<- Ende Procedure
Delphi-Quellcode:
Es bleibt der Fehler.
Label3.Caption:='Der Monat hat '+inttostr(TagArray[i].werktag)+' Werktage';
end; //For end; //Proc |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Zitat:
|
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
einmal die formatierte Version.
Delphi-Quellcode:
Grüße
procedure TForm1.FormCreate(Sender: TObject);
begin Run(Now); end; //------------------------------------------------------------------------------------------------ procedure TForm1.Run(Datum:TDateTime); var i,idx: Word; tg:integer; begin //<-proc tg:=TageinMonat(datum); //<- Unit 'eigene Datumsroutinen.pas' Form1.Caption:=NamendesMonats(Now)+' '+inttostr(CurrentYear); Label1.Caption:=' Der Monat hat '+inttostr(tg)+' Tage'; idx:=0; FTArray:=GetHolidayTable(YearOf(Datum)); //<-- Unit 'Unit_Holidays.pas' 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:= ''; if LblFeiertag(i+1,monthOf(Datum),FTArray)<>'' then //FTArray enthält Feiertage begin TagArray[i].TgName:=LblFeiertag(i+1,monthOf(Datum),FTArray); //Feiertagsname, falls einer ist TagArray[i].Werktag:=Tagarray[i-1].Werktag + 0; //Feiertag ist kein Werktag end else begin TagArray[i].TgName:=NamendesTages(ArrIdxalsTagDatum(idx,MonthOf(Datum),YearOf(Datum))); {Hier werden die Arbeitstage berechnet und falsch berechnet, wenn Komponente aufs Form kommt} TagArray[i].Werktag:=Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte) end; //<-else { if (TagArray[i].TgName <> 'Samstag') and (TagArray[i].TgName <> 'Sonntag') then begin TagArray[i].abwBegin:= '18:00'; TagArray[i].abwEnde:= '20:00'; end; if (TagArray[i].TgName = 'Freitag') then begin TagArray[i].abwBegin:= '18:00'; TagArray[i].abwEnde:= '21:00'; end;} TagArray[i].LBH:= StdLohnmalMinuten(8.15, 132)*TagArray[i].Werktag; //132min/Tag = (4*2Std + 1*3Std/Woche) Label2.caption:= 'Im '+NamendesMonats(Now)+ ' ist der Monatsverdienst '+FloattostrF(TagArray[i].LBH,ffcurrency,5,2); Label3.Caption:='Der Monat hat '+inttostr(TagArray[High(TagArray)].werktag)+' Werktage'; end; //For end; Klaus |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Haltepunkt setzen und schrittweise debugen...
Dann siehst Du doch, was berechnet wird ;-) |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Oh ja, danke Klaus und Uwe.
Normalerweise rücke ich den Code so ein. Sieht jetzt schon besser aus, ist aber trotzdem irgendwie 'Spaghetti'. Ich habe jetzt mal die Procedure nicht im Formcreate sondern erst nach der Erstellung des Formulars in einem ButtonClick aufgerufen. Aber auch hier bleibt der Fehler. Ich raffs nicht. Hier mal der Typ und das Array im Kopf der FormUnit:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DateUtils, Unit_Holidays, StdCtrls; type TTag = packed record TNum :Byte; //<-Nummer des Tages abwBegin :String[5]; //<-Abweichung - Beginn abwEnde :string[5]; //<-Abweichung - Ende abwZeit :string[3]; //<-Arbeitszeit in Minuten/Tag AStdFaktor:real; //<-Arbeitsstunden aus Abweichung TgName :string[18]; //<-Name des Tages Werktag : byte; //<-Der wievielte Werktag im Monat LohnpTag :real; //<-Der Lohn für den aktuellen Tag LbH :real; //<-Der Lohn der letzten Tage bis heute end; type TTagArray = array of TTag; ... ... implementation uses Berechnung, eigeneDatumsroutinen; {$R *.dfm} var Tagarray:TTagarray; FTArray:THolidayTable; //<- enthält 13 Feiertage(GetholidayTable) |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Schau mal auf diese Zeile:
Delphi-Quellcode:
Für i = 0 greifst du knapp vor das Array! Range-Check einschalten, bitte!
TagArray[i].Werktag:=Tagarray[i-1].Werktag + Weekend(TagArray,i); // Zählt die Werktage (var Byte)
|
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Zitat:
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? |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Zitat:
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) |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Zitat:
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; |
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:
Lösung2:
var
SumWerktag: Integer; begin SumWerktag:= 0; for Tag[i].Werktag:= SumWerktag+ XXX SumWerktag:= Tag[i].Werktag // für den nächsten Tag 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 |
Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
Zitat:
werde ich mal ausprobieren. Das macht meinen SpaghettiCode übersichtlicher ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:11 Uhr. |
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