Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Textdatei in StringGrid anzeigen? (https://www.delphipraxis.net/103392-textdatei-stringgrid-anzeigen.html)

Borschti 15. Nov 2007 08:38


Textdatei in StringGrid anzeigen?
 
Hallo,

ich habe ein paar Probleme mit dem einlesen einer Textdatei in eine StringGrid Komponente und zwar soll meine Textdatei so aufgebaut sein:

52323; Müller; Hans; Kühle Bäume 12; 43186; Jesberg;
37459; Schmidt; Jörg; Am Schergarten 3; 84920; Sachsenhausen;
...

Also die Verschiedenen Datensätze sollen untereinander stehen und die Einträge für die einzelnen Zellen sollen durch Semikolons getrennt sein.

Also die Datei habe ich schon durch einen TOpenDialog geöffnet und in den Zwischenspeicher abgelegt.
Nun weiß ich aber nicht weiter, wie kann ich Delphi Signalisieren das es den Inhalt zwischen den Semikolons in die einzelnen Zellen packen soll und am Ende einer Zeile in die nächste Zeile springen soll und dort von vorne anfangen soll...

Mit Pos und PosEx habe ich es schon versucht aber bei einer angestrebten Menge von 10 Datensätzen wird der Quelltext einfach zu riesig.

Fallls jemand ein paar Tipps oder vielleicht ein gut Kommentiertes Beispiel bzw. Tutorial kennt, wie ich die Sache angehen könnte, wäre ich sehr dankbar.

Ich hoffe ich bin in dem Forenbereich hier richtig, falls nicht bitte verschieben :wink:

mfg

marabu 15. Nov 2007 08:55

Re: Textdatei in StringGrid anzeigen?
 
Hallo,

die Spalten und Zeilen eines StringGrid kannst du als StringList ansprechen:

Delphi-Quellcode:
Explode(Line[i], ';', StringGrid.Rows[iRow]);
Explode

Grüße vom marabu

Thanatos81 15. Nov 2007 09:05

Re: Textdatei in StringGrid anzeigen?
 
Ohne Explode geht auch:
Delphi-Quellcode:
var sl: TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile('d:\test.csv');
  try
    StringGrid1.Rows[1].Delimiter :=';'; //Trennzeichen festlegen
    StringGrid1.Rows[1].DelimitedText := sl[1]; //getrennten Text zuweisen
  finally
    FreeAndNil(sl);
  end;
//Edit Explode heißt das Ding nicht Explore :oops:

marabu 15. Nov 2007 09:09

Re: Textdatei in StringGrid anzeigen?
 
Hallo Thomas,

Borschti hat seine Delphi Version nicht angegeben, aber wenn er eine der neueren Versionen benutzt, dann kann er mit der property StrictDelimiter zum Ziel gelangen. Ohne diese Funktionalität trennt der interne Parser auch bei Leerstellen.

Freundliche Grüße

Borschti 15. Nov 2007 09:12

Re: Textdatei in StringGrid anzeigen?
 
Also erstmal danke für die Antworten, also ich benutze Delphi 7.

Werde mir eure Vorschläge mal genauer anschaun.

Thanatos81 15. Nov 2007 09:16

Re: Textdatei in StringGrid anzeigen?
 
Zitat:

Zitat von marabu
Hallo Thomas,

Borschti hat seine Delphi Version nicht angegeben, aber wenn er eine der neueren Versionen benutzt, dann kann er mit der property StrictDelimiter zum Ziel gelangen. Ohne diese Funktionalität trennt der interne Parser auch bei Leerstellen.

Freundliche Grüße

Ui, das wusste ich auch noch nicht, wahrscheinlich weil ich selber kaum mit den Delimitern arbeite ;-) Aber Danke für den Hinweis, man lernt ja nie aus!

mkinzler 15. Nov 2007 09:36

Re: Textdatei in StringGrid anzeigen?
 
weitere lösung CSVDataSet + DBGrid

Borschti 15. Nov 2007 10:12

Re: Textdatei in StringGrid anzeigen?
 
Zitat:

