Memo2StringGrid

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
drache999
Beiträge: 2
Registriert: So 4. Mär 2018, 11:48

Memo2StringGrid

Beitrag von drache999 »

Hallo Leute,
ich habe ein Problem mit meiner StringGrid.

Ich habe ein Edit und ein Memo. (Später sollen auch weitere Edits im Programm vorhanden sein). Jetzt aber nur das Minimale. :)

Ich möchte die Einträge des Edits und des Memos in mein StringGrid rein bringen. Das macht es auch.
Ich speichere es in eine Datei. Das macht es.
Wenn ich in meinem Memo mehr als eine Zeile habe, so wird es auch in mein StringGrid gespeichert.
Solange ich das Programm nicht schließe und in meine erste Spalte im StringGrid klicke, kann ich meine Daten zurück holen und anzeigen lassen.

Doch jetzt kommt mein Problem:
Wenn ich das Programm schließe und meine Daten lade, so werden die Einträge meiner Memo in mehrere Zeilen des StringGrid aufgeteilt.
Sie werden gesplittet.

Was mache ich falsch?


anbei der Code:

// ###################################
// # SaveStringGrid2File speichern #
// ###################################
// Anfang
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;
// ###################################
// # SaveStringGrid2File speichern #
// ###################################
// Ende

procedure TForm1.Button2Click(Sender: TObject);
begin
SaveStringGridToFile(StringGrid1, '.\daten.dat');
end;


// ###############################
// # SaveStringGrid2File laden #
// ###############################
// Anfang
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;
// ###############################
// # SaveStringGrid2File laden #
// ###############################
// Ende

procedure TForm1.Button3Click(Sender: TObject);
begin
if FileExists('.\daten.dat') then LoadStringGridFromFile(StringGrid1, '.\daten.dat');
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Clear;
Memo1.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Cols[0].Add(Trim(Edit1.Text)).Size;
StringGrid1.Cols[1].Add(Trim(Memo1.Lines.Text));
Edit1.Clear;
Memo1.Clear;
Edit1.SetFocus;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
var
s: string;
begin
// Text der Zelle holen
s := StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
if Length(s) > 0 then //Länge des Text übeprüfen
begin
Edit1.Text:= s; // Text ausgeben
Memo1.Text:= StringGrid1.Cells[StringGrid1.Col+1, StringGrid1.Row];
end;
end;

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

Re: Memo2StringGrid

Beitrag von wp_xyz »

Einen offensichtlichen Fehler sehe ich nicht. Es sei denn, deine Memo-Texte enthalten irgendwo ein Komma, dann funktioniert das mit dem CommaText natürlich nicht. Welche Lazarus-Version hast du denn? Ich meine es gab da vor einiger Zeit Änderungen mit CommaText o.ä.

Übrigens, das StringGrid hat schon eingebaute Methoden, um den Inhalt in einer CSV-Datei zu speichern bzw. daraus zu lesen:

Code: Alles auswählen

procedure SaveToCSVFile(AFileName: string; ADelimiter: Char=','; WriteTitles: boolean=true; 
  VisibleColumnsOnly: boolean=false);
 
procedure LoadFromCSVFile(AFilename: string; ADelimiter: Char=',';
  UseTitles: boolean=true; FromLine: Integer=0; SkipEmptyLines: Boolean=true);

charlytango
Beiträge: 842
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Memo2StringGrid

Beitrag von charlytango »

drache999 hat geschrieben:Wenn ich das Programm schließe und meine Daten lade, so werden die Einträge meiner Memo in mehrere Zeilen des StringGrid aufgeteilt.


Dein Memotext enthält nicht zufällig die gleichen Trennzeichen (Komma) die du als Trenner beim Speichern des Grids verwendest ?
Vor dem Speichern prüfen ob die Zeichen die als Trenner beim Speichern verwendet werden nicht doch im Inhalt eingegeben wurden.

BTW: der Grid kennt eigene Prozeduren zum Speichern und Laden
http://wiki.freepascal.org/Grids_Reference_Page#Differences_between_Lazarus_and_Delphi_grids
z.B. unter "procedure SaveToCSVFile"

Edit: da war ich wohl zu langsam ;)

drache999
Beiträge: 2
Registriert: So 4. Mär 2018, 11:48

Re: Memo2StringGrid

Beitrag von drache999 »

ich arbeite mit Delphi XE4

Benutzeravatar
theo
Beiträge: 10461
Registriert: Mo 11. Sep 2006, 19:01

Re: Memo2StringGrid

Beitrag von theo »

drache999 hat geschrieben:ich arbeite mit Delphi XE4

Hier ist nicht Delphi.
Falsches Forum?

Antworten