Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

Codix32 4. Nov 2009 14:26


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.

leddl 4. Nov 2009 14:39

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 ;)

Bernhard Geyer 4. Nov 2009 14:45

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.

Codix32 4. Nov 2009 15:00

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

Zitat von leddl
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 ;)

Ü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;

gammatester 4. Nov 2009 15:19

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.

Codix32 4. Nov 2009 15:44

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

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:

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.

Uwe Raabe 4. Nov 2009 15:52

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

Zitat von Codix32
Zitat:

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 :wink:

Klaus01 4. Nov 2009 15:59

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
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

stahli 4. Nov 2009 16:03

Re: Verrückt...Func-Ergebnisse werden durch Komponenten fals
 
Haltepunkt setzen und schrittweise debugen...
Dann siehst Du doch, was berechnet wird ;-)

Codix32 4. Nov 2009 16:10

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 23:35 Uhr.
Seite 1 von 2  1 2      

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