Schleifenproblem in Lazarus
Hallo Leute,
ich glaube ich brauche mal wieder einen Denkanstoß. Und zwar habe ich folgenden Code:
Delphi-Quellcode:
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 ;)):
//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;
Delphi-Quellcode:
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 :)
//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; EDIT: Als Exception-Klasse kommt immer: External:SIGSEGV Grüße Florian |
AW: Schleifenproblem in Lazarus
Wie ist denn filen deklariert?
P.S.: Man prüft nicht gegen Boolean-Konstanten. Zitat:
Delphi-Quellcode:
if not fileexists(filename) then
|
AW: Schleifenproblem in Lazarus
Der ganze Block beginnend mit
Delphi-Quellcode:
bis zum Schleifenende gehört in eine eigene Prozedur!
//Excel-Inhalt einlesen
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; |
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 |
AW: Schleifenproblem in Lazarus
Array of String, nicht Array[0..6] of string? Hast Du auch mit SetLength genügend Speicher reserviert?
|
AW: Schleifenproblem in Lazarus
Zitat:
Delphi-Quellcode:
Wie du siehst braucht du kein Array.
LadeExcelDaten('tabelle.xls');
for i := 2 to 7 do LadeExcelDaten(Format('tabelle%d.xls',[i])); |
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. |
AW: Schleifenproblem in Lazarus
Zitat:
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