Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schleifen imStringGrid (https://www.delphipraxis.net/40506-schleifen-imstringgrid.html)

Peti 16. Feb 2005 18:58


Schleifen imStringGrid
 
HI!
Wie kann man in einem StringGrid, das man zu einer Wertetabelle programmierem soll, eine repeat-Schleife unterbringen, das in einer Zeile eingegebene Werte vom min Wert bis zum max Wert erscheinen, in einem Abstand der auch noch extra eingegeben wird ?

Binärbaum 16. Feb 2005 21:30

Re: Schleifen imStringGrid
 
Meinst du sowas hier:
Delphi-Quellcode:
procedure Zahlen_in_StringGrid(MinWert, MaxWert: Integer; abstand: Cardinal);
var i,j: Integer;
begin
 if MaxWert<MinWert then begin
  i:= MaxWert;
  MaxWert:= MinWert;
  MinWert:= i;
 end;//if
 i:= minWert;
 while i<=MaxWert do begin
  j:= (i-MinWert) div abstand +1;
  StringGrid1.Cells[j, 3]:= IntToStr(i);
  i:= i+abstand;
 end;//while
end;
Das Beispiel füllt die Zeile 3 des StringGrid1 mit den Zahlen von MinWert bis MaxWert, wobei die vorherige Zahl immer um Abstand kleiner ist als ihn Nachfolger.

MfG
Binärbaum

Peti 17. Feb 2005 18:37

Re: Schleifen imStringGrid
 
Nunja nicht ganz, naja eigentlich ist mein Geschick mit Delphi eher begrenzt :oops:

Code:
var
  Form1: TForm1;
   min, max, schritt,i:Integer ;

procedure TForm1.Button1Click(Sender: TObject);
begin
min:=0;
max:=0;
schr:=0;
min:=strtoint(E_min.text);
max:=strtoint(E_max.text);
schritt:=strtoint(E_Schrittweite.text);
repeat i:=min+scritt;
until i=max;
end;
Wie würde man das jetzt immer fortlaufend ausgerechnete in die obere Zeile übertragen können?
Und könnte man mit nur Grundwissen von Delphi die Anzahl der Spalten der Zeile so veränderlich gestalten, das immer nur so viele Spalten erscheinen, wie nur gebraucht wird um die Zahlen darzustellen?

Binärbaum 17. Feb 2005 19:03

Re: Schleifen imStringGrid
 
Zitat:

Zitat von Peti
Und könnte man mit nur Grundwissen von Delphi die Anzahl der Spalten der Zeile so veränderlich gestalten, das immer nur so viele Spalten erscheinen, wie nur gebraucht wird um die Zahlen darzustellen?

Ja, über die Eigenschaften Delphi-Referenz durchsuchenColCount und Delphi-Referenz durchsuchenRowCount des StringGrid kann man die Anzahl der Spalten bzw. Zeilen des StringGrid verändern.
Und was soll der Code von oben jetzt machen?
Der zählt doch nur eine Variable hoch, und macht nichts mit dem StringGrid. :gruebel:
Vielleicht solltest du den Code etwas ändern:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var min, max, schritt,i:Integer ;
begin
 min:=strtoint(E_min.text);
 max:=strtoint(E_max.text);
 schritt:=strtoint(E_Schrittweite.text);
 Zahlen_in_StringGrid(min, max, schritt);
end;
Dabei ist die Prozedur Zahlen_in_StringGrid die von oben aus meinem anderen Beitrag.
Evtl. musst du dort noch in der Zeile
Delphi-Quellcode:
StringGrid1.Cells[j, 3]:= IntToStr(i);
die 3 durch irgendeine andere Zahl ersetzen, wenn die Zahlen in eine andere Zeile im StringGrid sollen.
Bin mir jetzt aber nicht so sicher, ob dies nun genau das ist, was du erreichen wolltest :?:

MfG
Binärbaum

Peti 17. Feb 2005 19:32

Re: Schleifen imStringGrid
 
Kann man mit dem ColCount den StringGrid auch so verändern, das er erkennt das wenn nur fünf verschiedene Zahlen sind, es auch nur fünf Zellen anzeigt und wenn danach zehn Zahlen ausgegeben werden sollen er auch die zehn Zellen anzeigt?

Die Variable soll immer um die eingegebene Schrittweite weitergezählt werden,z.B wenn ich einen Zahlenraum von -4 bis 4 eingeben und eine Schrittweite von 2 soll in denn cells [1,0] -4; [2,0] -2;[3,0] 0 usw. bis zur 4 ausgegeben werden.

Binärbaum 17. Feb 2005 22:00

Re: Schleifen imStringGrid
 
Da musst du dir erstmal anhand der Werte (Minimum, Maximum, Weite) ausrechenen, wieviele Zeilen oder Spalten du brauchst und dann ColCount und/oder RowCount auf die errechneten Werte setzen.

MfG
Binärbaum

Peti 18. Feb 2005 18:32

Re: Schleifen imStringGrid
 
Ja, das ist mir klar. Mein größtes Problem ist eigentlich, wie ich die ausgerechneten Zahlen ins StringGrid bekomme.
Bsp.:
Die Variable soll immer um die eingegebene Schrittweite weitergezählt werden,z.B wenn ich einen Zahlenraum von -4 bis 4 eingeben und eine Schrittweite von 2 soll in denn cells [1,0] -4; [2,0] -2;[3,0] 0 usw. bis zur 4 ausgegeben werden.

Hansa 18. Feb 2005 19:02

Re: Schleifen imStringGrid
 
Zitat:

Zitat von Peti
Mein größtes Problem ist eigentlich, wie ich die ausgerechneten Zahlen ins StringGrid bekomme...

Und wo liegt dann das Problem ? Wenn der Wert errechnet iswt, dann schiebe ihn in die entsprechende StringGrid-Zelle. Zahlenwerte müssen in strings umgewandelt werden und sonst nichts. 8)

