AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Verrückt...Func-Ergebnisse werden durch Komponenten falsch
Thema durchsuchen
Ansicht
Themen-Optionen

Verrückt...Func-Ergebnisse werden durch Komponenten falsch

Ein Thema von Codix32 · begonnen am 4. Nov 2009 · letzter Beitrag vom 5. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#1

Verrückt...Func-Ergebnisse werden durch Komponenten falsch

  Alt 4. Nov 2009, 15:26
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.
Miniaturansicht angehängter Grafiken
fehler_626.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 4. Nov 2009, 15:39
Solange du nichts von deinem Code zeigst, kann man sowieso nur spekulieren
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
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 4. Nov 2009, 15:45
Da wirst du wohl irgendwelche wilden Zeiger haben die ohne Komps zufälligerweise keinen Fehler verursachen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#4

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

  Alt 4. Nov 2009, 16:00
Zitat von leddl:
Solange du nichts von deinem Code zeigst, kann man sowieso nur spekulieren
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
Übrigens wird der Code schon in mehreren Proggis verwendet, mußte aber schon öfter ein Proggi vollkommen neu damit schreiben, bis er funzte.

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;
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

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

  Alt 4. Nov 2009, 16:19
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.
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#6

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

  Alt 4. Nov 2009, 16:44
Zitat von gammatester:
Nach der for-Schleife hat i keinen Wert (der Compiler sollte eigentliche gemeckert haben, und sowas sollte man ernstnehmen).
Warum? Nach der For Schleihe wird i doch gar nicht mehr benutzt? i dient doch nur als Index?
und der Compiler moniert da nichts.
Zitat von gammatester:
Außerdem könnte in inttostr(TagArray[High(TagArray)].werktag) der Index High(TagArray) nicht sinnvoll und/oder nicht belegt sein.
'High' gibt den höchsten Index des Arrays an und Label3 gibt mal ein Richtiges, beim einfügen einer Komponente ein falsches Ergebnis an.

Ich habe das auch so getestet:
Delphi-Quellcode:
end; //Ende For Schleife
Label3.Caption:='Der Monat hat '+inttostr(TagArray[High(TagArray)].werktag)+' Werktage';
end; //<- Ende Procedure
Und so:
Delphi-Quellcode:
Label3.Caption:='Der Monat hat '+inttostr(TagArray[i].werktag)+' Werktage';
end; //For
end; //Proc
Es bleibt der Fehler.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 4. Nov 2009, 16:52
Zitat von Codix32:
Zitat von gammatester:
Nach der for-Schleife hat i keinen Wert (der Compiler sollte eigentliche gemeckert haben, und sowas sollte man ernstnehmen).
Warum? Nach der For Schleihe wird i doch gar nicht mehr benutzt? i dient doch nur als Index?
und der Compiler moniert da nichts.
Da hat er Recht! Ist halt ein saumäßig formatierter Sourcecode. Ich plädiere dafür, den Fehler bis zu einer sauberen Formatierung drinzulassen
Uwe Raabe
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 4. Nov 2009, 16:59
einmal die formatierte Version.
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';
  end; //For
end;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 4. Nov 2009, 17:03
Haltepunkt setzen und schrittweise debugen...
Dann siehst Du doch, was berechnet wird
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#10

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

  Alt 4. Nov 2009, 17:10
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)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz