![]() |
Stringgrid speichern,/laden Problem
Delphi-Quellcode:
mithilfe dieser Proceduren Speichere ich ein Stringgrid ab.
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; 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 |
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. |
Re: Stringgrid speichern,/laden Problem
Delphi-Quellcode:
Quelle:
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; ![]() 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 |
Re: Stringgrid speichern,/laden Problem
Danke leute.
Werde mal testen ob das jetzt geht. |
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? |
Re: Stringgrid speichern,/laden Problem
Zitat:
|
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? |
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:
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.
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; Grüße vom marabu |
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