Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Stringgrid Plus Minus Vergleich (https://www.delphipraxis.net/161269-stringgrid-plus-minus-vergleich.html)

himitsu 25. Jun 2011 17:10

AW: Stringgrid Plus Minus Vergleich
 
Zum Glück oder blöder Weise, paßt sich die interne StringList des StringGrids automatisch an und vergrößert sich (auch wenn in der Anzeige nicht mehr Zeilen/Spalten angezeigt werden)

Beim StringGrid gibt es eine Trennung zwischen GUI und Daten :angle:

fl63 25. Jun 2011 17:16

AW: Stringgrid Plus Minus Vergleich
 
Zitat:

Zitat von alfold (Beitrag 1108273)
Allerdings hätt es hier
Delphi-Quellcode:
JvSG1.Cells[9,i+1]
knallen müssen! Weil Du auf eine Zeile zugreifst die nicht da ist!?

Seeehr mergwürdig:shock:

Gruss alfold

Bei JvSG1.Cells[9,i+1] knallt nichts. Die Spalte wird bis RowCount-1 ausgefüllt. Damit es bei der Summierung der Spalte 9 nichts passiert, hatte ich das ganze in eine zweite Prozedur ausgelagert (was ja offenbar nicht funktioniert).
Delphi-Quellcode:
      Summe := Summe + StrToInt(JvSG1.Cells[9,i]);
      JvSG1.Cells[10,i] := IntToStr(Summe);
Hier muß der Fehler sein. Und das begreife ich nicht. Er beendet die Summierung bei der vorletzten Zeile.

Gruß FL63

mkinzler 25. Jun 2011 17:30

AW: Stringgrid Plus Minus Vergleich
 
Zitat:

Bei JvSG1.Cells[9,i+1] knallt nichts. Die Spalte wird bis RowCount-1 ausgefüllt
Die letzte Spalte hat aber den Index RowCount-1, da der ja bei 0 beginnt.

alfold 25. Jun 2011 17:35

AW: Stringgrid Plus Minus Vergleich
 
Zitat:

Zitat von himitsu (Beitrag 1108274)
Zum Glück oder blöder Weise, paßt sich die interne StringList des StringGrids automatisch an und vergrößert sich (auch wenn in der Anzeige nicht mehr Zeilen/Spalten angezeigt werden)

und genau deswegen ist bei ihm hier eine Zeile mehr in der Liste, weil + 1
Delphi-Quellcode:
JvSG1.Cells[9,i+1]

und hier in der Anzeige nicht.
Delphi-Quellcode:
StrToInt(JvSG1.Cells[9,i]);


Gruss alfold

fl63 25. Jun 2011 17:42

AW: Stringgrid Plus Minus Vergleich
 
Zitat:

Zitat von alfold (Beitrag 1108280)
Zitat:

Zitat von himitsu (Beitrag 1108274)
Zum Glück oder blöder Weise, paßt sich die interne StringList des StringGrids automatisch an und vergrößert sich (auch wenn in der Anzeige nicht mehr Zeilen/Spalten angezeigt werden)

und genau deswegen ist bei ihm hier eine Zeile mehr in der Liste, weil + 1
Delphi-Quellcode:
JvSG1.Cells[9,i+1]

und hier in der Anzeige nicht.
Delphi-Quellcode:
StrToInt(JvSG1.Cells[9,i]);


Gruss alfold

Die Spalte Cells[10,i] sollte die Ergebnisspalte der Addition der Spalte 9 sein. Nach der obigen Aussage also (RowCount-1)+1 ???

Um diesen HickHack zu entgehen habe ich ja die Summierung in eine andere Prozedur geschrieben. Aber damit summiert ja nichts!

alfold 25. Jun 2011 18:02

AW: Stringgrid Plus Minus Vergleich
 
Zitat:

Zitat von fl63 (Beitrag 1108282)
Um diesen HickHack zu entgehen habe ich ja die Summierung in eine andere Prozedur geschrieben. Aber damit summiert ja nichts!

Darum solltest Du auch ein Haltepunkt dort setzten, dann step by step die Werte auslesen. Nur so bekommst Du raus was da schief geht.

Gruss

Satty67 25. Jun 2011 19:22

AW: Stringgrid Plus Minus Vergleich
 
Mir ist noch was aufgefallen, was direkt nichts direkt mit dem Problem zu tun hat aber evtl. später für Verwirrung sorgen kann:
Delphi-Quellcode:
k:= StrToFloat(JvSG1.Cells[2,i]); l:= StrToFloat(JvSG1.Cells[2,i+1]);
If k > l then JvSG1.Cells[9,i+1] := '-1';
If k < l then JvSG1.Cells[9,i+1] := '+1';
If k = l then JvSG1.Cells[9,i+1] := '0';
Flieskommazahlen (außer Currency) sollte man möglichst nicht auf "gleich" testen, da u.U. mathematisch gleiche Zahlen aufgrund Abbildungsungenauigkeiten in der Fließkommazahl plötzlich ungleich werden.

Statt nun kompliziert zu runden (was auch nie genau wird) könnte man die Quelle vor der Umwandlung testen:
Delphi-Quellcode:
if JvSG1.Cells[2,i] = JvSG1.Cells[2,i+1] then
  JvSG1.Cells[9,i+1] := '0'
else
  // größer / kleiner prüfen
PS: Man könnte meinen, dass gleiche Strings immer gleich umgewandelt werden sollten. Meine mich aber zu erinnern, das Intel-CPUs da einen Mechanismus haben, Ungenauigkeiten durch wechselndes auf/abrunden auszugleichen (hoffe, das hab' ich nicht falsch in Erinnerung).

himitsu 25. Jun 2011 20:02

AW: Stringgrid Plus Minus Vergleich
 
Nicht nur Intel auch AMD und Co.
Bankers Rounding

Denn durch die zweierkomplementäre Speicherung ist immer ein Bereich größer/kleiner, als der Andere, was zu Ungerechtigkeiten führt.

Rundet man immer die 0.5 auf, dann wäre
Delphi-Quellcode:
x.0 <= ... < x.5
immer kleiner, als
Delphi-Quellcode:
x.5 <= ... < x+1.0
.
Also wird immer abwechselnd gerundet > bei ungeraden Ganzzahlanteilen in die eine Richtung und bei geraden Ganzzahlanteilen in die Andere.

fl63 25. Jun 2011 20:31

AW: Stringgrid Plus Minus Vergleich
 
Nachdem ich das Ganze in ein eigenständiges Projekt verpflanzt habe, alle Indizes angeglichen habe kommt folgendes bei raus:

Delphi-Quellcode:
implementation

{$R *.dfm}

procedure TForm1.OffnenClick(Sender: TObject);
begin
JvSG1.LoadFromCsv('epatest.txt',#9);
JvSG1.InsertCol(4) ;
end;

//---------------------Berechnung Plus Minus ---------------------
procedure TForm1.PlusMinus(Sender: TObject);
var
i,Summe :integer; k,l:Real;
begin
Summe := 100;
JvSG1.InsertCol(5);
 JvSG1.Cells[4,1] := '00';
     begin
   For i:= 1 to (JvSG1.RowCount-1)-1 do //Plus Minus in die Zeile 4 Einfügen
     begin
     k:= StrToFloat(JvSG1.Cells[2,i]); l:= StrToFloat(JvSG1.Cells[2,i+1]);
     If k > l then JvSG1.Cells[4,i+1] := '-1';
     If k < l then JvSG1.Cells[4,i+1] := '+1';
     If k = l then JvSG1.Cells[4,i+1] := '0';
     end;
     end;                                 // Plus Minus Einfügen beendet

end;

procedure TForm1.BerechneSummenspaltePlusMinus(Sender:TObject);
var i,Summe :integer;

begin
//JvSG1.InsertCol(10);
Summe := 100; JvSG1.Cells[5,1] := '100';

   For i:= 1 to JvSG1.RowCount-1 do
      begin
      Summe := Summe + StrToInt(JvSG1.Cells[4,i]);
      JvSG1.Cells[5,i] := IntToStr(Summe);
      end;
end;



procedure TForm1.BerechneClick(Sender: TObject);
begin
PlusMinus(Sender) ;
berechneSummenSpaltePlusMinus(Sender);
end;

end.
Jetzt funktioniert es fehlerfrei von der ersten bis zur letzten Zeile.

Vielen Dank bei allen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:19 Uhr.
Seite 2 von 2     12   

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