Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mehrere Textdateien aus Opendialog heraus ausführen (https://www.delphipraxis.net/81245-mehrere-textdateien-aus-opendialog-heraus-ausfuehren.html)

illbytes 23. Nov 2006 09:48


Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo miteinander,

weiss vielleicht jemand, wie man unter Delphi 3 mehrere Dateien aus Dem OpenDialog heraus der Reihe nach ausführen kann?

Also ich habe im Objektinspektor unter Eigenschaften ->Options -> ofAllowMultiSelect auf True gesetzt.

Im Programm kann ich nun mehrere Files selektieren und diese Werden im Open Dialog unter Dateiname: in "Filename1.txt""Filename2.txt" usw. angezeigt.

Nur bei Programmausführung wird nur die erste Datei Ausgeführt. :-((

-- Was muss ich noch da reinprogrammieren, das alle selektierten Dateien in dem Verzeichnis bearbeitet werden?

-- Was muss ich noch da reinprogrammieren, das alle Dateien aus dem ausgewählten Verzeichnis bearbeitet werden?

-- Gibt es ne Grenze wenn zu viele Dateien im Verzeichnis sind und wie muss man dann vorgehen?




Delphi-Quellcode:
 procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Datei : Textfile;
  Zeilenpuffer,Filename : String;

begin
  if OpenDialog1.Execute then

   AssignFile(Datei, Opendialog1.Filename);
    {$I-}
    Reset(Datei);
    {$I+}
     if IOResult <> 0 then
      begin
        MessageDlg('Fehler beim Zugriff auf die Datei', mtWarning, [mbOk], 0);
        exit;
        halt
      end
      else
       MessageDlg('Dateigröße in Bytes: ' + IntToStr(FileSize(Datei)),
       mtInformation, [mbOk], 0);
       Memo1.Lines.Clear;
         while not EOF(Datei)do
           Begin
             Readln( Datei, Zeilenpuffer);
             Memo1.Lines.Add(Zeilenpuffer);
       end;
       Reihe:=Reihe+1;
       Edit1.Text:=IntToStr(Reihe);
       CloseFile(Datei);
end;
[edit=Luckie]Delphi-Tag korrigiert. Mfg, Luckie[/edit]

Luckie 23. Nov 2006 09:52

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Die Dateinamen bfeinden sich in der Eigenschaft TOpenDialog.Files. Das ist eine ganz normale StringListe.

illbytes 23. Nov 2006 10:20

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Danke für den Tipp :-))

habe wohl nun ein Schleifenproblem

es wird nach wie Vor scheinbar nur eine Datei eingelesen
im Memo1 sieht man allerdings die Letzte Datei der Liste.

Es sollten im Memo nun alle Files sichtbar sein. Tun sie aber nicht.

(Anfängerpech)


Delphi-Quellcode:

begin
  if OpenDialog1.Execute then
   with OpenDialog1.Files do begin
   AssignFile(Datei, Opendialog1.Filename);
    {$I-}
    Reset(Datei);
    {$I+}
     if IOResult <> 0 then
      begin
        MessageDlg('Fehler beim Zugriff auf die Datei', mtWarning, [mbOk], 0);
        exit;
        halt
      end
      else
       MessageDlg('Dateigröße in Bytes: ' + IntToStr(FileSize(Datei)),
       mtInformation, [mbOk], 0);
      { Memo1.Lines.Clear;}
         while not EOF(Datei)do
           Begin
             Readln( Datei, Zeilenpuffer);
             Memo1.Lines.Add(Zeilenpuffer);
       end;
       Reihe:=Reihe+1;
       Edit1.Text:=IntToStr(Reihe);
       CloseFile(Datei);
   end;
end;
[edit=Luckie]Delphi-Tag korrigiert. Du musst die Tags auch schließen mit [/ Delphi]. Mfg, Luckie[/edit]

Luckie 23. Nov 2006 10:28

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Du hast kein schleifen-Problem, weil du gar keine Schleife hast. Zumindest sehe ich keine
Schleife, die über die Einträge der Eigenschaft Files läuft.

marabu 23. Nov 2006 11:52

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Herzlich willkommen in der Delphi-PRAXiS, illbytes.

Wenn du ein Schleifenproblem haben möchtest, dann musst du eher so an die Sache rangehen:

Delphi-Quellcode:
var
  s: TStrings;
  i: Integer;
begin
  with OpenDialog do
    if Execute then
    begin
      s := TStringList.Create;
      Memo.Clear;
      try
        for i := 0 to Pred(Files.Count) do
        begin
          s.LoadFromFile(Files[i]);
          Memo.Lines.AddStrings(s);
        end;
      finally
        s.Free;
      end;
   end;
end;
Freundliche Grüße vom marabu

illbytes 23. Nov 2006 13:04

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Danke für die Tipps :-))

