Entwickler-Ecke

Dateizugriff - stringgrid-inhalt als txt-datei speichern


GigaNeko - Mo 08.05.06 17:04
Titel: stringgrid-inhalt als txt-datei speichern
so ich habe folgendes problem: ich habe ein zweispaltides stringgrid mit 49 zeilen. in die erste spalte kommen jeweils nur 3 buchstaben und in die zweite spalte kommt jeweils eine zahl (integer). ich möchte am besten eine prozedur haben mit der ich einen savedialog öffne und der inhalt des stringrids wie folgt abgespechert wird (als txt-datei):
AAA 123
BBB 45
CCC 678
DDD 9
...

leider habe ich noch nicht soviel mit externen dateien gearbeitet und wäre sehr froh darüben wenn mir jemand eine prozedur programmieren könnte mit der soche dateien direkt geschrieben werden könnten. es is aber sehr wichtig das in der textdatei nur die buchstaben stehen dann ein ' ' und die zahl sonst nichts. hoffentlich könnt ihr mir helfen?


Moderiert von user profile iconraziel: Topic aus Sonstiges (Delphi) verschoben am Di 09.05.2006 um 16:12


jsfrigo - Di 09.05.06 14:23

Also eine komplette Prozedur wird Dir hier keiner schreiben.
An welchem Teil Deines Programms hängt es denn?
Gruss
Jörg

PS Zum speichern von Textdateien gibt es hier eine Menge Beiträge


FFKangoroo - Di 09.05.06 18:11

Hab jetzt mal nich so viel zeit was zu schreiben. aber du kannst den text eines stringgrids afak als kommatext umwandeln. diesen kannste dann ganz einfach in einen string schreiben. dort die kommas per stringreplace durch leerzeichen ersetzen und per savetofile als txt abspeichern. hoffe es hat geholfen


FFKangoroo - Mi 10.05.06 09:04

So hier uach mal einen 2 min code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=1 to stringgrid1.RowCount do
memo1.Lines.Add(stringgrid1.rows[i].commatext);
memo1.text:=StringReplace(memo1.text, ',''  ', [rfReplaceAll, rfIgnoreCase]);
memo1.lines.SaveToFile('ausgabe.txt');
end;


PS diess Stringgrid hat noch eine fix row. daher fängt es bei 1 an zu zählen ohne fixrow musst du bei null anfangen.

Hoffe konnte helfen

FFKangoroo


GigaNeko - Sa 13.05.06 00:51

@FFKangoroo danke, ich habe aber noch eine frage. wie mache ich es, dass er bei deiner prozedur das erste row (in dem ich die rows durchnummeriere) nicht mit in das memofeld schreibt?


FFKangoroo - Sa 13.05.06 11:05


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
for i:=2 to stringgrid1.RowCount do
memo1.Lines.Add(stringgrid1.rows[i].commatext);
memo1.text:=StringReplace(memo1.text, ',''  ', [rfReplaceAll, rfIgnoreCase]);
memo1.lines.SaveToFile('ausgabe.txt');
end;


;)

erste zeile=0 // wahrscheinlich eine Fixrow
zweite zeile=1 // weiss nicht warum er die Auslassen soll kannst ja in die Fixrow auch die überschrift reinschreiben
dritte zeile=2 // deine gewünschte zeile

klappt es?

FFKangoroo


GigaNeko - So 14.05.06 11:45

ahh sorry ich hatte mich vertahn. ich meinte eigentlich, wie schaffe ich es , dass die prozedur die linke spalte des stringrids nicht mitliest? weil ich dort die zeilen nummeriert habe.


raiguen - So 14.05.06 16:08

Moin :-)
Ganz einfach wie bei den Zeilen: Spaltennummerierung fängt auch hier bei 0 an, das ist meistens die FixedColumn (=feste Spalte). Also fängt Deine Schleife nicht bei 0 an sondern bei 1: for Spalte := 1 to Spaltenanzahl do ... ;-)


GigaNeko - So 14.05.06 16:55

ich will aber in die prozedur von FFKangoroo einbauen, dass die erste spalte nicht in das memofeld übertragen wird.


raiguen - Mi 17.05.06 13:27

Moin :-)
uups, hatte Deine Frage nicht richtig gelesen bzw. etwas falsch gedeutet :oops:
So müsste es machbar sein:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var zeile, spalte:Integer;
    S: String;
begin
  for zeile := StringGrid1.FixedRows to Stringgrid1.RowCount -1 do
    begin
      S := '';
      //--Spalten einzeln durchgehen und Inhalt in String
      for spalte := 1 to StringGrid1.ColCount -1 do
        S := S + StringGrid1[zeile,spalte] + ' ';
      Memo1.Lines.Add(Trim(S)); //Trim-> Leerzeichen am Anfang bzw Ende eleminieren
  end;
  Memo1.Lines.SaveToFile('ausgabe.txt');
end;

andere Möglichkeit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var zeile, P :Integer;
    S: String;
begin
  for zeile := StringGrid1.FixedRows to Stringgrid1.RowCount -1
      S := StringGrid1.Rows[zeile].CommaText;
      //--Stelle des 1. vorkommenden Kommas
      P := Pos(',', S);
      //--String ab dem 1.Komma ins Memo, vorher evtl. Leerzeichen am Anfang bzw Ende eleminieren
      Memo1.Lines.Add(Trim(Copy(S, P+1255)));
  end;
  Memo1.Text:=StringReplace(Memo1.Text, ',''  ', [rfReplaceAll, rfIgnoreCase]);
  Memo1.Lines.SaveToFile('ausgabe.txt');
end;