Guten Morgen Zusammen,
ich bin gerade dabei eine Stringgrid Tabelle mit Stringwerten aus einer XML Datei zu füllen. Dies ist generell auch kein Problem, jedoch habe ich einen kleinen Bug gefunden den ich nicht verstehe und nicht behben kann.
folgendes:
ich fülle eine Stingliste mit String Daten aus einer XML Datei => mit der funktion "Stringgrid.cols[x].add oder addstring weise ich diese einer Spalte zu. Das ganze funktioniert auch reibungslos beim ersten Durchlauf.
Wenn ich jetzt ein zweites mal die Function ausführen möchte (ohne änderung), dann kommt eine Fehlermeldung bzw. bleibt der kompiler stehen und in der Stringgrid stehen keine Werte drin. Die Fehlermeldung lautet => "Projekt Name hat Exception-KLasse>>EGRidEXception<< ausgelöst mit der Meldung: Can not add Object" . In Datei Grids.pas Zeile 10394: raise EGridException.create('Can not add Object')
Wie kann ich das beheben bzw. wo liegt der Fehler?
ProgrammCode im als Testcode, ohne XML- Value fuction
procedure TForm1.Button4Click(Sender: TObject);
var
sl,slV:TStringList;
s:string;
i:integer;
begin
sl:=TStringList.Create;
slV:=TStringList.Create;
sl.Add('TestKopf1');
sl.Add('TestKopf2');
sl.add('TestKopf3');
slv.Add('Value1');
slv.Add('Value2');
slv.Add('Value3');
slv.Add('Value4');
slv.Add('Value5');
slv.Add('Value6');
slv.Add('Value7');
slv.Add('Value8');
slv.Add('Value9');
slv.Add('Value10');
StringGrid1.Clear;
StringGrid1.ColCount:=sl.Count;
StringGrid1.RowCount:=slv.Count+1;
Application.ProcessMessages;
for i:=0 to sl.Count-1 do begin
StringGrid1.Cols.Add(sl.Strings[0]);
Application.ProcessMessages;
StringGrid1.Cols.AddStrings(slv);
Application.ProcessMessages;
end;
sl.Free;
slv.Free;
end;
Vielen Dank schon mal im Voraus!
StringGrid.Cols[i].addstrings Problem
Re: StringGrid.Cols[i].addstrings Problem
Ich hab mal etwas weiter probiert und das Problem liegt wohl daran, das die stringgrid.clear nicht wirklich die Zellen leert=> denn mit jedem Durchlauf in dem ich in die Cols[x].add ("Test") ausführe, wandert der wert eine Zeile weiter runter=> warum?
Re: StringGrid.Cols[i].addstrings Problem
habe eine lösung gefunden
mit stringgrid.cols[x].clear funkioniert es!
mit stringgrid.cols[x].clear funkioniert es!
Re: StringGrid.Cols[i].addstrings Problem
Sollten mit einem Grid.Clear auch die Cols und Rows des Grid aufgeräumt werden? Wahrscheinlich - dann wäre das ein Bug. Was würde dagegen sprechen?
Das Problem ist bisher wahrscheinlich nicht aufgefallen, weil kaum jemand mit den Cols und Rows arbeitet, und wenn man stattdessen die Cells verwendet funktioniert alles:
P.S.
Wenn du deinen Code in [ code] Tags einschließt (z.B. zugänglich über das "Highlighter"-Dropdown über dem Eingabefeld), wird er leichter lesbar.
Das Problem ist bisher wahrscheinlich nicht aufgefallen, weil kaum jemand mit den Cols und Rows arbeitet, und wenn man stattdessen die Cells verwendet funktioniert alles:
Code: Alles auswählen
procedure TForm1.Button4Click(Sender: TObject);
var
sl,slV:TStringList;
i, j:integer;
begin
sl:=TStringList.Create;
sl.Add('TestKopf1');
sl.Add('TestKopf2');
sl.add('TestKopf3');
slV:=TStringList.Create;
slv.Add('Value1');
slv.Add('Value2');
slv.Add('Value3');
slv.Add('Value4');
slv.Add('Value5');
slv.Add('Value6');
slv.Add('Value7');
slv.Add('Value8');
slv.Add('Value9');
slv.Add('Value10');
StringGrid1.Clear;
StringGrid1.ColCount:=sl.Count;
StringGrid1.RowCount:=slv.Count+1;
for i:=0 to sl.Count-1 do begin
StringGrid1.Cells[i, 0] := sl[0];
for j := 0 to slv.Count-1 do
StringGrid1.Cells[i, j+1] := slv[j];
end;
sl.Free;
slv.Free;
end;
Wenn du deinen Code in [ code] Tags einschließt (z.B. zugänglich über das "Highlighter"-Dropdown über dem Eingabefeld), wird er leichter lesbar.
Re: StringGrid.Cols[i].addstrings Problem
Hallo,
Ich habe die Funktion ("stringgrid.cols[x]) genutzt, da ich eine ganze Stringliste mit werten in die Spalte einfügen möchte => ohne mit einer schleife zeile für zeile die Zellen zu füllen =>bessere Performance denke ich mal.
Danke nochmal für den Hinweis,das ich den Code anders einfügen kann, werde ich beim nächsten mal so machen.
Gruüße
Ich habe die Funktion ("stringgrid.cols[x]) genutzt, da ich eine ganze Stringliste mit werten in die Spalte einfügen möchte => ohne mit einer schleife zeile für zeile die Zellen zu füllen =>bessere Performance denke ich mal.
Danke nochmal für den Hinweis,das ich den Code anders einfügen kann, werde ich beim nächsten mal so machen.
Gruüße
Re: StringGrid.Cols[i].addstrings Problem
Denke ich eher nicht. Zum einen macht AddStrings auch nichts anderes, als die Stringliste Element für Element zu durchlaufen. Und zum anderen und vor allem ist Cols[x] eine Hilfsgröße, die mit jedem Aufruf neu berechnet wird. Denn das Stringgrid speichert seine Daten primär intern in einem "virtuellen" 2D-Grid ("FCelda"). Daher müsste der Stringzugriff über Cells[col,row] direkter und schneller erfolgen als über die StringListen-Eigenschaft Cols[col], die erst aus FCelda zusammengestellt werden muss.Relexy18 hat geschrieben:Ich habe die Funktion ("stringgrid.cols[x]) genutzt, da ich eine ganze Stringliste mit werten in die Spalte einfügen möchte => ohne mit einer schleife zeile für zeile die Zellen zu füllen =>bessere Performance denke ich mal.