Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler beim vergrößern eines StringGrid (https://www.delphipraxis.net/91533-fehler-beim-vergroessern-eines-stringgrid.html)

24jb 6. Mai 2007 18:27


Fehler beim vergrößern eines StringGrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Ich bin gerade für die Schule ein kleines Programm zu schreiben.
Dabei handelt es sich um eine Multiplikationstabelle, im prinzip ganz simple und einfach um zusetzen.

Allerdings stürzt das Programm wenn ich im Programm über ein SpinEdit die Größe der Tabelle ändere ab, und ich weiß nicht, wieso.

Als Fehler kommt: "Project Project1.exe raised exception class EconvertError with message ''' is not a valid integer value"

Vielleicht könnt ihr mir helfen.

Ich seh warscheinlich den Wald vor lauter Bäumen nicht ;-)

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Grids;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    StringGrid1: TStringGrid;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure multiwrite;
   Procedure berechnung;
   Procedure clenup;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
clenup;
StringGrid1.ColCount := SpinEdit1.Value + 1;
multiwrite;
berechnung;
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
clenup;
StringGrid1.RowCount := SpinEdit2.Value + 1;
multiwrite;
berechnung;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.ColCount := SpinEdit1.Value + 1;
StringGrid1.RowCount := SpinEdit2.Value + 1;
multiwrite;
berechnung;
end;

procedure Tform1.multiwrite;
Var i : Integer;
Begin

   //Die procedure multiwrite schreibe die erste Zeile und Spalte
   StringGrid1.Cells[0,0] := '     x';
    For i := 1 to SpinEdit1.Value do
       StringGrid1.Cells[i,0] := IntToStr(i);

    For i := 1 to SpinEdit2.Value do
       StringGrid1.Cells[0,i] := IntToStr(i);
End;

Procedure TForm1.berechnung;
var i, x : Integer;
Begin
   //berechnung berechnet und schreib die Werte in StringGrid1
      For i := 1 to (SpinEdit2.Value) do
    Begin
       For x := 1 to (SpinEdit1.Value) do
       Begin
        StringGrid1.Cells[x,i] := IntToStr(StrToInt(StringGrid1.Cells[0,x])*StrToInt(StringGrid1.Cells[i,0]));
       end;
    end;
End;

Procedure TForm1.clenup;
var i, x : Integer;
Begin
   //leert jedes Feld des Stringgrids
   For i := 1 to (SpinEdit2.Value) do
    Begin
       For x := 1 to (SpinEdit1.Value) do
       Begin
        StringGrid1.Cells[x,i] := '';
       end;
    end;
End;

end.

thkerkmann 6. Mai 2007 18:32

Re: Fehler beim vergrößern eines StringGrid
 
Hi,

ich denke das Problem liegt in clenup.

Hier löscht du über die NEUE Anzahl von Zeilen/Spalten,
besser wäre hier StringGrid.Rowcount-1 und StringGrid.ColCount - 1 als Schleifenende zu verwenden.

Gruss

24jb 6. Mai 2007 18:49

Re: Fehler beim vergrößern eines StringGrid
 
Hi,
ich hab das geändert, aber an sich hat sich nicht geändert.

Ich bin mal mit der F7-Taste alles schritt für schritt durch gegangen, und das Programm stürtz bei der Procedure Berechnung ab. ab wo genau hab ich nicht herausgefunden.

pilic 6. Mai 2007 19:45

Re: Fehler beim vergrößern eines StringGrid
 
Hi,

der Fehler kann eigentlich nur hier liegen:

Delphi-Quellcode:
        StringGrid1.Cells[x,i] := IntToStr(StrToInt(StringGrid1.Cells[0,x])*StrToInt(StringGrid1.Cells[i,0]));
Weil '' nicht zu Integer umgewandelt werden kann.

Cheerio

24jb 6. Mai 2007 20:46

Re: Fehler beim vergrößern eines StringGrid
 
aber woher kommt denn das '' das ist doch kein Wert der irgendwo vorkommt

Lannes 6. Mai 2007 22:32

Re: Fehler beim vergrößern eines StringGrid
 
Hallo,


das '' deutet auf eine leere Zelle.

Benenn mal Deine SpinEdits (z.B SpEdCol ...) und die Variablen i und x (z.B. col ...).
Dann schau Dir TForm1.berechnung noch mal genau an :zwinker:

24jb 7. Mai 2007 09:13

Re: Fehler beim vergrößern eines StringGrid
 
Ich hab die Variablen und so umbenannt und die Berechnung von StringGrid1.ColCount und StringGrid1.RowCount abhängig gemacht.

Allerdings startet das Programm nicht mehr, sondern der alt bekannte Fehler kommt sofort.

Delphi-Quellcode:
Procedure TForm1.berechnung;
var col, row : Integer;
Begin

For row := 1 to StringGrid1.RowCount do
Begin
      For col := 1 to StringGrid1.ColCount do
   Begin
       StringGrid1.Cells[row,col] := IntToStr(StrToInt(StringGrid1.Cells[row,0])*StrToInt(StringGrid1.Cells[0,col]))
    end;
end;

End;

24jb 7. Mai 2007 10:02

Re: Fehler beim vergrößern eines StringGrid
 
Ich habe mal genauer nach geschaut, der Fehler kommt, wenn das programm die 7. spalte schreibt

Lannes 7. Mai 2007 11:32

Re: Fehler beim vergrößern eines StringGrid
 
Hallo,

Delphi-Quellcode:
property Cells[ACol, ARow: Integer]: string;
Du nutzt col als Argument für ARow und row als Argument für ACol,in der Eigenschaft Cells.
Zitat:

StringGrid1.Cells[row,col] := IntToStr(StrToInt(StringGrid1.Cells[row,0])*StrToInt(StringGrid1.Cells[0,col]))
dadurch greifst Du auf Zellen zu die außerhalb von row/ColCount liegen und noch keinen Wert enthalten, daher die Meldung ''' is not a valid integer value".

RowCount und ColCount ist nicht die Grenze des Arrays Cells.
Man kann beispielsweise bei RowCount = 10 und ColCount = 10 auf Cells[1000000,1000000] zugreifen.
Das Ergebnis ist ein Leerstring sofern diese Zelle nicht vorher mit einem String belegt wurde.

marabu 7. Mai 2007 11:34

Re: Fehler beim vergrößern eines StringGrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

du machst dir das Leben unnötig schwer:

Delphi-Quellcode:
procedure TMultiForm.Berechnung;
var
  iCol, iRow: Integer;
begin
  with StringGrid do
  for iRow := 1 to Pred(RowCount) do
    for iCol := 1 to Pred(ColCount) do
      Cells[iCol, iRow] := IntToStr(iCol * iRow);
end;
Beim Vergleich findest du deine Fehler.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr.

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