ich versuch das mal nachzuvollziehen.

illbytes 23. Nov 2006 20:44

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
So nun klappts auch hat ein wenig gedauert.

Ich stell das mal hier rein, ist auch für andere Anfänger bestimmt nicht uninteressant.

Delphi-Quellcode:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Datei : Textfile;
  Zeilenpuffer,Filename : String;
  j : integer;

begin
  if OpenDialog1.Execute then
     for j := 0 to opendialog1.Files.Count-1 do
     begin
       AssignFile(Datei, OpenDialog1.Files[j]);
    {$I-}
    Reset(Datei);
    {$I+}
     if IOResult <> 0 then
      begin
        MessageDlg('Fehler beim Zugriff auf die Datei', mtWarning, [mbOk], 0);
        exit;
        halt
      end
      else
       MessageDlg('Dateigröße in Bytes: ' + IntToStr(FileSize(Datei)),
       mtInformation, [mbOk], 0);
         while not EOF(Datei)do
           Begin
             Readln( Datei, Zeilenpuffer);
             Memo1.Lines.Add(Zeilenpuffer);
       end;
       Reihe:=Reihe+1;
       Edit1.Text:=IntToStr(Reihe);
       CloseFile(Datei);
end;
end;
Das andere Beispiel finde ich auch ganz interessant und es funktionierte direkt.

Nur hatte ich Probs. (Fehlermeldung) TStrings und Strings sind nicht miteinander vereinbar als ich versucht hatte S dem Zeilenpuffer zuzuweisen um den Text in meinem Programmrest weiterzuverarbeiten.

Würd mich schon interessieren wie man evtl. TStrings in Strings konvertiert oder mit TStrings Textbestandteile (Wörter, Datum, Zeit im String) untersucht (suchen, finden ersetzen).

Nochmals Danke für die prompten Anregungen.

Schönen Gruß

marabu 24. Nov 2006 06:34

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Guten Morgen,

Zitat:

Zitat von illbytes
... TStrings und Strings sind nicht miteinander vereinbar als ich versucht hatte S dem Zeilenpuffer zuzuweisen um den Text in meinem Programmrest weiterzuverarbeiten. ...

Delphi-Quellcode:
ZeilenPuffer := s.Text;
Zitat:

Zitat von illbytes
... Würd mich schon interessieren wie man evtl. TStrings in Strings konvertiert oder mit TStrings Textbestandteile (Wörter, Datum, Zeit im String) untersucht (suchen, finden ersetzen).

Du kannst ein Objekt der Klasse TStrings in einen einzigen String wandeln (siehe oben) oder als eine Folge von Strings verarbeiten:

Delphi-Quellcode:
var
  i: Integer;
  s: TStrings;
begin
  // ...
  for i := 0 to Pred(s.Count) do
    ShowMessage(s[i]);
  // ...
end;
Suchen und Ersetzen kannst du also auf dem gesamten Text oder den einzelnen Zeilen.

Freundliche Grüße

illbytes 27. Nov 2006 14:47

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Halllo zusammen,

nochmal Danke für die Tipps.

Das Öffnen funktioniert und auch meine Weiterverarbeitung.

