Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stringgrid speichern,/laden Problem (https://www.delphipraxis.net/73115-stringgrid-speichern-laden-problem.html)

Noobinator 12. Jul 2006 15:56


Stringgrid speichern,/laden Problem
 
Delphi-Quellcode:
procedure speichern1.SpeichernClick(Sender: TObject);
VAR Dateiname:string;
begin
if SaveDialog1.Execute then
  begin
    Dateiname := SaveDialog1.FileName;
    SaveGrid(Stringgrid1,Dateiname);    
  end;
end;

procedure SaveGrid(StringGrid1: TStringGrid; fileName: string);
var
  iRow: integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  for iRow := 0 to StringGrid1.RowCount - 1 do
    sl.Add(StringGrid1.Rows[iRow].CommaText);
  sl.SaveToFile(fileName);
  sl.Free;
end;
//-----------------------------------------------
procedure laden1.LadenClick(Sender: TObject);
VAR Dateiname : String;
begin
if OpenDialog1.Execute then
  begin
    Dateiname := OpenDialog1.FileName;
    LoadFromFile(Stringgrid1, Dateiname);
  end;
end;

procedure LoadFromFile(StringGrid1: TStringGrid; txt: TFileName);
var
  sRows, sCols: TStrings;
  i: Integer;
begin
  sRows := TStringList.Create;
  sRows.LoadFromFile(txt);
  sCols := TStringList.Create;
  sCols.CommaText := sRows[0];
  StringGrid1.ColCount := sCols.Count;
  sCols.Free;
  StringGrid1.RowCount := sRows.Count;
  for i := 0 to Pred(sRows.Count) do
    StringGrid1.Rows[i].CommaText := sRows[i];
  sRows.Free;
end;
mithilfe dieser Proceduren Speichere ich ein Stringgrid ab.
Soweit funktioniert es auch, nur wenn ich nun es dann wieder lade, um es weiter zu bearbeiten kommt bei jeder Eingabe in eine Zelle
" " ist kein gültiger Integerwert"
Woran kann das liegen?
Ich Habe mir ein Notenverwaltungsprogramm mithilfe eines Stringgrids gebaut.
Dabei wird jede Zelle des Stringgrids auf einen Inhalt geprüft, und wenn etwas drinne steht, wird dieser Wert mit eingerechnet.
Meine Frage, kann es sein, das die Laden Procedure, irgendetwas in die Leeren Zellen einfügt, was delphi dann nicht will?

PS: was müsste ich machen, um ein zweitesn Stringgrid mit in der Datei zu speichern? oder das ich dieses über die selben dialoge anspreche?
also das ich 2 Stringgrids durch einen klick speichere?
habe das momentan durch die selbe Procedure nochmal gelöst, aber dass kann es ja nicht sein.

Mfg
Noobinator

RavenIV 12. Jul 2006 16:27

Re: Stringgrid speichern,/laden Problem
 
TStringGrid.Rows ist doch ein TStings.
Und da gibt es schon die Methoden SaveToFile und LoadFromFile.

Wieso der Umweg über eine TStringList?

Oder wenn du Schon eine TStringList haben willst, dann nimm doch TStringList.AddStrings.
Schau mal in der Delphi-Hilfe nach.

zu dem " " ist kein gültiger Integerwert:
hast Du vielleicht im Stringgrid eine Spalte als Integer-Spalte definiert?
Das .CommaText erzeugt dir nämlich Strings und beim Einlesen kannst Du aus einem ' ' oder '' keinen Integer mehr machen.

Pfoto 12. Jul 2006 17:35

Re: Stringgrid speichern,/laden Problem
 
Delphi-Quellcode:
procedure SaveStringGridToFile(StringGrid: TStringGrid; const FileName: String);
var
  F: TStringList;
  i: Integer;
begin
  F := TStringList.Create;
  try
    F.Add(IntToStr(StringGrid.RowCount));
    F.Add(IntToStr(StringGrid.ColCount));
    for i := 0 to (StringGrid.RowCount - 1) do
      F.Add(StringGrid.Rows[i].CommaText);
    F.SaveToFile(FileName);
  finally
    F.Free;
  end;
end;


procedure LoadStringGridFromFile(StringGrid: TStringGrid; const FileName: String);
var
  F: TStringList;
  i: Integer;
begin
  F := TStringList.Create;
  try
    F.LoadFromFile(FileName);
    StringGrid.RowCount := StrToInt(F[0]);
    StringGrid.ColCount := StrToInt(F[1]);
    for i := 0 to (StringGrid.RowCount - 1) do
      StringGrid.Rows[i].CommaText := F[i + 2];
  finally
    F.Free;
  end;
end;
Quelle: dsdt.info

Wenn ich mehr Ahnung hätte, könnte ich dir jetzt auch noch sagen, was bei dir falsch ist...
Aber zumindest hättest du durch obigen Code etwas funkionierendes.

Gruß
Pfoto

Noobinator 12. Jul 2006 18:37

Re: Stringgrid speichern,/laden Problem
 
Danke leute.
Werde mal testen ob das jetzt geht.

Noobinator 12. Jul 2006 20:13

Re: Stringgrid speichern,/laden Problem
 
also ich habe mal den Code von Kollege Pfoto genommen.
Aber immmernoch das selbe Problem.
Der Fehler tritt nicht beim reinschreiben der Werte in das Stringgrid auf, sondern bei einer Procedure, die mir den Integerwerten, die eigentlich im grid sein sollten weiterrechnet.
wo könnte der Fehler noch liegen?

Noobinator 13. Jul 2006 15:54

Re: Stringgrid speichern,/laden Problem
 
Zitat:

Zitat von RavenIV
TStringGrid.Rows ist doch ein TStings.
Und da gibt es schon die Methoden SaveToFile und LoadFromFile.

Wieso der Umweg über eine TStringList?

Oder wenn du Schon eine TStringList haben willst, dann nimm doch TStringList.AddStrings.
Schau mal in der Delphi-Hilfe nach.

zu dem " " ist kein gültiger Integerwert:
hast Du vielleicht im Stringgrid eine Spalte als Integer-Spalte definiert?
Das .CommaText erzeugt dir nämlich Strings und beim Einlesen kannst Du aus einem ' ' oder '' keinen Integer mehr machen.

wo kann ich das nachschauen? Und wie kann ich das ändern?

Noobinator 16. Jul 2006 12:00

Re: Stringgrid speichern,/laden Problem
 
Also leute ich habe mal mit meinem Lehrer über das Problem geredet, und er meint, das liegt daran,das das eben ein STRINGGRID ist, und kein INTEGERGRID.
Gibt es irgendeine andere Komponente, mit der man sowas realisierten kann? also eine Tabelle?

marabu 16. Jul 2006 12:33

Re: Stringgrid speichern,/laden Problem
 
Hallo Noobinator,

irgendwann wirst du feststellen müssen, dass dein Problem nichts mit den Speicherroutinen zu tun hat. Es ist einfach ungeschickt anzunehmen, dass bei jedem Fach eine Note steht. Der folgende Code geht von FixedCols = 1 aus und verwendet die erste Spalte zur Anzeige des Durchschnittswertes einer Zeile, in der Integer-Werte eingetragen werden:

Delphi-Quellcode:
function Average(s: TStrings; iStart: Integer): String;
var
  i, iSum, iCount, iValue: Integer;
begin
  iSum := 0;
  iCount := 0;
  for i := iStart to Pred(s.Count) do
    if TryStrToInt(s[i], iValue) then
    begin
      Inc(iCount);
      Inc(iSum, iValue);
    end;
  if iCount = 0
    then Result := ''
    else Result := Format('%.1f', [iSum / iCount]);
end;

procedure TDemoForm.StringGridSetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
  with StringGrid do
    Cells[0, ARow] := Average(Rows[ARow], FixedCols);
end;
Die notwedigen Änderungen für einen gewichteten Durchschnitt (Hauptfächer=3, WPU=2, Nebenfächer=1) wirst du selbst machen müssen. Und was die Speicher-Routinen angeht, so solltest du diese zuerst analysieren, bevor du sie kopierst oder gar veränderst. Deine Änderungen an dem Code aus Beitrag #1 legen den Verdacht nahe, dass du die Routinen nicht verstanden hast - ich weiß wie der Code vor deinen Änderungen aussah.

Grüße vom marabu

Noobinator 16. Jul 2006 12:41

Re: Stringgrid speichern,/laden Problem
 
ok ich danke dir marabu :thumb:
werde mich nochmal durch den quellcode arbeiten müssen :roll:


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