Zitat von Thanatos81
Delphi-Quellcode:
var sl: TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile('d:\test.csv');
  try
    StringGrid1.Rows[1].Delimiter :=';'; //Trennzeichen festlegen
    StringGrid1.Rows[1].DelimitedText := sl[1]; //getrennten Text zuweisen
  finally
    FreeAndNil(sl);
  end;

Hallo,

also für diese Möglichkeit Interessiere ich mich wohl am meisten, kann man das vielleicht auch mit einem TOpenDialog machen?
Wenn ja, wie könnte ich das am besten umsetzen? Hab das gerade mal versucht aber dabei kam nichts vernünftiges heraus :/

DeddyH 15. Nov 2007 10:17

Re: Textdatei in StringGrid anzeigen?
 
Delphi-Quellcode:
var sl: TStringList;
begin
  if OpenDialog.Execute then
    begin
      sl := TStringList.Create;
      try
        sl.LoadFromFile(OpenDialog.FileName); //ausgewählte Datei einlesen
        StringGrid1.Rows[1].Delimiter :=';'; //Trennzeichen festlegen
        StringGrid1.Rows[1].DelimitedText := sl[1]; //getrennten Text zuweisen
      finally
        FreeAndNil(sl);
      end;
    end;

Borschti 15. Nov 2007 11:32

Re: Textdatei in StringGrid anzeigen?
 
Super hat geklappt, danke ;)

Aber jetzt liest er ja nur die erste Zeile meiner Text Datei ein, ich will aber das die jeweils zweite Zeile meiner Datei in die zweite Zeile des StringGrids, die dritte Zeile meiner Datei in die dritte Zeile des StringGrids usw. eingelesen wird.

Also ich bin jetzt soweit das ich mit einer Schleife zwar alle Felder des StringGrids ausfüllen kann aber halt nur mit dem Inhalt der ersten Zeile meiner Datei...

Ich hoffe ich konnte das jetzt einigermaßen gut vermitteln :?

Also ich bräuchte einen Befehl mit dem Delphi beim übertragen der Daten in das StringGrid am Ende einer Zeile in die nächste Zeile springt und dort mit dem einlesen von vorne anfangt bis er wieder am Ende der Zeile angelangt ist usw...
Ich habe gehört das dies mit einem Carriage Return Symbol möglich ist, nur weiß ich nicht wie ich das in einer for-Schleife bzw. überhaupt einbinden kann :/

schonmal danke für alle Antworten,

mfg
Alex

DeddyH 15. Nov 2007 12:02

Re: Textdatei in StringGrid anzeigen?
 
Die Datei ist schon komplett eingelesen wordem, aber durch mein C & P ist die Limitierung auf Index 1 übriggeblieben. Du musst also nur nach dem Einlesen eine Schleife einbauen und die [1] durch [Schleifenvariable] ersetzen, dann sollte es schon gehen.

Borschti 15. Nov 2007 12:04

Re: Textdatei in StringGrid anzeigen?
 
Hat sich erledigt, Augen aufmachen hilft ;)

marabu 15. Nov 2007 12:09

Re: Textdatei in StringGrid anzeigen?
 
Hallo Alex,

mit dem Code aus dem vorigen Beitrag wird die erste Zeile aus deinen Beispieldaten so verarbeitet, dass die Straße "Kühle Bäume 12" auf drei Spalten verteilt wird - aber das wirst du später noch irgendwann merken.

Delphi-Quellcode:
procedure FillGrid(sg: TStringGrid; lines: TStrings; delim: Char);
var
  i: Integer;
begin
  for i := 0 to Pred(lines.Count) do
    Explode(lines[i], delim, sg.Rows[sg.FixedRows + i]);
end;


var
  sl: TStringList;
begin
  if OpenDialog.Execute then
  begin
    sl := TStringList.Create;
    try
      sl.LoadFromFile(OpenDialog.FileName); //ausgewählte Datei einlesen
      FillGrid(StringGrid, sl, ';');
    finally
      sl.Free;
    end;
  end;
end;
Getippt und nicht getestet.

Freundliche Grüße

Borschti 15. Nov 2007 12:49

Re: Textdatei in StringGrid anzeigen?
 
