![]() |
Textdatei in Stringgrid wandeln - wie geht das???
Hi @ll!
Hab mir grad ein kleines Proggie gemacht, daß verschiedene Daten in Tabellenform in eine Textdatei speichert. So sieht das aus: Name [5] Anschrift [5] Ort -> bedeutet, 5 Leerzeichen sind dazwischen . . . . . Name [5] Anschrift [5] Ort -> bedeutet, 5 Leerzeichen sind dazwischen Jetzt will ich die Textdatei in einen Stringgrid laden, um mir das in dem Programm in einem Memo anzuzeigen. Kann mir da jemand weiterhelfen??? |
Hallo und herzlich willkommen!
Also nun in ein StringGrid oder ein Memo, oder beides? In ein Memo kannst du die Datei ganz leicht mit
Code:
laden.
Memo.Lines.LoadFromFile('C:\test.txt')
In ein StringGrid wirds schon schwieriger, da musst du dann den text "auseinandernehmen" :mrgreen: (sprich nach Leerzeichen als Seperatoren trennen). Unter Umständen wäre es dann wahrscheinlich einfacher du speicherst die Daten gleich in eine Ini Datei, mit der kann man komfortabel auf die Daten zugreifen. Dafür gibts auch schon jede Menge Codebeispiele hier im Forum einfach mal suchen (TIniFile, ReadString, WriteString). Gruß, Sebastian |
Jo, ich hatte mich vielleicht etwas komisch ausgedrückt. Ich will das nicht in ein Memo angezeigt bekommen, sondern in einem Stringgrid. Die Laderoutinen - damit das geladen wird - hab ich schon, aber eben das Umwandeln von dieser Textdatei in das Strunggrid fehlt mir noch. Oder ich könnte vielleicht auch versuchen die Daten gleich als Stringgrid abzuspeichern, hat da vielleicht jemand ne Idee???
So was in der Art -> nur als Beispiel
Delphi-Quellcode:
Nur eben als Stringgrid.
assignfile(f,'c:\text.txt');
append(f); writeln(f,'Name'+' '+'Anschrift'+' '+'Ort'); closefile(f); |
Nur mal so als Tipp, du kannst dir Arbeit ersparen wenn du die Klasse TStringList für deine Textdatei verwendest, damit kanst du sowohl einfach auf die Strings in jeder einzelnen Zeile als auch auf den Text als ganzes zugreifen, Lade und Speicherroutienen sind auch enthalten. Ich würde dir trotzdem eine Ini empfehlen, wenn du Daten in Plaintext speichern willst, das könnte dann so aussehen:
Code:
So könntest du direkt auf die einzelnen Daten zugreifen, ohne "auseinandernehmen". Auch das Speichern wär nicht das Problem. Wenn du dich zu einer Ini durchringen (:mrgreen:) kannst würd ich dir auch einen Beispielcode basteln.
[id1]
name=Gerhard Schröder anschrift=bundeskanzleramt ort=berlin [id2] name=emma eulenschwanz anschrift=blümchenstraße 1 ort=neustadt [id3] ... ... ... Gruß, Sebastian |
Eine INI wäre nicht das Problem. Im Endeffekt ja egal, ob ich das als INI oder als TXT abspeichere. Könntest Du mir da mal so einen BeispielCode rüberschicken???
|
Der Unterschied besteht lediglich in dem einfacheren (weil vorgefertigten) Zugriff auf die Datei :mrgreen:
Beispiel kommt sofort Gruß, Sebastian |
Aha, hmm - hab ein ganz kleines Problem. Wo finde ich die Komponente für die TStringlist, kann die einfach nicht finden, Delphi 7.
|
Auf der zweiten Palettenseite, das 4. Icon
|
@sakura
Hab ich, aber das zeigt bei mir Stringgrid an. Ist das dasselbe - bin noch net der Profi???? |
Oops, ich hatte StringGrid gelesen :oops: StringList ist keine Komponente. Die StringList kannst Du nur im Quelltext ansprechen.
|
Hallo nochmal, hier der Code zum laden und speichern des Inhalts eines StringGrids. Ich bin von drei Spalten ausgegangen, oben eine Zeile in der "Name", "Anschrift" und "Ort" steht, also ist die zweite Zeile (Index 1) die erste von oben in die man schreiben kann. Ich habs nicht ausgiebig getestet, sollte aber klappen:
Delphi-Quellcode:
Bei Fragen nur melden :D
uses IniFiles;
... procedure TForm1.ButtonSpeichernClick(Sender: TObject); var ini: TIniFile; i : Integer; begin ini := TIniFile.Create('C:\Test.ini'); try i := 1; with StringGrid1 do begin while Cells[0,i] <> '' do begin ini.WriteString('id'+IntToStr(i),'Name',Cells[0,i]); ini.WriteString('id'+IntToStr(i),'Anschrift',Cells[1,i]); ini.WriteString('id'+IntToStr(i),'Ort',Cells[2,i]); inc(i) end end finally FreeAndNil(ini) end end; procedure TForm1.ButtonLadenClick(Sender: TObject); var ini: TIniFile; SL : TStringList; i : Integer; begin ini := TIniFile.Create('C:\Test.ini'); SL := TStringList.Create; try ini.ReadSections(SL); with StringGrid1 do begin for i := 0 to pred(SL.Count) do begin Cells[0,succ(i)] := ini.ReadString(SL[i],'Name',''); Cells[1,succ(i)] := ini.ReadString(SL[i],'Anschrift',''); Cells[2,succ(i)] := ini.ReadString(SL[i],'Ort',''); end end finally FreeAndNil(SL); FreeAndNil(ini) end end; Gruß, Sebastian |
Danke erstmal, werd's gleich mal testen.
|
Hab's mal getestet. Das Programm läuft zwar, aber es speichert in der INI-Datei nix ab. Hab's mal auf meine Bedürfnisse angepaßt. Der Fehler liegt bestimmt bei mir in den folgenden 2 Zeilen.
Es soll der eingeloggte Benutzer abgespeichert werden und das Datum. Mit einer textdatei hat das schon gefunzt.
Delphi-Quellcode:
---------------------------------------------------------------------------
ini.WriteString('id'+IntToStr(i),LoggedOnUserNameEx(NameSamCompatible),Cells[0,i]);
ini.WriteString('id'+IntToStr(i),Datetostr(now),Cells[1,i]);
Delphi-Quellcode:
begin
ini := TIniFile.Create('c:\test.ini'); try i := 1; with StringGrid2 do begin while Cells[0,i] <> '' do begin ini.WriteString('id'+IntToStr(i),LoggedOnUserNameEx(NameSamCompatible),Cells[0,i]); ini.WriteString('id'+IntToStr(i),Datetostr(now),Cells[1,i]); inc(i) end end finally FreeAndNil(ini) end end; end; end; |
Ich hab auch nochmal getestet, bei mir läufts!
Hast du auch FixedCols auf 0? Denn es wird mit
Delphi-Quellcode:
getestet ob ein Name drinsteht, und der muss in der ganz linken Spalte stehen. Wenn du nicht FixedCols auf 0 haben willst musst du die Zahlen entsprechend anpassen!
while Cells[0,i] <> '' do ...
Gruß, Sebastian |
Hab zwar auch FixedCols auf 0, aber mal sehen ....
... werde es diese Nacht nochmal probieren. Muß ja irgendwie funzen. Thx nochmal für das Beispiel. |
Nochmal zur Erklärung von Ini.Writestring:
Der erste Parameter bereichnet die Sektion in welche geschrieben werden soll, ich hab für jede Zeile eine Sektion genommen:
Delphi-Quellcode:
Der zweite Parameter ist die Name des Eintrags, unter dem man den Wert dann später wieder abrufen kann. Ich hab in dem Code immer "Name" für den Wert aus dem Feld Name, "Anschrift" für den Wert aus Anschrift, und "Ort" für den Wert aus Ort genommen.
'id'+IntToStr(i)
Der dritte Parameter ist das, was du eigentlich reinschreibst, also die Daten die du speichern willst. Der Rest dient nur um es Später wieder zu finden So siehts dann in der Ini aus:
Code:
Du solltest deshalb nicht eine Variable als zweiten Parameter verwenden, sondern eine Konstante (wie zum Beispiel 'Name'), damit du später weißt, wo du den Wert auslesen kannst.
[id1] <-- Sektion-Name
Name=Irgendwer <-- Name des Eintrags (hier "Name") und Wert des Eintrags (hier "Irgendwer" Gruß, Sebastian |
@Grotesquery
Nach einigem Hin- und Herprobieren hab ich's jetzt endlich hinbekommen so wie ich es will. Ich Danke Dir nochmal für Deine Hilfe und den Beispielcode, ohne dem ich wohl immer noch grübeln würde. |
Hab nochmal ne Frage!
Geht das auch, wenn daß die Daten auch automatisch abspeichert werden, wenn man auf "Save" klickt??? D.h. daß das Datum automatisch geholt wird und in die Datei reingeschrieben wird, ohne daß man es vorher eingibt??? Und wenn ja, was muß man da im Code ändern??? cu, Lima |
Hallo lima, kein Problem :)
Um das Datum zu speichern gehst du genauso vor wie beim abspeichern der einzelnen Zellen auch, nur dass du dafür statt dem Inhalt einer Zelle die den Rückgabewert der Funktionen now oder date nimmst. Da du es ja wahrscheinlich später als String brauchst schlage ich vor den TDateTime-Wert den diese Funktionen zurückliefern als String zu speichern, in einen String kannst du den Wert mit
Delphi-Quellcode:
umwandeln, umgekehrt in einen TDateTimeWert mit
TimeToStr(now); //erwiedert die aktuelle Zeit
DateTimeToStr(now); //erwiedert Datum + Zeit DateTimeToStr(date); //erwiedert das Datum
Delphi-Quellcode:
soviel zum umgang mit Daten und Zeit, jetzt der code um das Datum zu speichern:
StrToTime('00:00:00'); //liefert zum Beispiel einen DateTimewert für 0Uhr
StrToDateTime('datum und zeit')
Delphi-Quellcode:
Hoffe du kommst damit klar, sonst einfach fragen.
ini.WriteString('id'+IntToStr(i),'Datum',DateTimeToStr(date));
//schreibt in die ini in der Sektion idX, in den Eintrag 'Datum' das Datum als String Gruß, Sebastian |
Jetzt funzt's. Danke nochmal.
Das mit dem Datum und der Zeit war schon klar, bis auf Datetimetostr(date). Bedank ich mich nochmal bei Dir und wünsch Dir einen guten Rutsch nach 2003!!! :nerd: :party: |
Hehe kein Problem :D
Danke, ich wünsch auch einen guten Rutsch! (Auch an alle anderen) :party: Gruß, Sebastian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 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