Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Größter Wert aus StringGrid (https://www.delphipraxis.net/195177-groesster-wert-aus-stringgrid.html)

peetfree 8. Feb 2018 14:51

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

himitsu 8. Feb 2018 14:56

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:

Abfrage zusammen mit 25 verschiedenen Fällen
1 Fall, wenn vorher schon gefilter wurde (RowHeight=-1)

peetfree 8. Feb 2018 15:19

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:

Gollum 8. Feb 2018 16:10

AW: Größter Wert aus StringGrid
 
Hallo peetfree,

evtl. so:
Delphi-Quellcode:
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;
Alle Angaben ohne Gewähr ;-)

haentschman 9. Feb 2018 06:21

AW: Größter Wert aus StringGrid
 
Moin...:P
Zitat:

In eben diesem Studium muss ich auch ein Projekt mit Delphi programmieren.
...möööp! Das muß heißen "will"...:thumb:

hoika 9. Feb 2018 06:28

AW: Größter Wert aus StringGrid
 
Hallo,
nein

"habe ich das große Glück, ein Delphi-Projekt zu machen"

Jasocul 9. Feb 2018 07:16

AW: Größter Wert aus StringGrid
 
Ein paar grundlegende Verständnisprobleme, die du hast:
Zitat:

Zitat von peetfree (Beitrag 1393387)
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];

Beispiel:
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:
if 5 > 12721 then
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:
Delphi-Quellcode:
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
ABER:
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:
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
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.

peetfree 9. Feb 2018 11:34

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:
 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;
1.
Delphi-Quellcode:
function GetMaxFromStringGrid():Integer;
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?

2.
Delphi-Quellcode:
  for aRow:=0 to Form8.StringGrid1.RowCount-1 do
Ja, was soll Delphi für den Fall eigentlich machen? Denn danach folgt ja ein If, womit Delphi auch nicht klar kommt

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.

peetfree 12. Feb 2018 10:28

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

bcvs 12. Feb 2018 10:51

AW: Größter Wert aus StringGrid
 
Zitat:

Zitat von peetfree (Beitrag 1393617)

1. Statement expected but 'function' found
2. Undeclared Identifier 'StringToFloat'
3. Undeclared Identifier ' FloatToString'
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)

1. Wo steht denn deine function im Code? Kann es sein, dass die irgenwo steht, wo sie nicht hingehört? Zeig mal den Code drumherum.

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 17:02 Uhr.
Seite 1 von 2  1 2   

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