Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FreePascal Schleifenproblem in Lazarus (https://www.delphipraxis.net/173828-schleifenproblem-lazarus.html)

ONeill 19. Mär 2013 14:32

Schleifenproblem in Lazarus
 
Hallo Leute,

ich glaube ich brauche mal wieder einen Denkanstoß. Und zwar habe ich folgenden Code:


Delphi-Quellcode:
//Dateinamen festlegen, die geöffnet werden soll
     filename:=ExtractFilePath(ParamStr(0))+'tabelle.xls';

     //Überprüfen ob Datei vorhanden
     if fileexists(filename) <> True then
     begin
       //Fehlermeldung anzeigen
       MessageDlg('Datei '+filename+' nicht gefunden.', mtError, mbOkCancel, 0);
       Application.Terminate;
     end;

     //Excel-Inhalt einlesen
     MyWorkbook.ReadFromFile(filename, sfExcel5);
     //Erstes Arbeitsplatt der Excel Mappe öffnen
     MyWorksheet := MyWorkbook.GetFirstWorksheet;

     //Alle Zeilen der Excel-Liste durch gehen
     for i:=1 to MyWorksheet.GetLastRowNumber do
     begin
       //INhalt in ListBox schreiben
       lb.Items.Add(MyWorksheet.ReadAsUTF8Text(i, 0));
       lb2.Items.Add(MyWorksheet.ReadAsUTF8Text(i, 1));
       lb3.Items.Add(MyWorksheet.ReadAsUTF8Text(i, 2));
     end;
Da ich nun aber mehr als nur eine Excel-Tabelle in die Listboxen laden muss, dachte ich mir, das ich einfach die Variable filename zu nem array of string mache und eine Schleife um den Code rum baue. Raus kam dann dieser Code (alle Variablen sind richtig gesetzt ;)):


Delphi-Quellcode:
//Dateinamen festlegen, die geöffnet werden soll
     filen[0]:=ExtractFilePath(ParamStr(0))+'tabelle.xls';
     filen[1]:=ExtractFilePath(ParamStr(0))+'tabelle2.xls';
     for view := 0 To High(filen) do
         begin
         //Überprüfen ob Datei vorhanden
         if fileexists(filen[view]) <> True then
         begin
              //Fehlermeldung anzeigen
              MessageDlg('Datei '+filen[view]+' nicht gefunden.', mtError, mbOkCancel, 0);
              Application.Terminate;
         end;

         //Excel-Inhalt einlesen
         MyWorkbook.ReadFromFile(filen[view], sfExcel5);
         //Erstes Arbeitsplatt der Excel Mappe öffnen
         MyWorksheet := MyWorkbook.GetFirstWorksheet;

         //Alle Zeilen der Excel-Liste durch gehen
         for i:=1 to MyWorksheet.GetLastRowNumber do
         begin
              //Inhalt in ListBox schreiben
              lb.Items.Add(MyWorksheet.ReadAsUTF8Text(i, 0));
              lb2.Items.Add(MyWorksheet.ReadAsUTF8Text(i, 1));
              lb3.Items.Add(MyWorksheet.ReadAsUTF8Text(i, 2));
         end;
     end;
Leider kommt sofort eine Exception beim EIntritt in die Schleife, ich kann allerdings keinen Fehler im Code feststellen, kann mir da ggf. einer einen Tipp geben? Das ist sicherlich weider irgendwas ganz einfaches :)

EDIT: Als Exception-Klasse kommt immer: External:SIGSEGV

Grüße
Florian

DeddyH 19. Mär 2013 14:36

AW: Schleifenproblem in Lazarus
 
Wie ist denn filen deklariert?

P.S.: Man prüft nicht gegen Boolean-Konstanten.
Zitat:

Delphi-Quellcode:
if fileexists(filename) <> True then

-->
Delphi-Quellcode:
if not fileexists(filename) then

sx2008 19. Mär 2013 15:02

AW: Schleifenproblem in Lazarus
 
Der ganze Block beginnend mit
Delphi-Quellcode:
//Excel-Inhalt einlesen
bis zum Schleifenende gehört in eine eigene Prozedur!
Dieser Prozedur wird der Dateiname als Argument übergeben.

Wenn du deinen Code in kleinere Stückchen zerlegst wie die Sache einfacher.
Das könnte z.B. so aussehen:
Delphi-Quellcode:
LadeExcelDaten('tabelle.xls'); // bei nur 2 Dateien braucht man keine Schleife
LadeExcelDaten('tabelle2.xls');
if lb.Items.Count=0 then
begin
  //Fehlermeldung anzeigen
  if MessageDlg('keine Daten gefunden.', mtError, mbOkCancel, 0) = mrOK then
     Application.Terminate;
end;

ONeill 19. Mär 2013 15:42

AW: Schleifenproblem in Lazarus
 
Hallo

filen ist ein Array of String. Klar brauch man keine schleife für 2 durchgänge, es sind reell aber auch min. 7 wenn nicht sogar mehr werden :)
grüße
Florian

DeddyH 19. Mär 2013 15:57

AW: Schleifenproblem in Lazarus
 
Array of String, nicht Array[0..6] of string? Hast Du auch mit SetLength genügend Speicher reserviert?

sx2008 19. Mär 2013 20:29

AW: Schleifenproblem in Lazarus
 
Zitat:

Zitat von ONeill (Beitrag 1207988)
Klar brauch man keine schleife für 2 durchgänge, es sind reell aber auch min. 7 wenn nicht sogar mehr werden :)

Kein Problem wenn man man Unterfunktionen hat:
Delphi-Quellcode:
LadeExcelDaten('tabelle.xls');
for i := 2 to 7 do
  LadeExcelDaten(Format('tabelle%d.xls',[i]));
Wie du siehst braucht du kein Array.

ONeill 19. Mär 2013 22:30

AW: Schleifenproblem in Lazarus
 
Ist array of String, aber auch mit Array[0..7] of String für 8 Objekte bringt den selben Fehler. Setlength hab ich glaube nicht verwendet :S
Das mit den unterfunktionen kann ich morgen mal probieren, allerdings muss es doch auch mit der schleife gehen?! Zumal eine eigene procedure oder gar Funktion hier eigentlich keinen Sinn macht, da ich diesen Code nur an der Stelle brauche.

sx2008 25. Mär 2013 13:21

AW: Schleifenproblem in Lazarus
 
Zitat:

Zitat von ONeill (Beitrag 1208030)
Zumal eine eigene procedure oder gar Funktion hier eigentlich keinen Sinn macht, da ich diesen Code nur an der Stelle brauche.

Doch, auch kleine Prozeduren/Funktionen machen Sinn, denn sie verbesseren die Lesbarkeit des Sourcecode.
Zerlegt man eine grössere Aufgabe in mehrere Prozeduren/Funktionen dann wirkt das wie ein selbstdokumentierender Code; vorrausgesetzt man wählt sinnvolle Bezeichner.

Ausserdem kann man den Code schneller auf neue Anforderungen anpassen.
Man sollte Prozeduren/Funktionen so schreiben, dass sie nur einen Job machen und nicht mehrere verschiedene Dinge vermengen.
Im Idealfall ist eine Funktion so klein, dass man sie nicht mehr zerteilen kann.


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