Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Textdatei in Stringgrid wandeln - wie geht das??? (https://www.delphipraxis.net/1918-textdatei-stringgrid-wandeln-wie-geht-das.html)

lima 30. Dez 2002 16:34


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???

Sebastian Nintemann 30. Dez 2002 17:02

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:
Memo.Lines.LoadFromFile('C:\test.txt')
laden.
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

lima 30. Dez 2002 17:12

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:
assignfile(f,'c:\text.txt');
append(f);
writeln(f,'Name'+'    '+'Anschrift'+'    '+'Ort');
closefile(f);
Nur eben als Stringgrid.

Sebastian Nintemann 30. Dez 2002 17:29

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:
[id1]
name=Gerhard Schröder
anschrift=bundeskanzleramt
ort=berlin

[id2]
name=emma eulenschwanz
anschrift=blümchenstraße 1
ort=neustadt

[id3]
...
...
...
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.

Gruß, Sebastian

lima 30. Dez 2002 17:32

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???

Sebastian Nintemann 30. Dez 2002 17:36

Der Unterschied besteht lediglich in dem einfacheren (weil vorgefertigten) Zugriff auf die Datei :mrgreen:
Beispiel kommt sofort

Gruß, Sebastian

lima 30. Dez 2002 17:38

Aha, hmm - hab ein ganz kleines Problem. Wo finde ich die Komponente für die TStringlist, kann die einfach nicht finden, Delphi 7.

sakura 30. Dez 2002 17:40

Auf der zweiten Palettenseite, das 4. Icon

lima 30. Dez 2002 17:42

@sakura

Hab ich, aber das zeigt bei mir Stringgrid an. Ist das dasselbe - bin noch net der Profi????

sakura 30. Dez 2002 17:49

Oops, ich hatte StringGrid gelesen :oops: StringList ist keine Komponente. Die StringList kannst Du nur im Quelltext ansprechen.

Sebastian Nintemann 30. Dez 2002 17:58

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:
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;
Bei Fragen nur melden :D

Gruß, Sebastian

lima 30. Dez 2002 18:00

Danke erstmal, werd's gleich mal testen.

lima 30. Dez 2002 18:54

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;

Sebastian Nintemann 30. Dez 2002 19:04

Ich hab auch nochmal getestet, bei mir läufts!

Hast du auch FixedCols auf 0?
Denn es wird mit
Delphi-Quellcode:
while Cells[0,i] <> '' do ...
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!

Gruß, Sebastian

lima 30. Dez 2002 19:08

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.

Sebastian Nintemann 30. Dez 2002 19:17

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:
'id'+IntToStr(i)
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.

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:
[id1] <-- Sektion-Name
Name=Irgendwer <-- Name des Eintrags (hier "Name") und Wert des Eintrags (hier "Irgendwer"
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.


Gruß, Sebastian

lima 31. Dez 2002 02:37

@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.

lima 31. Dez 2002 09:25

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

Sebastian Nintemann 31. Dez 2002 11:19

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:
 TimeToStr(now); //erwiedert die aktuelle Zeit
 DateTimeToStr(now); //erwiedert Datum + Zeit
 DateTimeToStr(date); //erwiedert das Datum
umwandeln, umgekehrt in einen TDateTimeWert mit
Delphi-Quellcode:
StrToTime('00:00:00'); //liefert zum Beispiel einen DateTimewert für 0Uhr
StrToDateTime('datum und zeit')
soviel zum umgang mit Daten und Zeit, jetzt der code um das Datum zu speichern:
Delphi-Quellcode:
ini.WriteString('id'+IntToStr(i),'Datum',DateTimeToStr(date));
//schreibt in die ini in der Sektion idX, in den Eintrag 'Datum' das Datum als String
Hoffe du kommst damit klar, sonst einfach fragen.

Gruß, Sebastian

lima 31. Dez 2002 11:26

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:

Sebastian Nintemann 31. Dez 2002 11:50

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 21:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz