.txt Datei in einen Stringgrid einfügen??

Für Fragen von Einsteigern und Programmieranfängern...
Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

.txt Datei in einen Stringgrid einfügen??

Beitrag von Foxi1896 »

hey,

ich möchte ein .txt datei mit Daten z.B.
X y z
1 3 4
1,4 3,2 5
2,1 33 44

einmal öffnen über opendialog und dann halt in einen stringgrid einfügen das x y z halt ihre eigene spalten haben mit den jeweiligen weiten in den zeilen.

gruß
foxi

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von hde »

dann mach das doch, woran scheitert's
hde

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Foxi1896 »

nein es liegt daran das ich vor einer woche mit delphi angefangen und dann direkt auch zu lazarus gewechselt bin .. und ich keine ahnung habe .. =/

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von hde »

Sorry, aber ganz ohne Ahnung kann man nicht programmieren, weder mit Delphi noch mit Lazarus. :wink:
Lies dir ein Tutorial durch oder ein Handbuch ..
ein wenig Ahung von Pascal muss man schon haben
hde

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Michl »

Wenns nicht unbedingt *.txt sein muss, geht das so: http://www.delphipraxis.net/7866-datei- ... ffnen.html (Stringgrid entsprechend)

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Linkat »

Hallo Foxi,
zunächst herzlich willkommen im Lazarusforum und viel Spaß und Erfolg beim erlernen der Programmiersprache Pascal und der Benutzeroberfläche Lazarus.

So erstmal ein bischen Kritik. Ich habe jetzt schon ein paar Deiner Beiträge gelesen und ich sehe Du gehörst zu den Zeitgenossen, die alles in Kleinbuchstaben, alles in einem Satz, ohne Satzzeichen und das und dass nicht unterscheiden können. Außerdem ist der Text nicht verständlich ausformuliert. Ich muss sagen, so einen Text zu lesen und erst recht zu verstehen fällt ungemein schwer. Du möchtest Hilfe vom Forum und mutest allen Lesern Deinen Text zu.

Ich möchte jetzt nicht eine Diskussion über "saubere" Texte vom Zaun brechen, also bitte zu diesem Thema keine zusätzliche Komentare.

So nun zu Deinem Problem.

Lade Deinen Text-File in eine StringListe.

Code: Alles auswählen

StringListe.LoadFromFile('text.txt');
Mit der StringList-Methode DelimitedText kannst du jede Zeile zerlegen und dann in die Zellen des StringGrids kopieren.

Viel Erfolg.

Gruß,
Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Foxi1896 »

@Linkat: Werde versuchen ab jetzt ordentlicher zu schreiben.

Ok, so etwas kapiert habe ich Lazarus ja schon dadurch das ich mir Tutorials angesehen habe.
Ich bekomme es auch ohne Probleme hin die .txt Datei in einem Memo zu öffnen.
Aber das mit StringGrid bzw Matizen kapiere ich einfach gar nicht.
StringL ist ja in diesem Video etwas erklärt http://www.youtube.com/watch?v=Ys60OVxtpYk.
Alle Versuche die ich unternommen habe enden darin das nur zwei wörter im StringGrid sind oder nur in der ersten Zeile.

Gruß,
Foxi

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von hde »

Es ist meist sinnvoll wenn man zeigt was man versucht hat und sagt wo es klemmt.

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Foxi1896 »

Hier ist das, was bisher am Erfolgreichsten aussah... nur es ist übernommen von irgendeiner Seite (hab schon einige durchgeschaut) und angepasst.

Code: Alles auswählen

 
procedure TForm1.MenuItem5Click(Sender: TObject);
begin
 
if Form1.OpenDialog1.Execute then
  begin
 
    if FileExists(Form1.OpenDialog1.Filename) = TRUE then
    begin
    Form1.Memo1.Lines.LoadFromFile(Form1.OpenDialog1.Filename);
 
    end;
  end;
end;
 
 
function ParseStr(var s: string; delimiters: string; purge: boolean = true): string;
var
  i: integer;
begin
  i := 0;
  while (i < Length(s)) and (Pos(s[Succ(i)], delimiters) = 0) do
    Inc(i);
  Result := Copy(s, 1, i);
  Delete(s, 1, i + Ord(purge));
end;
 
procedure ExtractFields(s, delimiters: string; sl: TStrings);
var
  t: string;
begin
  sl.Clear;
  while s <> '' do begin
    t := ParseStr(s, delimiters, true);
    if t <> '' then
      sl.Add(t);
  end;
end;
 
 
procedure TForm1.MenuItem6Click(Sender: TObject);
var
  i: integer;
begin
  StringGrid1.RowCount := Memo1.Lines.Count;
  for i := 0 to Pred(Memo1.Lines.Count) do
    ExtractFields(Memo1.Lines[i], ';', StringGrid1.Rows[i]);
end;                                                                                                        
Was mich halt stört das es hier halt vom Memo zum StringGrid geht und ich möchte es gerne direkt reingeladen haben. (Außerdem ist alles in der ersten Spalte =/)

Also wo es genau Klemmt ist der Anfang/ Ansatz.
Muss ja glaube erst eine Matrix erstellen fürs StringGrid damit es weiß wie groß und wohin, ka?

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Soner »

Mach doch selber so z.B.:

Code: Alles auswählen

 
procedure LadeDatei(ADateiName: string; AGrid: TStringGrid);
var c,r,i,k :integer;
    aList : TStringList;
    aLine, aWort : string;