Danke für den Code, das das Programm dann Leerzeichen auch als Trennzeichen aufgenommen hätte wäre in dem Moment auch kein Beinbruch gewesen, aber wenn es nicht so ist, ist es natürlich besser ;)

Aber eine Frage bleibt mir noch...was muss ich denn im uses Abschnitt einbinden damit Delphi was mit Explode anfangen kann?

DeddyH 15. Nov 2007 12:52

Re: Textdatei in StringGrid anzeigen?
 
Kopier die oben verlinkte Funktion in Deine Unit.

Borschti 15. Nov 2007 13:07

Re: Textdatei in StringGrid anzeigen?
 
Ja, hab ich aber er zeigt mir die Fehlermeldung "Undefinierter Bezeichner:'Explode'" an.

DeddyH 15. Nov 2007 13:10

Re: Textdatei in StringGrid anzeigen?
 
Dann schreib mal als letzte Zeile vor "implementation"
Delphi-Quellcode:
procedure Explode(const s, delimiter: String; items: TStrings);

Borschti 15. Nov 2007 13:28

Re: Textdatei in StringGrid anzeigen?
 
Hab ich gemacht der Fehler bleibt aber weiterhin bestehen.

Bisd du dir sicher das ich nichts im uses Abschnitt einbinden muss?

DeddyH 15. Nov 2007 13:30

Re: Textdatei in StringGrid anzeigen?
 
Zeig doch mal die Unit.

Borschti 15. Nov 2007 13:40

Re: Textdatei in StringGrid anzeigen?
 
Hier bitte, also da sollten die für die Sache wichtigen Dinge zu sehen sein ;)
Ich Habe
Delphi-Quellcode:
procedure Explode(const s, delimiter: String; items: TStrings);
an verschieden stellen eingesetzt ich markier einfach mal die entsprechenden Stellen mit einem Kommentar.


Delphi-Quellcode:
unit UnStringGrid;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, StrUtils, Printers, ClipBrd, Grids;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    PrinterSetupDialog1: TPrinterSetupDialog;
    MainMenu1: TMainMenu;
    datei: TMenuItem;
    drucken: TMenuItem;
    ffnen1: TMenuItem;
    Druckereinstellungen1: TMenuItem;
    Drucken1: TMenuItem;
    PrintDialog1: TPrintDialog;
    AlleFelderlschen1: TMenuItem;
    StringGrid1: TStringGrid;
    Beenden1: TMenuItem;
    procedure ffnen1Click(Sender: TObject);
    procedure Druckereinstellungen1Click(Sender: TObject);
    procedure Drucken1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    //Hier
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
// und hier so wie du gesagt hast.
implementation

 
{$R *.dfm}

procedure FillGrid(sg: TStringGrid; lines: TStrings; delim: Char);
var
  i: Integer;
begin
  for i := 0 to Pred(lines.Count) do
    Explode(lines[i], delim, sg.Rows[sg.FixedRows + i]);
end;


procedure TForm1.ffnen1Click(Sender: TObject);
var
  sl: TStringList;
begin
  if OpenDialog1.Execute then
  begin
    sl := TStringList.Create;
    try
      sl.LoadFromFile(OpenDialog1.FileName);
      FillGrid(StringGrid1, sl, ';');
    finally
      sl.Free;
    end;
  end;
end;

DeddyH 15. Nov 2007 13:52

Re: Textdatei in StringGrid anzeigen?
 
Tja, und wo ist die Prozedur Explode geblieben?
Delphi-Quellcode:
unit UnStringGrid;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, StrUtils, Printers, ClipBrd, Grids;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    PrinterSetupDialog1: TPrinterSetupDialog;
    MainMenu1: TMainMenu;
    datei: TMenuItem;
    drucken: TMenuItem;
    ffnen1: TMenuItem;
    Druckereinstellungen1: TMenuItem;
    Drucken1: TMenuItem;
    PrintDialog1: TPrintDialog;
    AlleFelderlschen1: TMenuItem;
    StringGrid1: TStringGrid;
    Beenden1: TMenuItem;
    procedure ffnen1Click(Sender: TObject);
    procedure Druckereinstellungen1Click(Sender: TObject);
    procedure Drucken1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    //Hier
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

