![]() |
Delphi-Version: 5
Stringgrid Plus Minus Vergleich
Hallo
Ich habe folgendes Problem:
Delphi-Quellcode:
procedure PlusMinus ist fehlerfrei
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; 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 |
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.
|
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. |
AW: Stringgrid Plus Minus Vergleich
Und dies ist bei beiden korrekt?
Delphi-Quellcode:
Gruss alfold
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 ??? |
AW: Stringgrid Plus Minus Vergleich
Zitat:
Was meinst du?? |
AW: Stringgrid Plus Minus Vergleich
Zitat:
Delphi-Quellcode:
'00' drinsteht?
JvSG1.Cells[9,1] := '00'
Gruss alfold |
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:
Der Quelltext ist vielleicht nicht modern aber korrekt. |
AW: Stringgrid Plus Minus Vergleich
Warum setzt Du nicht ein Breakpoint an der Stelle
Delphi-Quellcode:
und dann step by step die Werte auslesen ob es stimmt was da passieren soll.
Summe := Summe + StrToInt(JvSG1.Cells[9,i]);
Gruss alfold |
AW: Stringgrid Plus Minus Vergleich
Neuer Quelltext:
Delphi-Quellcode:
Jetzt habe ich mal die Zwei Prozeduren in eine geschrieben.
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; 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?? |
AW: Stringgrid Plus Minus Vergleich
RowCount -1 ist die letzte Zeile. Verstehe deine Frage nicht.
Allerdings hätt es hier
Delphi-Quellcode:
knallen müssen! Weil Du auf eine Zeile zugreifst die nicht da ist!?
JvSG1.Cells[9,i+1]
Seeehr mergwürdig:shock: Gruss alfold |
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: |
AW: Stringgrid Plus Minus Vergleich
Zitat:
Delphi-Quellcode:
Hier muß der Fehler sein. Und das begreife ich nicht. Er beendet die Summierung bei der vorletzten Zeile.
Summe := Summe + StrToInt(JvSG1.Cells[9,i]);
JvSG1.Cells[10,i] := IntToStr(Summe); Gruß FL63 |
AW: Stringgrid Plus Minus Vergleich
Zitat:
|
AW: Stringgrid Plus Minus Vergleich
Zitat:
Delphi-Quellcode:
JvSG1.Cells[9,i+1]
und hier in der Anzeige nicht.
Delphi-Quellcode:
StrToInt(JvSG1.Cells[9,i]);
Gruss alfold |
AW: Stringgrid Plus Minus Vergleich
Zitat:
Um diesen HickHack zu entgehen habe ich ja die Summierung in eine andere Prozedur geschrieben. Aber damit summiert ja nichts! |
AW: Stringgrid Plus Minus Vergleich
Zitat:
Gruss |
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:
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.
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'; Statt nun kompliziert zu runden (was auch nie genau wird) könnte man die Quelle vor der Umwandlung testen:
Delphi-Quellcode:
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).
if JvSG1.Cells[2,i] = JvSG1.Cells[2,i+1] then
JvSG1.Cells[9,i+1] := '0' else // größer / kleiner prüfen |
AW: Stringgrid Plus Minus Vergleich
Nicht nur Intel auch AMD und Co.
![]() 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:
immer kleiner, als
x.0 <= ... < x.5
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. |
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:
Jetzt funktioniert es fehlerfrei von der ersten bis zur letzten Zeile.
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. Vielen Dank bei allen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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