StringGrid.Cols[i].addstrings Problem

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Relexy18
Beiträge: 14
Registriert: Di 7. Mai 2019, 10:46

StringGrid.Cols[i].addstrings Problem

Beitrag von Relexy18 »

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[i].Add(sl.Strings[0]);
Application.ProcessMessages;
StringGrid1.Cols[i].AddStrings(slv);
Application.ProcessMessages;
end;
sl.Free;
slv.Free;
end;


Vielen Dank schon mal im Voraus!

Relexy18
Beiträge: 14
Registriert: Di 7. Mai 2019, 10:46

Re: StringGrid.Cols[i].addstrings Problem

Beitrag von Relexy18 »

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?

Relexy18
Beiträge: 14
Registriert: Di 7. Mai 2019, 10:46

Re: StringGrid.Cols[i].addstrings Problem

Beitrag von Relexy18 »

habe eine lösung gefunden

mit stringgrid.cols[x].clear funkioniert es!

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: StringGrid.Cols[i].addstrings Problem

Beitrag von wp_xyz »

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:

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;   

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.

Relexy18
Beiträge: 14
Registriert: Di 7. Mai 2019, 10:46

Re: StringGrid.Cols[i].addstrings Problem

Beitrag von Relexy18 »

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

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: StringGrid.Cols[i].addstrings Problem

Beitrag von wp_xyz »

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.

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.

Antworten