Peti 18. Feb 2005 19:57

Re: Schleifen imStringGrid
 
Das soll ja alles in einer repeat - Schleife passieren und wenn ich die repeat- Schleife habe, hab ich keine Ahnung wie ich das ins StringGrid krieg.
Das ich dsa mit der repeat -Schleife ausrechne und dann hinschreibe:
Code:
StringGrid.cells[i,0]:=floattostr(x);
das geht bei mir nicht, denn es passiert nichts.

Hansa 18. Feb 2005 20:05

Re: Schleifen imStringGrid
 
wo schreibst du denn diese eine Code-Zeile hin ? Im FormCreate z.B. wirds wohl nichts nützen.

Binärbaum 18. Feb 2005 20:06

Re: Schleifen imStringGrid
 
Zitat:

Zitat von Peti
Das soll ja alles in einer repeat - Schleife passieren und wenn ich die repeat- Schleife habe, hab ich keine Ahnung wie ich das ins StringGrid krieg.
Das ich dsa mit der repeat -Schleife ausrechne und dann hinschreibe:
Code:
StringGrid.cells[i,0]:=floattostr(x);
das geht bei mir nicht, denn es passiert nichts.

"Das geht bei mir nicht" ist eine ziemlich ungenaue Fehlerbeschreibung. Was genau passiert denn, wenn das Programm ausgeführt wird? Wird gar nichts ins StringGrid geschrieben? Oder nur die erste Zahl? Oder...
Vielleicht kannst du ja auch mal etwas Quelltext zeigen, damit man das Problem besser versteht.

MfG
Binärbaum

Peti 19. Feb 2005 11:15

Re: Schleifen imStringGrid
 
Das ist mein bisheriger Quelltext:
Code:
var
  Form1: TForm1;
   min, max, schritt,i:real ;
procedure TForm1.Button1Click(Sender: TObject);
begin
min:=0;
max:=0;
schritt:=0;
min:=strtofloat(E_min.text);
max:=strtofloat(E_max.text);
schritt:=strtofloat(E_Schrittweite.text);
repeat i:=min+schritt;
until i=max;
Sg.cells[i,0]:=floattostr(i);
end;
So wie er jetzt ist wird das Programm gar nicht erst gestartet, aber wenn ich alles in Integer Werte mache, wird das Programm gestartet, es wird aber nichts ausgegeben.

Binärbaum 19. Feb 2005 12:54

Re: Schleifen imStringGrid
 
Zitat:

Zitat von Peti
Das ist mein bisheriger Quelltext:
Code:
var
  Form1: TForm1;
   min, max, schritt,i:real ;
procedure TForm1.Button1Click(Sender: TObject);
begin
min:=0;
max:=0;
schritt:=0;
min:=strtofloat(E_min.text);
max:=strtofloat(E_max.text);
schritt:=strtofloat(E_Schrittweite.text);
repeat i:=min+schritt;
until i=max;
Sg.cells[i,0]:=floattostr(i);
end;
So wie er jetzt ist wird das Programm gar nicht erst gestartet, aber wenn ich alles in Integer Werte mache, wird das Programm gestartet, es wird aber nichts ausgegeben.

