![]() |
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) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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 by Thomas Breitkreuz