![]() |
TStringrid Zellen summieren
Hi folks,
ist es wie bei excel möglich Zahlen in einem Stringgrid zu addieren? ZB gäbe 4 Zeilen die in der 1.Spalte Spieler 1 und 2.Spalte Punkte beinhalten. Wieviel Punkte hat Spieler 1? Ohne auf eine DB ausweichen zu müssen? Greetz Privateer3000 |
Re: TStringrid Zellen summieren
Moin Privateer,
gehe in einer Schleife durch die Zeilen durch, und addiere die Werte. |
Re: TStringrid Zellen summieren
Hi chris,
danke. Mit einer if,ob Zelleninhalt gleich "Spieler 1" ist? |
Re: TStringrid Zellen summieren
Hallo.
Der folgende Code soll die Werte in einer Spalte eines StringGrids summieren und nach dem Wert einer anderen Spalte gruppieren. Das Ergebnis ist eine Liste mit Eintrögen der Form "Spieler1=1000".
Delphi-Quellcode:
Grüße vom marabu
function CreateScoreList(sg: TStringGrid; iGroup, iValue: Integer): TStrings;
var sPlayer: String; index, iScore, iRow: Integer; begin Result := TStringList.Create; with sg do for iRow := FixedRows to Pred(RowCount) do begin sPlayer := Cells[iGroup, iRow]; index := Result.IndexOfName(sPlayer); if TryStrToInt(Cells[iValue, iRow], iScore) then if index < 0 then Result.Values[sPlayer] := IntToStr(iScore) // else Result.Values[sPlayer] := IntToStr(Integer(Result.Values[sPlayer]) + iScore); // StrToInt() statt Integer() else Result.Values[sPlayer] := IntToStr(StrToInt(Result.Values[sPlayer]) + iScore); end; end; |
Re: TStringrid Zellen summieren
vielen dank,
wie wird das ergebnis sichtbar gemacht? sehe nur TStringList ... entschuldige die blöde Frage ;-) |
Re: TStringrid Zellen summieren
Am einfachsten mit der Komponente TValueListEditor, aber ich weiß nicht ob die bei D6 dazu gehört. Wenn nicht geht auch ein StringGrid oder eine ListBox oder ein Memo:
Delphi-Quellcode:
marabu
var
s: TStrings; iRow: Integer; begin s := CreateScoreList(StringGrid, 0, 1); // ValueListEditor ValueListEditor.Strings.Assign(s); // StringGrid with ScoreStringGrid do begin FixedRows := 1; // am Besten FixedCols := 1; // schon vorher ColCount := 2; // im OI einstellen RowCount := s.Count + FixedRows; for i := 0 to to Pred(s.Count) do begin Cells[0, i + FixedRows] := s.Names[i]; Cells[1, i + FixedRows] := s.ValueFromIndex[i]; end; end; s.Free; end; |
Re: TStringrid Zellen summieren
vielen Dank marabu,
ich habe deine funktion und diese Auswertung genommen:
Delphi-Quellcode:
elist heisst das grid von die datne drin stehen
s := CreateScoreList(elist, 3, 4);
ValueListEditor1.Strings.Assign(s); s.Free; 3 und 4 die relevanten Spalten. Der Valuelisteditor bleibt leer was ist falsch? viele Grüße |
Re: TStringrid Zellen summieren
Abgesehen von einem Tippfehler in meinem Code in Beitrag #4, welchen ich jetzt korrigiert habe, verlief mein Test fehlerfrei. Bist du sicher, dass du die richtigen Parameter übergibst? Nur ein Beispiel: die dritte Spalte im Grid hat den Index 2, FixedCols werden nicht berücksichtigt.
marabu |
Re: TStringrid Zellen summieren
ja danke marabu,
habs soweit nur ab einer gewissen summe (glaube 5000) fängt die funktion an Unsinn zu rechnen nämlich irre hohe zahlen was kann das sein? |
Re: TStringrid Zellen summieren
Vielen dank marabu
dein tippfehler hing damit zusammen ich glaub ich hab es auch halbwege verstanden was da läuft |
Re: TStringrid Zellen summieren
hallo marabu
wärst du bitte so nett und würdest mir die funktion oben (CreateScoreList) kommentieren? insbesondere die schleifen? büdde büdde :angel: |
Re: TStringrid Zellen summieren
Hier die prosaische Fassung:
Delphi-Quellcode:
Ich hoffe du kommst zurecht?
function CreateScoreList(sg: TStringGrid; iGroup, iValue: Integer): TStrings;
// sg.Columns[iValue] wird summiert und nach sg.Columns[iGroup] gruppiert // Zugriff auf die Summen-Werte: iScore := StrToInt(Result.Values[sPlayer]) var sPlayer: String; index, iScore, iRow: Integer; begin // Es wird eine neu erzeugte TStringList zurückgegeben Result := TStringList.Create; with sg do // Spaltenüberschriften von der Summenbildung ausschließen for iRow := FixedRows to Pred(RowCount) do begin // nach was soll gruppiert werden ? sPlayer := Cells[iGroup, iRow]; // gibt es für diesen String schon einen Eintrag ? index := Result.IndexOfName(sPlayer); // Ist in der aktuellen Zelle ein gültiger Wert eingetragen ? if TryStrToInt(Cells[iValue, iRow], iScore) then // Gibt es für den Gruppenbegriff sPlayer schon einen Eintrag if index < 0 // nein, Wert einfach einsetzen then Result.Values[sPlayer] := IntToStr(iScore) // ja, auf vorhandenen Wert addieren else Result.Values[sPlayer] := IntToStr(StrToInt(Result.Values[sPlayer]) + iScore); end; end; Grüße vom marabu |
Re: TStringrid Zellen summieren
besten Dank,
habs kapiert dank dir :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 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-2025 by Thomas Breitkreuz