Mehrere Datein mit einem ÖffnenDialog

Für Fragen von Einsteigern und Programmieranfängern...
Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Mehrere Datein mit einem ÖffnenDialog

Beitrag von Inventio »

Hallo ihr,
ich versuche gerade mit einem TOpenDialog mehrere Datein einzulesen. D.h., dass der User im Dialogfenster mehrere Datein markieren kann, um diese dann in das Programm einzubinden. Wie kann ich das realisieren ?
Normalerweise fange ich ja über OpenDialog.Filename den Pfad der Datei ab, kann man das also auch iwi mit mehreren Datein machen ?

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Komoluna »

Hallo Inventio

Einfach Opendialog1.Files benutzten (TStrings) anstatt von Opendialog1.Filename (string)

LG Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von theo »

Zuerst noch bei den Options ofAllowMultiSelect dazunehmen.

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Inventio »

Danke! Ich werde es morgen mal ausprobieren!

Lg Inventio

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Inventio »

Hey ihr,
habe das ganze jetzt ausprobiert und es erscheint mir auch richtig, jedoch bekomme ich einen SIGSEGV error, wenn ich datein einbinden möchte.
Was ich genau machen will. In ein Array of String (DateiName) die dateipfade speichern.
So sieht das ganze bei mir aus:

Code: Alles auswählen

 
  OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];
  if OpenDialog1.Execute then
  begin
      for u := 0 to OpenDialog1.Files.Count - 1 do
      begin
          DateiName[u] := OpenDialog1.Files.Strings[u];
      end;
  end;
 

Wo ist mein Fehler? Für mich scheint der code richtig.

Mfg Inventio

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von theo »

Inventio hat geschrieben: Was ich genau machen will. In ein Array of String (DateiName) die dateipfade speichern.
Nimm einfach eine TStringList und benutze Assign. Man muss das Rad nicht immer neu erfinden.

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Inventio »

theo hat geschrieben:
Inventio hat geschrieben: Was ich genau machen will. In ein Array of String (DateiName) die dateipfade speichern.
Nimm einfach eine TStringList und benutze Assign. Man muss das Rad nicht immer neu erfinden.
Hast du da ein kleines Code-Beispiel für mich ? Hab mit sowas leider noch nie gearbeitet...


LG

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von theo »


Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von m.fuchs »

Inventio hat geschrieben:habe das ganze jetzt ausprobiert und es erscheint mir auch richtig, jedoch bekomme ich einen SIGSEGV error, wenn ich datein einbinden möchte.
Da kann es hilfreich sein, sich mit F7 und F8 schrittweise durch den relevanten Code zu hangeln. Dann weiß man nämlich auch an welcher Stelle der Fehler kommt.
Inventio hat geschrieben:

Code: Alles auswählen

 
  OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];
  if OpenDialog1.Execute then
  begin
      for u := 0 to OpenDialog1.Files.Count - 1 do
      begin
          DateiName[u] := OpenDialog1.Files.Strings[u];
      end;
  end;
 
Wie gesagt, probier es mit schrittweisen Debugging. Ein Ansatzpunkt wäre das Array DateiName. Ist es überhaupt groß genug?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Inventio »

m.fuchs hat geschrieben:
Inventio hat geschrieben:habe das ganze jetzt ausprobiert und es erscheint mir auch richtig, jedoch bekomme ich einen SIGSEGV error, wenn ich datein einbinden möchte.
Da kann es hilfreich sein, sich mit F7 und F8 schrittweise durch den relevanten Code zu hangeln. Dann weiß man nämlich auch an welcher Stelle der Fehler kommt.
Inventio hat geschrieben:

Code: Alles auswählen

 
  OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];
  if OpenDialog1.Execute then
  begin
      for u := 0 to OpenDialog1.Files.Count - 1 do
      begin
          DateiName[u] := OpenDialog1.Files.Strings[u];
      end;
  end;
 
Wie gesagt, probier es mit schrittweisen Debugging. Ein Ansatzpunkt wäre das Array DateiName. Ist es überhaupt groß genug?
Es ist ein dynamisches Array of String

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von m.fuchs »

Inventio hat geschrieben:
m.fuchs hat geschrieben:[...]ein Ansatzpunkt wäre das Array DateiName. Ist es überhaupt groß genug?
Es ist ein dynamisches Array of String
Das ist keine Antwort auf meine Frage.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Inventio »