Du musst die Zeile
Delphi-Quellcode:
Sg.cells[i,0]:=floattostr(i);
IN die repeat-Schleife schreiben, wenn mehrere Zahlen ausgegeben werden sollen:
Delphi-Quellcode:
repeat i:=min+schritt;
 Sg.cells[i,0]:=floattostr(i);
until i>=max;
MfG
Binärbaum

Peti 19. Feb 2005 13:13

Re: Schleifen imStringGrid
 
Code:
begin
min:=0;
max:=0;
schritt:=0;
min:=strtofloat(E_min.text);
max:=strtofloat(E_max.text);
schritt:=strtofloat(E_Schrittweite.text);
repeat i:=min+schritt;
Sg.cells[i,0]:=floattostr(i);
until i=max;

end;
Wenn ich das so mache, wird das Programm nicht gestartet, sondern es kommt die Meldung "Inkompatible Typen:'Integer' und 'Real'". Wenn ich dann aber alles in Integer umwandle
Code:
begin
min:=0;
max:=0;
schritt:=0;
min:=strtoint(E_min.text);
max:=strtoint(E_max.text);
schritt:=strtoint(E_Schrittweite.text);
repeat i:=min+schritt;
Sg.cells[i,0]:=inttostr(i);
until i=max;

end;
Dann wird immer noch nichts ins StrinGrid geschrieben.

Binärbaum 19. Feb 2005 13:28

Re: Schleifen imStringGrid
 
Welche Typen nimmst du denn nun für min, max und Schritt? Integer oder real?
Bei Integer musst du Delphi-Referenz durchsuchenIntToStr nehmen, für real Delphi-Referenz durchsuchenFloatToStr.
Und welche Werte gibst du denn für min, max und schritt ein?

[Edit]

Hast du schon mal die Prozedur von oben ausprobiert? Falls nicht, hier nochmal eine verbesserte Version:
Delphi-Quellcode:
procedure Zahlen_in_StringGrid(MinWert, MaxWert: Integer; abstand, zeile: Cardinal; var strGrd: TStringGrid);
var i,j: Integer;
begin
if MaxWert<MinWert then begin
  i:= MaxWert;
  MaxWert:= MinWert;
  MinWert:= i;
end;//if
i:= minWert;
while i<=MaxWert do begin
  j:= (i-MinWert) div abstand +1;
  strGrd.Cells[j, zeile]:= IntToStr(i);
  i:= i+abstand;
end;//while
end;
(ungetestet)
Ein Beispielaufruf könnte dann so aussehen:
Delphi-Quellcode:
//Zahlen von 0 bis 8 mit Abstand 2 in die erste Zeile des StringGrid SG
Zahlen_in_StringGrid(0, 8, 2, 1, SG);
[/Edit]

MfG
Binärbaum

Peti 19. Feb 2005 16:18

Re: Schleifen imStringGrid
 
Ja, das funktioniert!
Könntest du mir kurz erklären was da im Quelltext steht? Und könnte man das so umwandeln das man das mit reellen Zahlen machen kann?

Binärbaum 19. Feb 2005 18:52

Re: Schleifen imStringGrid
 
Zitat:

Zitat von Peti
Ja, das funktioniert!

Die selbe (bzw. eine fast gleiche) Prozedur steht schon am Anfang des Threads. Die hättest du auch gleich nehmen können. :wink:
Zitat:

Zitat von Peti
Und könnte man das so umwandeln das man das mit reellen Zahlen machen kann?

Ja, einfach Integer durch Real ersetzen und statt IntToStr nimmt man FloatToStr.
Delphi-Quellcode:
procedure Zahlen_in_StringGrid(MinWert, MaxWert, abstand: Real; zeile: Cardinal; var strGrd: TStringGrid);
var i: Real;
    j: Integer;
begin
if MaxWert<MinWert then begin
  i:= MaxWert;
  MaxWert:= MinWert;
  MinWert:= i;
end;//if
i:= minWert;
abstand:= abs(abstand);
while i<=MaxWert do begin
  j:= Round((i-MinWert)/abstand +1);
  strGrd.Cells[j, zeile]:= FloatToStr(i);
  i:= i+abstand;
end;//while
end;
MfG
Binärbaum

Peti 19. Feb 2005 19:52

Re: Schleifen imStringGrid
 
Danke!! Es geht jetzt alles
Zitat:

Die selbe (bzw. eine fast gleiche) Prozedur steht schon am Anfang des Threads. Die hättest du auch gleich nehmen können.
Schein irgendwie die Angewohnheit zu haben alles komplizirter zu machen als es ist :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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