Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Memo2StringGrid
drache999 - So 04.03.18 21:28
Titel: Memo2StringGrid
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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90:
| 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 TForm1.Button2Click(Sender: TObject); begin SaveStringGridToFile(StringGrid1, '.\daten.dat'); 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;
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 s := StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]; if Length(s) > 0 then begin Edit1.Text:= s; Memo1.Text:= StringGrid1.Cells[StringGrid1.Col+1, StringGrid1.Row]; end; end; |
Moderiert von Narses: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Datenbanken verschoben am So 04.03.2018 um 22:00
Delete - Di 06.03.18 16:56
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Mo 12.03.18 23:50
Hallo Frühlingsrolle,
danke für die Antwort. Doch leider funktioniert es nicht so, wie du es geschrieben hast. Ich habe den Code eingepflegt.
Du fragtes, was ich mit dem Code meine:
StringGrid1.Cols[0].Add(Trim(Edit1.Text)).Size;
Geht es um das "TRIM" )
Es soll alle vorangegangene Leerzeichem im Edit löschen.
Delete - Di 13.03.18 02:04
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Di 13.03.18 23:38
Hallo Frühlingsrolle,
soweit sieht es gut aus. Doch hast du es mal mit einem Edit und einem Memo ausprobiert?
Bei meinem Programm funktioniert es solange ich in der Memoeingabe nur eine Zeile rein schreibe.
Wenn ich aber im Memo ein Enter mache, dann macht er es auch richtig solange ich das Programm nicht neu starte.
Delete - Mi 14.03.18 01:39
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Do 15.03.18 20:42
Hallo Frühlingsrolle,
danke für deine Geduld.
Ok,
Eingabe: Ausgabe:
Edit --> StringGrid Spalte 1
Memo --> StringGrid Spalte 2
Und das dann Zeile für Zeile
Sobald ich eine Zelle im StringGrid Spalte 1 anklicke sollen die Einträge der Zeile (Spalte1 + 2) wieder in das Edit und in das Memo übergeben werden.
Mein Problem ist folgendes:
Sobald ich im Memo ein Zeilenumbruch mache mit Enter, so wird es richtig in das StringGrid übergeben. Klicke ich in die erste Spalte so
werden die Daten wieder richtig in das Edit und das Memo übergeben.
Schließe ich das Programm, und öffne es wieder, klicke dann in die erste Spalte, so bekomme ich nicht alles in das Memo zurück.
PS: Wenn ich einen Quellcode hier reinbringen möchte, wie mache ich das richtig? Ich meine, das es nicht als normalen Text angezeigt wird.
Delete - Do 15.03.18 21:04
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Do 15.03.18 22:46
OK, jetzt wird es zumindest alles im Memo übergeben. Nichts wird in der nächsten Zelle vom StringGrid übergeben.
Doch im Memo werden jetzt jegliche Zeilenumbrüche ignoriert. Sie wurden entfernt
Delete - Fr 16.03.18 00:02
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Fr 16.03.18 00:22
Mal ne Frage.
Hast du alles selber mal ausprobiert? Hast du das Programm mal in Delphi geladen?
Jetzt ist es so, das die erste Spalte vom StringGrid nicht im Edit sondern im Memo geladen wird.
Und der Text untereinander.
Delete - Fr 16.03.18 01:00
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Fr 16.03.18 01:07
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145:
| unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.ComCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Edit1: TEdit; StringGrid1: TStringGrid; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure StringGrid1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
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 TForm1.Button2Click(Sender: TObject); begin SaveStringGridToFile(StringGrid1, '.\daten.dat'); 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;
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); var s: string; begin StringGrid1.RowCount := StringGrid1.RowCount + 1; StringGrid1.Cols[0].Add(Trim(Edit1.Text)).Size; StringGrid1.Cols[1].Add(Memo1.Lines.Text.Replace(sLineBreak, '')); Edit1.Clear; Memo1.Clear; Edit1.SetFocus; end;
procedure TForm1.StringGrid1Click(Sender: TObject); var s: string; i: Integer; c: Char; begin Memo1.Clear; s := StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]; Variante 1 for i := 1 to Length(s) do Memo1.Lines.Add(s[i]); end; |
so sieht es im moment aus
Delete - Fr 16.03.18 01:11
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Fr 16.03.18 01:19
es soll sein:
beim laden der datei soll beim anklicken der spalte 1 vom stringgrid
folgendes übergeben werden.
spalte 1 in edit
spalte 2 in das memo
jetzt passiert aber folgendes:
spalte 1 wird in das memo übergeben. und der text oder das wort untereinander
Delete - Fr 16.03.18 01:37
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Fr 16.03.18 01:46
habe es mal ausprobiert.
Moderiert von Narses: BMP->PNG, im Beitrag angezeigt
Delete - Fr 16.03.18 18:34
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Sa 17.03.18 10:29
Hallo,
ok, jetzt wird alles im Memo übergeben. Aber wenn ich vorher einen Text im Memo eingegeben habe, so möchte ich doch nicht,
das er Zeichen für Zeichen untereinander wieder ausgegeben wird. ;)
Delete - Sa 17.03.18 16:20
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Mo 19.03.18 21:27
Delphi-Quelltext
1:
| s := SplitString(StringGrid1.Cells[StringGrid1.Col + 1, StringGrid1.Row], ' '); |
Beim Kompilieren meckert er "SplitString" an
Delete - Mo 19.03.18 21:53
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Mo 19.03.18 22:20
ist drin.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149:
| unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Types, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.ComCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Edit1: TEdit; StringGrid1: TStringGrid; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure StringGrid1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
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 TForm1.Button2Click(Sender: TObject); begin SaveStringGridToFile(StringGrid1, '.\daten.dat'); 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;
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); var s: string; begin StringGrid1.RowCount := StringGrid1.RowCount + 1; StringGrid1.Cols[0].Add(Trim(Edit1.Text)).Size; StringGrid1.Cols[1].Add(Memo1.Lines.Text.Replace(sLineBreak, ' ')); Edit1.Clear; Memo1.Clear; Edit1.SetFocus; end;
procedure TForm1.StringGrid1Click(Sender: TObject); var s: TStringDynArray; i: Integer; begin if StringGrid1.Col = 0 then begin Edit1.Clear; Memo1.Clear; Edit1.Text := StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];; s := SplitString(StringGrid1.Cells[StringGrid1.Col + 1, StringGrid1.Row], ' '); for i := 0 to Length(s) - 1 do Memo1.Lines.Add(s[i]); end; SendMessage(Memo1.Handle, WM_VSCROLL, SB_TOP, 0); end;
end. |
Delete - Mo 19.03.18 23:35
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Mo 19.03.18 23:52
ok, jetzt kein fehler. aber immer noch nicht so wie es sein sollte ;(
drache999 - Mo 19.03.18 23:54
Delphi-Quelltext
1:
| StringGrid1.Cols[1].Add(Memo1.Lines.Text.Replace(sLineBreak, ' ')); |
kann man nicht ein CR + LF eingeben? Ich weiß das ein String zurück gegeben wird. Aber wie kann man es anders realisieren?
Delete - Di 20.03.18 00:08
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Di 20.03.18 00:14
danke aber das du die geduld hattest
Delete - Di 20.03.18 00:18
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Di 20.03.18 00:26
danke dir,
das wäre eine alternative.
aber in dem memo können auch zeichen wie das komma drin vorkommen.
dann würde es automatisch ein zeilenumbruch machen.
Delete - Di 20.03.18 00:32
- Nachträglich durch die Entwickler-Ecke gelöscht -
drache999 - Di 20.03.18 00:37
wie kann man es ganz anders aufbauen damit der text im memo 1:1 übergeben wird und dann auch wieder so geladen wird.
vielleicht kein StringGrid? Vielleicht eine andere Komponennte?
drache999 - Di 20.03.18 00:40
ich habe ein "#" eingepflegt. Das wird bestimmt nicht im Memo vorkommen. Und somit funktioniert es !
Ich danke dir vielmals! :)
Delete - Di 20.03.18 00:49
- Nachträglich durch die Entwickler-Ecke gelöscht -
Sinspin - Di 20.03.18 08:58
Hey, bevor Du dich selber damit rumärgerst das zu implementieren, die TStringList unterstützt das CSV Format.
Dafür weist Du der Eigenschaft CommaText einen String zu oder ließt ihn aus. Jeder Eintrag in der StringList entspricht dann einer Spalte einer Zeile in deiner Tabelle.
Dabei ist es egal ob der Text Kommas, Punkte oder andere Sonderzeichen enthält.
Mit einer zweiten TStringList kannst Du die einzelnen Zeilen deiner Tabelle dann einfach laden und speichern.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!