begin
  aList := TStringList.Create;  
 try
  aList.LoadFromFile(ADateiName); 
 
  //erst grid leeren
  for r:=0 to AGrid.RowCount-1 do
    for c:=0 to AGrid.ColCount-1 do
       AGrid.Cells[c,r]:='';
 
  r:=-1;  
 
  for k:=0 to AList.Count-1 do begin    //Stringlist Zeilen durchlaufen
 
    Inc(r); //zeilennr in Grid erhöhen
    if r>=AGrid.RowCount then  AGrid.RowCount:=r+1;
 
    c:=0; //erste spalte
 
    aLine:=aList[k];
    aWort:=''
    for i:=1 to Length(aLine) do begin //Zeichen einer Zeile durchlaufen
 
       case aLine[i] of
         ' ': begin //Trennzeichen (Leerzeichen) erreicht Wert zum Grid 
             if c>=AGrid.ColCount then  AGrid.ColCount:=c+1;
             AGrid.Cells[c,r]:=aWort;
             aWort:='';
             Inc(c);
          end;
        else aWort:=aWort+aLine[i];
 
       end; //von case ...
 
    end; //von for i:= ...
 
   //und lezte Zahl zum Grid. "For i:=0" wurde beendet weil Zeilenende erreicht aber es kann noch ein Zahl vorhanden sein.
   if aWort<>'' then begin
     if c>=AGrid.ColCount then  AGrid.ColCount:=c+1;
     AGrid.Cells[c,r]:=aWort;
   end;
 
  end; //von for k:=0 ....
 
 finally
  aList.Free;
 end;
 
end;
 
Ich habe die Prozeudur gleich hier geschrieben, es musste funktionieren.

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Foxi1896 »

Was muss ich jetzt machen um das zu Starten?
Also compilieren tut es. Ohne Fehler aber wie öffne ich jetzt die Datei?
Habe ein ButtonClick vor gemacht aber dann geht wieder nix =/

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Soner »

Foxi1896 hat geschrieben:Was muss ich jetzt machen um das zu Starten?
Also compilieren tut es. Ohne Fehler aber wie öffne ich jetzt die Datei?
Habe ein ButtonClick vor gemacht aber dann geht wieder nix =/
Ist doch einfach, In dein "procedure TForm1.MenuItem5Click(Sender: TObject);":

Code: Alles auswählen

 
procedure TForm1.MenuItem5Click(Sender: TObject);
begin
   if Form1.OpenDialog1.Execute then  begin
 
    if FileExists(Form1.OpenDialog1.Filename) = TRUE then    begin
    //Form1.Memo1.Lines.LoadFromFile(Form1.OpenDialog1.Filename);
 
   // HIER =====================================================
    LadeDatei(Form1.OpenDialog1.Filename, StringGrid1);
 
    end;
  end;
end;
 

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Soner »

Ich habe von mir erstelle Procedur getestet es funktioniert wunderbar. Ich habe ein paar Zeilen hinzugefügt damit Zeilen und Spaltenanzahl korregiert wird.
Hier ist neue Version:

Code: Alles auswählen

 
procedure LadeDatei(ADateiName: string; AGrid: TStringGrid);
var c,r,i,k, maxc :integer; //maxc ist neu
    aList : TStringList;
    aLine, aWort : string;
begin
  aList := TStringList.Create;
 try
  aList.LoadFromFile(ADateiName);
 
  //erst grid leeren
  for r:=0 to AGrid.RowCount-1 do
    for c:=0 to AGrid.ColCount-1 do
       AGrid.Cells[c,r]:='';
 
  r:=-1;
  maxc:=0; //neu
  for k:=0 to AList.Count-1 do begin    //Stringlist Zeilen durchlaufen
 
    Inc(r); //zeilennr in Grid erhöhen
    if r>=AGrid.RowCount then  AGrid.RowCount:=r+1;
 
    c:=0; //erste spalte
 
    aLine:=aList[k];
    aWort:='';
    for i:=1 to Length(aLine) do begin //Zeichen einer Zeile durchlaufen
 
       case aLine[i] of
         ' ': begin //Trennzeichen (Leerzeichen) erreicht Wert zum Grid
             if c>=AGrid.ColCount then  AGrid.ColCount:=c+1;
             AGrid.Cells[c,r]:=aWort;
             aWort:='';
             Inc(c);
          end;
        else aWort:=aWort+aLine[i];
 
       end; //von case ...
 
    end; //von for i:= ...
 
   //und lezte Zahl zum Grid. "For i:=0" wurde beendet weil Zeilenende erreicht aber es kann noch ein Zahl vorhanden sein.
   if aWort<>'' then begin
     if c>=AGrid.ColCount then  AGrid.ColCount:=c+1;
     AGrid.Cells[c,r]:=aWort;
   end;
 
   if c>maxc then maxc:=c; //neu
 
  end; //von for k:=0 ....
 
 finally
  aList.Free;
 end;
 
 if maxc>0 then AGrid.ColCount:=maxc+1; //neu
 if r>0 then AGrid.RowCount:=r+1;             //neu
 
end;
 

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Foxi1896 »

=/ hmm bei mir kommt immer Error: Identifier not found "LadeDatei"

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: .txt Datei in einen Stringgrid einfügen??

Beitrag von Michl »

Dann hast du dich wahrscheinlich verschrieben! Wenn die Procedure "LadeDatei" heisst und du diese in deine Unit (wahrscheinlich Unit1) eingefügt hast, dann kannst du sie auch mitteils "LadeDatei(..)" aufrufen!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten