![]() |
Größter Wert aus StringGrid
Hallo zusammen,
ich bin Peter, 22 Jahre alt und studiere Energietechnik. In eben diesem Studium muss ich auch ein Projekt mit Delphi programmieren. Ich habe nun das Problem, dass ich in meinem Programm ein StringGrid habe, welches immer die gleichen Werte zeigt. Das ganze ist mit 5 Checkboxen verknüpft, welche veranlassen dass einzelne Reihen ausgeblendet werden (RowHeight= -1). Nun soll von den Daten die noch zu sehen sind (manche aufgrund der Checkboxen ausgeblendet) die größte Zahl gefunden werden. Ich hätte zwar eine Idee wie ich das mit einer >= Abfrage zusammen mit 25 verschiedenen Fällen realisieren kann, allerdings ist dieser Weg sicher nicht besonders Clever. Ich hoffe ihr könnt mir weiter helfen, wie das ganze eleganter zu lösen ist. Gruß Peter |
AW: Größter Wert aus StringGrid
Alle Rows durchgehn und dort wo RowHeight>0 die Werte auslesen und davon den größten merken.
z.B. am Anfang SuchWert mit 0 initialisiert und dann wenn RowHeight>0 und Wert>SuchWert halt SuchWert := Wert Zitat:
|
AW: Größter Wert aus StringGrid
Da steh ich momentan noch auf dem Schlauch...
Ob ich jetzt über die Checkbox oder RowHeights prüfe macht doch eigentlich keinen unterschied. Auch versteh ich die Vorgehensweise mit dem Suchwert noch nicht ganz... auch wenns wahrscheinlich peinlich ist, bisher hatte ich das so geprüft: If (Form8.StringGrid1.Cells[1,1] > Form8.StringGrid1.Cells[1,2] + Form8.StringGrid1.Cells[1,3] + Form8.StringGrid1.Cells[1,4] + Form8.StringGrid1.Cells[1,5]) then Form8.Edit2.Text:= Form8.StringGrid1.Cells[1,1]; Die Werte in meiner StringGrid gehen von 1-30, aber welchen Wert ich suche (den größten) weiß ich ja vorher noch nicht.. :gruebel: |
AW: Größter Wert aus StringGrid
Hallo peetfree,
evtl. so:
Delphi-Quellcode:
Alle Angaben ohne Gewähr ;-)
function GetMaxFromStringGrid():Integer;
var aRow, aCol, max:Integer; begin max:=0; for aRow:=0 to StringGrid1.RowCount-1 do if (StringGrid1.RowHeights[aRow]<>-1) then begin for aCol:=0 to StringGrid1.ColCount-1 do if (StringGrid1.Cells[aCol, aRow].ToInteger > max) then max:=StringGrid1.Cells[aCol, aRow].ToInteger; // oder //if (StrToInt(StringGrid1.Cells[aCol, aRow]) > max) then // max:=StrToInt(StringGrid1.Cells[aCol, aRow]); end; Result:=max; end; |
AW: Größter Wert aus StringGrid
Moin...:P
Zitat:
|
AW: Größter Wert aus StringGrid
Hallo,
nein "habe ich das große Glück, ein Delphi-Projekt zu machen" |
AW: Größter Wert aus StringGrid
Ein paar grundlegende Verständnisprobleme, die du hast:
Zitat:
Zelle 1 Inhalt 5 Zelle 2 Inhalt 1 Zelle 3 Inhalt 2 Zelle 4 Inhalt 7 Zelle 5 Inhalt 21 Dann vergleichst du:
Delphi-Quellcode:
Der Inhalt der Zellen sind Strings. das "+" verkettet die Strings. Dein "+" ist kein logisches "and". Würdest du diesen Weg weiter verfolgen, müsstest du es in Delphi so verwenden:
if 5 > 12721 then
Delphi-Quellcode:
ABER:
If (Form8.StringGrid1.Cells[1,1] > Form8.StringGrid1.Cells[1,2]) and
(Form8.StringGrid1.Cells[1,1] > Form8.StringGrid1.Cells[1,3]) and (Form8.StringGrid1.Cells[1,1] > Form8.StringGrid1.Cells[1,4]) and (Form8.StringGrid1.Cells[1,1] > Form8.StringGrid1.Cells[1,5]) then Dann wäre es immer noch falsch, da es sich um Strings und nicht um Zahlen handelt. Der Vergleich findet daher alphanumerisch statt. D.h.: 5 ist größer als 21. Dein Ziel wäre verfehlt. Somit musst du deine Zellen-Inhalte auch noch in Zahlen umwandeln:
Delphi-Quellcode:
Allerdings würde das kein Programmierer so lösen. Die Lösung von Gollum mit geschachtelten Schleifen ist da schon der richtige Ansatz. Es war man dieser Stelle nur wichtig, dass du auch verstehst, warum es bei dir nicht funktionieren kann und welche Fallen noch zusätzlich vorhanden sind.
If (StrToInt(Form8.StringGrid1.Cells[1,1]) > StrToInt(Form8.StringGrid1.Cells[1,2])) and
(StrToInt(Form8.StringGrid1.Cells[1,1]) > StrToInt(Form8.StringGrid1.Cells[1,3])) and (StrToInt(Form8.StringGrid1.Cells[1,1]) > StrToInt(Form8.StringGrid1.Cells[1,4])) and (StrToInt(Form8.StringGrid1.Cells[1,1]) > StrToInt(Form8.StringGrid1.Cells[1,5])) then |
AW: Größter Wert aus StringGrid
Hallo nochmal,
ich habe nun doch etwas neue Weisheit erlangt, und muss zugeben dass das nicht anders funktioniert als über eine Schleife. Auf andere Art und weiße kämen wohl ca. 30 Seiten Code zusammen. Also habe ich nun doch das Glück mich noch etwas eingehender mit Delphi beschäftigen zu dürfen. Ich habe den Text von @Gollum jetzt einfach mal bei mir ins Programm übernommen, allerdings läuft das so natürlich noch nicht. Das ganze sieht momentan so aus;
Delphi-Quellcode:
1.
function GetMaxFromStringGrid():Integer;
var aRow, aCol, max:Integer; begin max:=0; for aRow:=0 to Form8.StringGrid1.RowCount-1 do if (Form8.StringGrid1.RowHeights[aRow]<>-1) then begin for aCol:=0 to Form8.StringGrid1.ColCount-1 do if (StrToInt(Form8.StringGrid1.Cells[aCol, aRow]) > max) then max:=StrToInt(Form8.StringGrid1.Cells[aCol, aRow]); end; Result:=max; end;
Delphi-Quellcode:
Delphi bemängelt dass es gerne ein Statement hätte, aber nur ein Function gefunden. Wozu das überhaupt? Gibt das der Schleife einfach nur eine Namen?
function GetMaxFromStringGrid():Integer;
2.
Delphi-Quellcode:
Ja, was soll Delphi für den Fall eigentlich machen? Denn danach folgt ja ein If, womit Delphi auch nicht klar kommt
for aRow:=0 to Form8.StringGrid1.RowCount-1 do
3. Außerdem ist gegen ende Wohl noch ein ';' zu viel, da Delphi stattdessen ein Punkt erwartet. Ich hoffe ihr könnt mir hier nochmal helfen und mir das ganze etwas verständlich machen. Doof bin ich eigentlich nicht, mit Programmieren hab ich leider nur echt wenig am Hut. |
AW: Größter Wert aus StringGrid
Soo, ich hab da nochmal etwas nachgelesen und den Code weiter angepasst. Allerdings hab ich jetzt noch mehr Fehlermeldungen als vorher, und weiß noch weniger wieso...
Hier mal mein Code
Delphi-Quellcode:
function GetMaxFromStringGrid():Integer;
var aRow, max: Byte ; begin max:=0; for aRow:=0 to 6 do if (Form8.StringGrid1.RowHeights[aRow]>-1) then begin if (StrToFloat(Form8.StringGrid1.Cells[1, aRow]) > max) then max:=StringToFloat(Form8.StringGrid1.Cells[1, aRow]); end; Form8.Edit6.Text:= FloatToString(max) ; end; Und hier die Fehlermeldungen: 1. Statement expected but 'function' found 2. Undeclared Identifier 'StringToFloat' 3. Undeclared Identifier ' FloatToString' und dann noch zwei die sich auf den nachfolgenden code beziehen, allerdings ohne das eingefügte nicht kommen: 4. Declaration expected but "If" found (Bezieht sich auf das was unmittelbar nach end kommt) 5. '.' expected but ';' found (bezieht sich auf das procedure end; ganz am ende) Ich hoffe ihr könnt mir nochmal helfen. Liebe Grüße Peter |
AW: Größter Wert aus StringGrid
Zitat:
2. Schau mal eine Zeile höher. Dann sieht man den Fehler ja schon rein optisch. 3. Analog 2. 4. S. 1. Dazu müsste man mehr Code sehen 5. Klar, nach dem letzten end in einer Unit muss ein . stehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 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