AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FreePascal Schleifenproblem in Lazarus
Thema durchsuchen
Ansicht
Themen-Optionen

Schleifenproblem in Lazarus

Ein Thema von ONeill · begonnen am 19. Mär 2013 · letzter Beitrag vom 25. Mär 2013
Antwort Antwort
ONeill

Registriert seit: 17. Nov 2011
28 Beiträge
 
#1

Schleifenproblem in Lazarus

  Alt 19. Mär 2013, 14:32
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Schleifenproblem in Lazarus

  Alt 19. Mär 2013, 14:36
Wie ist denn filen deklariert?

P.S.: Man prüft nicht gegen Boolean-Konstanten.
Zitat:
if fileexists(filename) <> True then
-->
if not fileexists(filename) then
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Schleifenproblem in Lazarus

  Alt 19. Mär 2013, 15:02
Der ganze Block beginnend mit //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;
  Mit Zitat antworten Zitat
ONeill

Registriert seit: 17. Nov 2011
28 Beiträge
 
#4

AW: Schleifenproblem in Lazarus

  Alt 19. Mär 2013, 15:42
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Schleifenproblem in Lazarus

  Alt 19. Mär 2013, 15:57
Array of String, nicht Array[0..6] of string? Hast Du auch mit SetLength genügend Speicher reserviert?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Schleifenproblem in Lazarus

  Alt 19. Mär 2013, 20:29
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.
  Mit Zitat antworten Zitat
ONeill

Registriert seit: 17. Nov 2011
28 Beiträge
 
#7

AW: Schleifenproblem in Lazarus

  Alt 19. Mär 2013, 22:30
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.

Geändert von ONeill (19. Mär 2013 um 22:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Schleifenproblem in Lazarus

  Alt 25. Mär 2013, 13:21
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 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