Delphi-PRAXiS

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)

fl63 25. Jun 2011 13:50

Delphi-Version: 5

Stringgrid Plus Minus Vergleich
 
Hallo

Ich habe folgendes Problem:

Delphi-Quellcode:
procedure TForm1.PlusMinus(Sender: TObject);
var
i :integer; k,l:Real;
begin

 JvSG1.Cells[9,1] := '00';
     begin
     For i:= 1 to JvSG1.RowCount-1 do //Plus Minus in die Spalte Einfügen
       begin
        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';
       end;
     end;                                 // Plus Minus Einfügen beendet
  BerechneSummenspaltePlusMinus(Sender);
end;

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

begin
Summe := 100; JvSG1.Cells[10,1] := '100'; //Startwerte
 Label1.Caption:=JvSG1.Cells[10,1];
   For i:= 1 to JvSG1.RowCount-1 do
      begin
      Summe := Summe + StrToInt(JvSG1.Cells[9,i]);
      JvSG1.Cells[10,i] := IntToStr(Summe);
      end;
end;
procedure PlusMinus ist fehlerfrei
erzeugt aus Vergleichswerten +1, 0 oder -1 in einer Spalte

procedure Berechne SummeSpalte... ist fehlerbehaftet
sämtliche Werte der PlusMinus Spalte sollen zu einem Startwert addiert werden und die Ergebnisse in einem Chart angezeigt werden.

Problem: keinerlei Anzeige in Spalte 10

Bitte um Hilfe

DeddyH 25. Jun 2011 14:02

AW: Stringgrid Plus Minus Vergleich
 
Spalte 10 oder Spalte 11? BTW: Wäre es nicht günstiger, Logik und Darstellung zu trennen? Ich würde mir ja ein 2-dimensionales Array (oder wenn es gemischte Zahlentypen sind, ein 1-dimensionales Array of record) deklarieren und da meine Zahlen reinpacken. Damit lässt es sich IMO viel besser rechnen, das StringGrid dient dann nur noch zur Darstellung des Array-Inhalts.

fl63 25. Jun 2011 15:19

AW: Stringgrid Plus Minus Vergleich
 
@DeddyH
Natürlich 11te Spalte.

Dennoch zeigt IndexSpalte 10 nichts an.

Trennung zwischen Logik und Anzeige ist für mein winziges Programm vielleicht nicht nötig.
Es interessiert mich dennoch. Im Anschluß an die Lösung dieses Problems, werde ich das ganze nochmals überdenken.

alfold 25. Jun 2011 15:34

AW: Stringgrid Plus Minus Vergleich
 
Und dies ist bei beiden korrekt?
Delphi-Quellcode:
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';

 Summe := Summe + StrToInt(JvSG1.Cells[9,i]);// i+1 ???
Gruss alfold

fl63 25. Jun 2011 15:39

AW: Stringgrid Plus Minus Vergleich
 
Zitat:

Zitat von alfold (Beitrag 1108264)
Und dies ist bei beiden korrekt?
Delphi-Quellcode:
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';

 Summe := Summe + StrToInt(JvSG1.Cells[9,i]);// i+1 ???
Gruss alfold

Bei beiden korrekt??
Was meinst du??

alfold 25. Jun 2011 15:59

AW: Stringgrid Plus Minus Vergleich
 
Zitat:

Zitat von fl63 (Beitrag 1108247)
....
sämtliche Werte der PlusMinus Spalte sollen zu einem Startwert addiert werden und die Ergebnisse in einem Chart angezeigt werden.

Weil Du einmal Zeile i+1 zum füllen angibst und dann nur mit Zeile i die Summe berechnest. Obwohl in Zeile
Delphi-Quellcode:
JvSG1.Cells[9,1] := '00'
'00' drinsteht?

Gruss alfold

fl63 25. Jun 2011 16:16

AW: Stringgrid Plus Minus Vergleich
 
Also die PlusMinus Prozedur funktioniert einwandfrei von der ersten bis zur letzten Zeile stehe Nullen plusEinsen oder MinusEinsen drin.

Die SummenProzedur hat den Startwert Summe= 100, und darauf sollen die Nullen usw. addiert werden Summe := Summe + InttoStr(Cell[9,i]).
Als Ergebnis soll in Cell[10,i] jeweils die Neue Summe stehen.

JvSG1.Cells[9,1] := '00' soll nur als Füllzeichen stehen, kann auch weggelassen werden.

Zitat:

Zitat von alfold (Beitrag 1108267)
Weil Du einmal Zeile i+1 zum füllen angibst und dann nur mit Zeile i die Summe berechnest.

Gruss alfold

Zeile i wird mit Zeile i+1 verglichen.
Der Quelltext ist vielleicht nicht modern aber korrekt.

alfold 25. Jun 2011 16:23

AW: Stringgrid Plus Minus Vergleich
 
Warum setzt Du nicht ein Breakpoint an der Stelle
Delphi-Quellcode:
 Summe := Summe + StrToInt(JvSG1.Cells[9,i]);
und dann step by step die Werte auslesen ob es stimmt was da passieren soll.

Gruss alfold

fl63 25. Jun 2011 16:34

AW: Stringgrid Plus Minus Vergleich
 
Neuer Quelltext:

Delphi-Quellcode:
procedure TForm1.PlusMinusGrafik2(Sender: TObject);
var
i,Summe :integer; k,l:Real;
begin
Summe := 100;
//JvSG1.InsertCol(9);
 JvSG1.Cells[9,1] := '00';
     begin
     For i:= 1 to JvSG1.RowCount-1 do //Plus Minus in die Spalte Einfügen
       begin
        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';
      Summe := Summe + StrToInt(JvSG1.Cells[9,i]);
      JvSG1.Cells[10,i] := IntToStr(Summe);
       end;
     end;                                 // Plus Minus Einfügen beendet
//  BerechneSummenspaltePlusMinus(Sender);
end;
Jetzt habe ich mal die Zwei Prozeduren in eine geschrieben.

IndexZeile[10,i] wird jetzt bis auf die &&vorletzte&& Zeile ausgefüllt.

Zeile (RowCount-1)-1 ist die vorletzte Zeile und nicht RowCount-1.
Warum??

alfold 25. Jun 2011 16:57

AW: Stringgrid Plus Minus Vergleich
 
RowCount -1 ist die letzte Zeile. Verstehe deine Frage nicht.
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

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 22:28 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