Dann habe ich deine Frage nicht verstanden....mit "groß genug" habe ich die länge des Arrays assoziiert

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Socke »

Inventio hat geschrieben:Dann habe ich deine Frage nicht verstanden....mit "groß genug" habe ich die länge des Arrays assoziiert
Dann hast du die Frage richtig verstanden.

Ein statisches Array kann seine Größe nicht ändern.
Ein dynamisches Array kann seine Größe ändern, muss dies aber nicht tun. Insbesondere ändert es sich nicht selbst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von m.fuchs »

Um es noch weiter zu präzisieren: Hast du irgendwo die Größe des Arrays auf einen Wert gesetzt, der garantiert nicht kleiner als die Anzahl der vom Benutzer ausgewählten Dateien ist?

Oder fehlt vielleicht einfach vor deiner For-Schleife folgende Zeile:

Code: Alles auswählen

SetLength(DateiName, OpenDialog1.Files.Count)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Mehrere Datein mit einem ÖffnenDialog

Beitrag von Inventio »

m.fuchs hat geschrieben:Um es noch weiter zu präzisieren: Hast du irgendwo die Größe des Arrays auf einen Wert gesetzt, der garantiert nicht kleiner als die Anzahl der vom Benutzer ausgewählten Dateien ist?

Oder fehlt vielleicht einfach vor deiner For-Schleife folgende Zeile:

Code: Alles auswählen

SetLength(DateiName, OpenDialog1.Files.Count)

Ich habe es jetzt mit einer TStringList gelöst, das passt! Danke für eure Hilfe!
Jetzt sieht das ganze so aus:

Code: Alles auswählen

//variablen
type
  TFrage = record
    ID : Integer;
    Frage : String[255];
    Ant1  : String[255];
    Ant2  : String[255];
    Ant3  : String[255];
    Correct : String[1];
end;
 
Gesamte_Fragen = Array[1..600] of TFrage;
Fragebogen = Gesamte_Fragen;
 
var DateiName : TStringList;
      FragenKatalog: Array of Fragebogen;
 
//Code
procedure TPerformancePusher.DateiPfadeSpeichern;
var i : integer;
begin
 OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];
 if OpenDialog1.Execute then
  begin
    DateiName := TStringList.Create;
    with OpenDialog1.Files do
    for i := 0 to Count - 1 do
    begin
      DateiName.Add(Strings[i]);
    end;
  end;
end;
Das funktioniert soweit auch, sodass jedes Element einem Pfad einer vom User ausgewählten Datei entspricht.
Nur jetzt bekomme ich natürlich Fehler beim Lesen der Datein. Hierbei ist zu sagen, dass ich ein Record TFrage erstellt habe, dass eine Frage mit ihren Attributen (Der Frage und ihren Antworten) speichert.
Ich habe eine Variable Datei vom Typ Gesamte_Fragen (Gesamte_Fragen = Array[1..600] of TFrage), einen Fragebogen (Fragebogen = Gesamte_Fragen; Das habe ich so gewählt, da ich das früher schon so programmiert habe und sich das leider nicht ändern lässt...) und einen Fragenkatalog (Fragenkatalog : Array of Fragebogen).
Nun möchte ich mit folgendem Code den Fragenkatalog füllen, sodass an jeder Stelle von FragenKatalog ein Fragebogen vorhanden ist. Also ist FragenKatalog[1] ein Fragebogen.
So sieht mein Code daür aus :

Code: Alles auswählen

 
//variablen
var Datei : File of Gesamte_Fragen;
 
 
//Code
procedure TPerformancePusher.DateiLaden;
var i : integer;
begin
 for i := 0 to DateiName.count -1 do
 begin
   AssignFile(Datei, DateiName[i]);
   {$I-}Reset(Datei);
   Read(Datei, Fragenkatalog[i]);
   IF IORESULT <> 0 THEN
   begin
     Showmessage('Fehler beim Lesen der Daten! Ende.');
   end;
   CloseFile(Datei);{$I+}
 end;
end; 
Jedoch bekomme ich in der Runtime des Programms dann meine programmierte Fehlermeldung, er konnte also keine Datei laden... Was mache ich falsch ?

Antworten