Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einfaches Addieren klapt nicht! (https://www.delphipraxis.net/76040-einfaches-addieren-klapt-nicht.html)

litsa 29. Aug 2006 09:17


Einfaches Addieren klapt nicht!
 
Sorry für den langen code aber kann mir bitte jemand sagen wo hier der Fehler is?! Und zwar wird die Summe nicht richtig ausgegeben (s. Kommentar):
Delphi-Quellcode:
procedure TDFSMain.Button5Click(Sender: TObject);
var
  shcount, i, edtop: integer;
  dirs: array[0..20] of string;
  Total: cardinal;
begin
  try
    Label5.Show;
    for i := 0 to 20 do
    begin
      if TEdit(Findcomponent('T' + IntToStr(i))) <> nil then
        TEdit(Findcomponent('T' + IntToStr(i))).Destroy;
      if TEdit(Findcomponent('p' + IntToStr(i))) <> nil then
        TEdit(Findcomponent('P' + IntToStr(i))).Destroy;
      if TEdit(Findcomponent('s' + IntToStr(i))) <> nil then
        TEdit(Findcomponent('S' + IntToStr(i))).Destroy;
    end;
    if TEdit(Findcomponent('sum')) <> nil then
      TEdit(Findcomponent('sum')).Destroy;
  finally
    //ProgressBar1.Position := 0;
    //ProgressBar1.Update;
    Total    := 0;
    Totalsize := 0;
    shcount  := grFS.RowCount;
    edtop    := 40;
    for i := 0 to shcount - 1 do
    begin
      with TEdit.Create(self) do
      begin
        Name  := 'T' + IntToStr(i);
        parent := FSPC6;
        Left  := 8;
        Top   := edtop + 32;
        edtop := Top;
        Width := 121;
        Clear;
        Show;
        ReadOnly := True;
        Font.Color := clBlue;
        Text := grFS.Cells[0, i];
      end;
    end;
    edtop := 40;
    for i := 0 to shcount - 1 do
    begin
      with TEdit.Create(self) do
      begin
        Name  := 'P' + IntToStr(i);
        parent := FSPC6;
        Left  := 136;
        Top   := edtop + 32;
        edtop := Top;
        Width := 513;
        Clear;
        Show;
        ReadOnly := True;
        Font.Color := clGreen;
        Text   := grFS.Cells[1, i];
        dirs[i] := Text;
      end;
    end;
    edtop := 40;
    for i := 0 to shcount - 1 do
    begin
      with TEdit.Create(self) do
      begin
        Name    := 'S' + IntToStr(i);
        totalsize := 0;
        parent  := FSPC6;
        Left    := 656;
        Top     := edtop + 32;
        edtop   := Top;
        Width   := 121;
        ReadOnly := True;
        Clear;
        Show;
        try
          find(dirs[i]); //hier werden die ordnergrössen richtig ermittelt(gecheckt)..
          Text := FormatBytes(totalsize); //..und richtig ausgegeben
          Total := Total + Totalsize; //lediglich die Summe ist hier falsch!
        finally
        end;
      end;
    end;
    Label6.Top    := edtop + 36;
    Label6.Left   := 572;
    Label6.Visible := True;
    with TEdit.Create(self) do
    begin
      Name    := 'sum';
      parent  := FSPC6;
      Left    := 656;
      Top     := edtop + 32;
      edtop   := Top;
      Width   := 121;
      ReadOnly := True;
      Font.Color := clRed;
      Clear;
      Show;
      Text := FormatBytes(total);
    end;
    //ProgressBar1.Position := 100;
    Label5.Hide;
  end;
end;
Danke
Evangelia

JasonDX 29. Aug 2006 09:23

Re: Einfaches Addieren klapt nicht!
 
Die Variable Total ist lokal, und nach der Zuweisung (Addition) wird nicht mehr darauf zugegriffen, also wird diese Anweisung vom Compiler wegoptimiert.
Abhaengig von deiner DelphiVersion (ab 7 isses sicher drinnen, vorher weiss ichs nich) siehst du links vom Code kleine blaue Punkte. Diese Punkte zeigen dir, ob diese Zeile Code miteinkompiliert wurde oder nicht.
Dem Wegoptimieren entgegenwirken kannst du, in dem du a) im weiteren Ablauf der Prozedur nochmal (lesend) darauf zugreifst, oder b) die Flags {$O+/-} verwendest, naeheres dazu findest du in der OH unter F1.

d'oh, ich hab das Text := FormatBytes(total); uebersehn :oops: Sry, das wars dann doch nicht

greetz
Mike

RavenIV 29. Aug 2006 09:26

Re: Einfaches Addieren klapt nicht!
 
ich sehe nirgends, wo Total oder Totalsize berechnet werden, sie werden nur auf 0 gesetzt.
Oder muss ich erst noch einen Kaffee trinken gehen, damit ich das finde?

Daniel B 29. Aug 2006 09:34

Re: Einfaches Addieren klapt nicht!
 
Delphi-Quellcode:
        try
          find(dirs[i]); //hier werden die ordnergrössen richtig ermittelt(gecheckt)..
          Text := FormatBytes(totalsize); //..und richtig ausgegeben
          Total := Total + Totalsize; //lediglich die Summe ist hier falsch! 
        finally
        end;
Steht im Beitrag drin, da wo ein Kommentar ist...

litsa 29. Aug 2006 09:39

Re: Einfaches Addieren klapt nicht!
 
Liste der Anhänge anzeigen (Anzahl: 1)
ja und totalsize wird ja auch jedesmal korrekt ermittelt!
hier mal ein screenshot wobei die 2 ordner wirklich so groß sind nur die summe ist absurd!