Bei beiden Möglichkeiten stellt sich aber leider heraus das ich nur ca 150-160 Dateien öffnen kann. Wähle ich das gesamte Verzeichnis aus, dann wird überhaupt keine Textdatei eingelesen.

Die einzulesenden Textdateien haben 2KB Einzeldateigrösse demnach glaube ich nicht an ein Speicherproblem.

Es scheint das dort noch ein Fehler der Fehler oder eine Limitierung vorliegt :gruebel:

Es muss doch möglich sein so ca. 500 bis 1000 Dateien einzulesen.

habe bis jetzt nichts darüber gefunden wie das Prob zu beheben ist. :-(


Vielleicht kennt ihr ja das Problem.

Schöne Grüße

marabu 27. Nov 2006 15:15

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hi,

wenn du es richtig machst, dann hast du immer nur eine Eingabedatei offen. Wie sieht dein Code denn jetzt aus?

Freundliche Grüße

illbytes 27. Nov 2006 15:24

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo Marabu,

so wie im siebten Posting nur das ich zwischendurch unter dem Memo1 nach Stringpattern suche und an entsprechender Stelle den String nach n Zeichen vom Zeilenanfang mit k Stellen auslese und ihn einem TString Grid übergebe.

Wenn noch was fehlt poste ich das noch rein.

Schönen Gruß

marabu 27. Nov 2006 15:37

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Prüfe doch mal, ob du auch jede Datei schließt, die du zuvor geöffnet hast.

illbytes 27. Nov 2006 15:55

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo,

ich habe das
Delphi-Quellcode:
CloseFile(Datei);
mal ein End nach oben verschoben Resultat es wird nur noch ein Zeilenfragment eingelesen.

Ist doch richtig das ich der Variablen Datei die Files[j] des OpenDialog1 zuweise?

Delphi-Quellcode:
if OpenDialog1.Execute then
     for j := 0 to opendialog1.Files.Count-1 do
     begin
       AssignFile(Datei, OpenDialog1.Files[j]);
    {$I-}
       .
       .
und wenn ich dann CloseFile(Datei) aufrufe somit implizit auch die Files[j] des OpenDialog1 geschlossen werden.

Delphi-Quellcode:
 end;
       Reihe:=Reihe+1;
       Edit1.Text:=IntToStr(Reihe);
       CloseFile(Datei);
end;
end;
ich probier noch etwas rum das CloseFile(Datei)Kommando im Quelltext zu verschieben.

Ansonsten weiss ich nicht wie ich sehen kann ob die Datei offen oder geschlossen ist.

hab schon länger an dem Problem gefummelt. Aber ohne Erfolg. :-(

illbytes 29. Nov 2006 14:49

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo Miteinander,

ich habe nun einige Tage versucht das Problem in den Griff zu bekommen.

Mit dem untenstehenden Testprogramm bin ich nach wie vor auf ca 150 Dateien a 2 KB die eingelesen werden können gekommen.

Will ich mehr als 200 Dateien einlesen, dann wird nichts aber auch gar nichts im Memo und in der
TListBox angezeigt. Und das Ganze ohne eine Message oder sonstige Meldungen.

Ab dem Memobereich findet dann bei mir in meinem Programm die Weitere Verarbeitung statt.

Es muss doch möglich sein mit diesem Grundgerüst von Code bis zu 200 Dateien oder über 200 Dateien bis ca. 2500 oder mehr einzulesen.

Ich denke das es bestimmt jemanden gibt, der mehr als 150 Dateien in einem Batch einliest.

Tests mit handelsüblichen Büroanwendungsprogrammen haben aber auch erstaunliches zu Tage gebracht
z. B. max. 41 Dateien die eingelesen werden.

Hier nun das Testprogramm:

Delphi-Quellcode:
unit Textread;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    ListBox1: TListBox;
    BitBtn2: TBitBtn;
    Label1: TLabel;

    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
 

implementation

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Datei : Textfile;
  Zeilenpuffer : String;
  j : integer;

begin
  if OpenDialog1.Execute then
     for j := 0 to opendialog1.Files.Count-1 do
     begin
        AssignFile(Datei, OpenDialog1.Files[j]);
       ListBox1.Items.Add(IntToStr(j+1)+'    '+OpenDialog1.Files[j]);
      {$I-}
         Reset(Datei);
      {$I+}
         if IOResult <> 0 then
         begin
          MessageDlg('Fehler beim Zugriff auf die Datei', mtWarning, [mbOk], 0);
          exit;
          halt
         end
         else
           while not EOF(Datei)do
             Begin
               Readln( Datei, Zeilenpuffer);
               Memo1.Lines.Add(Zeilenpuffer);
             end;
       {Reihe:=Reihe+1;}
       Edit1.Text:=IntToStr(Opendialog1.Files.Count);
       CloseFile(Datei);
     end; {End OpenDialog1}
end; {End BitBtn1.Click}

procedure TForm1.BitBtn2Click(Sender: TObject);
var
i : longint;

begin
 Memo1.Lines.Clear;
   with ListBox1.Items do
      begin
        for i:=0 to ListBox1.Items.Count-1 do
         begin
           ListBox1.Items.Delete(ListBox1.Items.Count-1);
         end;
      end;
      Edit1.Text:=IntToStr(ListBox1.Items.count);
end;

end.
Ob die Dateien wirklich geschlossen wurden konnte ich bis Dato nicht ermitteln :-((
Aber das CloseFile müsste an der richtigen Stelle sein, da alle anderen Variationen nicht Zielführend waren.

Irgendjemand muss doch auch das selbe Problem schon mal gelöst haben. Zumal es sich um einen Standard Dialog handelt. Die BOH und die Handbücher halten sich da auch bedeckt zu dem Thema.

Ich möchte nur den eingeschlagenen Programmierweg beibehlaten, da dahinter bereits sehr viel anderes auf dem Code basiert.

Wäre nett wenn mir jemand die Lösung verraten könnte.


Schöne Grüße

marabu 29. Nov 2006 15:15

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo,

lass dir doch mal die Fehlernummer ausgeben und nicht nur deinen eigenen Text.

Freundliche Grüße

Luckie 29. Nov 2006 15:18

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Was marabu sagen will: Ändern mal
Delphi-Quellcode:
MessageDlg('Fehler beim Zugriff auf die Datei', mtWarning, [mbOk], 0);
in
Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
Dann weißt du auch, warum es nicht funktioniert.

marabu 29. Nov 2006 15:24

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Vielleicht besser IOResult ausgeben - aber vorher in lokaler Variable zwischenspeichern...

illbytes 29. Nov 2006 15:52

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo,

Hm so funktionierte es nicht:

Delphi-Quellcode:
{$I+}
         if IOResult <> 0 then
         begin
         ShowMessage(SysErrorMessage(GetLastError));
          {MessageDlg('Fehler beim Zugriff auf die Datei', mtWarning, [mbOk], 0); }
         { exit;
          halt }
         end
         else
           while not EOF(Datei)do
Wo und wie genau muss das im Code stehen?

Ist IOResult Integer?

Schönen Gruß

illbytes 29. Nov 2006 17:01

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo,

so ich erhalte "der Vorgang wurde erfolgreich Beendet" [OK] wenn ich bei ca. 150 Dateien bleibe.

Wenn ich darüber hinausgehe gibt es gar keine Message Box und nix wird im Memo und TListbox angezeigt.

IO Result über Variable ist bei ca. 150 gleich 0:=[NULL] ansonsten keine Werteangabe.

Ergo wird es wohl keine Lösung geben.

Schönen Gruß

marabu 29. Nov 2006 17:05

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Kein Abbruch, keine Fehlermeldung, gar nichts? Mit welchem Betriebssystem testest du?

illbytes 29. Nov 2006 17:39

Re: Mehrere Textdateien aus Opendialog heraus ausführen
 
Hallo,

Also das Betriebssystem ist Windows 2000 Prof.
Programmieren mit Delphi3 Prof.

Ich weiss nicht warum sich der OpenDialog so Zickig verhält?

Schönen Gruß


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