procedure Explode(const s, delimiter: String; items: TStrings);

implementation


{$R *.dfm}

procedure Explode(const s, delimiter: String; items: TStrings);
begin
  items.CommaText := StringReplace(AnsiQuotedStr(s, '"'), delimiter, '","', [rfReplaceAll]);
end;

procedure FillGrid(sg: TStringGrid; lines: TStrings; delim: Char);
var
  i: Integer;
begin
  for i := 0 to Pred(lines.Count) do
    Explode(lines[i], delim, sg.Rows[sg.FixedRows + i]);
end;


procedure TForm1.ffnen1Click(Sender: TObject);
var
  sl: TStringList;
begin
  if OpenDialog1.Execute then
  begin
    sl := TStringList.Create;
    try
      sl.LoadFromFile(OpenDialog1.FileName);
      FillGrid(StringGrid1, sl, ';');
    finally
      sl.Free;
    end;
  end;
end;

Borschti 15. Nov 2007 14:16

Re: Textdatei in StringGrid anzeigen?
 
Ich hatte sie da eingesetzt aber als es dann doch nicht funktioniert hat hab ichs wieder rausgemacht ;)

Als Fehler kommt stattdessen [Fehler] UnStringGrid.pas(40): Ungenügende Forward- oder External-Deklaration: 'Explode'

DeddyH 15. Nov 2007 14:46

Re: Textdatei in StringGrid anzeigen?
 
Sonst nimm halt den Prototypen wieder aus dem interface-Teil raus und stell sicher, dass die Prozedur als Erstes hinter implementation steht.

Borschti 15. Nov 2007 15:19

Re: Textdatei in StringGrid anzeigen?
 
Es wird immernoch [Fehler] UnStringGrid.pas(65): Undefinierter Bezeichner: 'Explode' angezeigt.

DeddyH 15. Nov 2007 15:25

Re: Textdatei in StringGrid anzeigen?
 
Poste nochmal die Unit, da stimmt doch was nicht.

Borschti 15. Nov 2007 15:41

Re: Textdatei in StringGrid anzeigen?
 
Delphi-Quellcode:
unit UnStringGrid;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, StrUtils, Printers, ClipBrd, Grids;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    PrinterSetupDialog1: TPrinterSetupDialog;
    MainMenu1: TMainMenu;
    datei: TMenuItem;
    drucken: TMenuItem;
    ffnen1: TMenuItem;
    Druckereinstellungen1: TMenuItem;
    Drucken1: TMenuItem;
    PrintDialog1: TPrintDialog;
    AlleFelderlschen1: TMenuItem;
    StringGrid1: TStringGrid;
    Beenden1: TMenuItem;
    procedure ffnen1Click(Sender: TObject);
    procedure Druckereinstellungen1Click(Sender: TObject);
    procedure Drucken1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

procedure FillGrid(sg: TStringGrid; lines: TStrings; delim: Char);
var
  i: Integer;
begin
  for i := 0 to Pred(lines.Count) do
    Explode(lines[i], delim, sg.Rows[sg.FixedRows + i]);
end;


{$R *.dfm}




procedure TForm1.ffnen1Click(Sender: TObject);
var
  sl: TStringList;
begin
  if OpenDialog1.Execute then
  begin
    sl := TStringList.Create;
    try
      sl.LoadFromFile(OpenDialog1.FileName);
      FillGrid(StringGrid1, sl, ';');
    finally
      sl.Free;
    end;
  end;
end;
Ich habe jetzt
Delphi-Quellcode:
procedure Explode(const s, delimiter: String; items: TStrings);
wieder ganz raus gelassen da er mir sonst beide Fehlermeldungen anzeigt... :/

DeddyH 15. Nov 2007 15:43

Re: Textdatei in StringGrid anzeigen?
 
Du rufst in FillGrid Explode auf, hast aber den Quelltext von Explode immer noch nicht in Deine Unit kopiert.

Borschti 15. Nov 2007 16:00

Re: Textdatei in StringGrid anzeigen?
 
Ups ich hatte das nicht gesehn sorry für den Umstand :/


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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