Jelly 29. Aug 2006 09:43

Re: Einfaches Addieren klapt nicht!
 
Zitat:

Zitat von litsa
ja und totalsize wird ja auch jedesmal korrekt ermittelt!

Dann brauch ich auch noch einen Kaffee... Ich les immer nur
Delphi-Quellcode:
TotalSize := 0 ;
Und dann zum Schluss
Delphi-Quellcode:
Total := Total + TotalSize ;
Null bleibt Null.

Oder hast Du uns Code vorenthalten :gruebel:

litsa 29. Aug 2006 09:46

Re: Einfaches Addieren klapt nicht!
 
Delphi-Quellcode:
procedure Find(Str: string);
var
  MySearch: TSearchRec;
  FindResult: Integer;
  begin
  FindResult:=FindFirst(Str+'\*.*', faAnyFile, MySearch);
  while FindResult=0 do
  begin
    if ((MySearch.Attr and faDirectory) = faDirectory) and
       (MySearch.Name<>'.') and
       (MySearch.Name<>'..') then
      Find(Str + '\' + MySearch.Name)
    else
      TotalSize:=TotalSize+MySearch.Size;
    FindResult:=FindNext(MySearch);
  end;
  SysUtils.FindClose(MySearch);
end;
...wie gesagt totalsize gibt schon die richtigen werte aus!

Daniel B 29. Aug 2006 09:50

Re: Einfaches Addieren klapt nicht!
 
Mal debuggt um rauszufinden wo die 10MB herkommen?

JasonDX 29. Aug 2006 09:50

Re: Einfaches Addieren klapt nicht!
 
Du kriegst einen Overflow. Ein Cardinal ist ein Unsigned-32Bit-int. D.h. sein Zahlenbereich geht von 0 bis 4294967295. Wenn du deine 2 Zahlen addierst, merkst du, dass du knapp darueber hinausschiesst.
Was man dagegen tun kann: Total als Int64 deklarieren, dessen Zahlenbereich sollte vorerst mal reichen ;)

greetz
Mike

PS: Ich geh mal davon aus, dass das nicht der gesamte Code is. Ansonsten isses ziemlich raetselhaft, wie 10.27 MB ins Editfeld kommen :zwinker:

Christian Seehase 29. Aug 2006 09:56

Re: Einfaches Addieren klapt nicht!
 
Moin litsa,

und um die Ausführungen von Mike zu komplettieren:
In den Projektoptionen kannst Du auf dem Tab "Compiler" unter "Laufzeit-Fehler" die Option für die Prüfung eines Integer-Überlaufes aktivieren. Wenn Du das während der Testphase machst sorgen solche Fehler für eine Fehlermeldung.
Nicht vergessen, das später wieder rauszunehmen, da die Prüfungen das Programm sonst grösser und langsamer machen.

litsa 29. Aug 2006 10:05

Re: Einfaches Addieren klapt nicht!
 
Zitat:

PS: Ich geh mal davon aus, dass das nicht der gesamte Code is. Ansonsten isses ziemlich raetselhaft, wie 10.27 MB ins Editfeld kommen
Habe noch ein editfeld zum check nachträglich eingefügt um euch ein screenshot zu machen und gleich wieder gelöscht..

Zitat:

Was man dagegen tun kann: Total als Int64 deklarieren, dessen Zahlenbereich sollte vorerst mal reichen
Total wird jetz richtig ermittelt...Danke :)

Nun hab aber ich ein Problem beim FormatBytes wenn Total: int64; (und genauso wenn Totalsize: int64;):
Delphi-Quellcode:
function FormatBytes(const Bytes : cardinal):string;
begin
  if Bytes < 1024 then
  begin
    Result := Format('%s', [IntToStr(Bytes)]) + ' B';
    Exit;
  end;
  if (Bytes >= 1024) and (Bytes < (1024 * 1024)) then
  begin
    Result := Format('%n', [Bytes / 1024]) + ' KB';
    Exit;
  end;
  if (Bytes >= (1024*1024)) and (Bytes < (1024 * 1024 * 1024)) then
  begin
    Result := Format('%n', [Bytes / (1024 * 1024)]) + ' MB';
    Exit;
  end;
  if Bytes >= (1024*1024*1024) then
  begin
    Result := Format('%n', [Bytes / (1024 * 1024 * 1024)]) + ' GB';
    Exit;
  end;
end;
Formatbytes(Total) ergibt immer noch 10,27MB (obwohl wie gesagt Total ohne format richtig is). Wie komm ich jetzt da raus?!

Christian Seehase 29. Aug 2006 10:08

Re: Einfaches Addieren klapt nicht!
 
Moin litsa,

Code:
function FormatBytes(const Bytes : [b][color=red]cardinal[/color][/b]):string;
wenn schon, dann auch überall ändern ;-)

litsa 29. Aug 2006 10:14

Re: Einfaches Addieren klapt nicht!
 
Zitat:

In den Projektoptionen kannst Du auf dem Tab "Compiler" unter "Laufzeit-Fehler" die Option für die Prüfung eines Integer-Überlaufes aktivieren. Wenn Du das während der Testphase machst sorgen solche Fehler für eine Fehlermeldung.
Nicht vergessen, das später wieder rauszunehmen, da die Prüfungen das Programm sonst grösser und langsamer machen.
werd ich machen ...danke!
Zitat:

wenn schon, dann auch überall ändern
..und ich hatte schon meinen 3. Kaffe heute!

Supi kann jetzt sagen bin ein glückliches Mädel da dies auch gelöst wurde!!

Ich danke euch allen :)

Gruß
Evangelia


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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