AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung bei 2. Durchlauf einer Schleife
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung bei 2. Durchlauf einer Schleife

Ein Thema von Michael80 · begonnen am 3. Mär 2008 · letzter Beitrag vom 3. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
Michael80

Registriert seit: 20. Nov 2003
Ort: Treuchtlingen
72 Beiträge
 
Delphi 10.3 Rio
 
#1

Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 14:55
Hallo Leute,

ich habe hier ein kleines Problem und komme nicht weiter. Ich versuche mehrere Dateien nacheinander in eine Tabelle einzulesen.
Mit der ersten Datei klappt alles wunderbar, doch sobald das Programm zum 2. mal durchläuft bekomme ich folgende Fehlermeldung:

Zugriffsverletzung bei Adresse 004217FB in Modul "einlesen.exe". Lesen von Adresse 00000005.

und dann steht die Schleife. Im Debug-Mode habe ich die Stelle lokalisiert, weiß nur nicht wo der Fehler ist.

Vielleicht findet ihr hier was.

Hier die gesamte Prozedur:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  mastersl : TStringList;
  detailsl : TStringList;
  fieldssl : TStringList;
  logsl : TStringList;
  ndx : Integer;
  anz,i,po, datensaetze,fidx, flag,didx,wmax,lidx : Integer;
  pfad, datei,fields, jetzt, fehlfeld,felder,werte : string;
begin
OpenDialog1.Execute;
Listbox1.Items := OpenDialog1.Files;
  mastersl := TStringList.Create; // Master StringList
  detailsl := TStringList.Create; // Detail StringList
  fieldssl := TStringList.Create; // Felder StringList
  logsl := TStringList.Create; // Log StringList
  for i :=0 to ListBox1.Items.Count -1 do
    begin
    pfad := Listbox1.Items[i];
    datei := pfad;
    po := pos('\',datei);
    while (po > 0) do
    begin
    delete(datei,1,po);
    po := pos('\',datei);
    end;
    begin
    Adoquery1.SQL.Text := 'select * from information_schema.tables where table_name=''dpd_'+datei+''' ' ;
    adoquery1.Active := true;
    end;
    if adoquery1.RecordCount > 0 then
      begin
        logsl.Add('Die Tabelle '+datei+' wurde gefunden ');
        fieldssl.Delimiter := '|';
        mastersl.LoadFromFile(pfad);
        fields := mastersl.strings[5];
        po := pos(' ',fields);
        delete(fields,1,po);
        fieldssl.DelimitedText := fields;
        wmax := fieldssl.count-1;
        for fidx := 0 to wmax -1 do
        begin
        if felder = 'then
        begin
        felder := '['+fieldssl.strings[fidx]+']';
        end
        else
        begin
        felder := felder + ',['+fieldssl.strings[fidx]+']';
        end;
        end;
        flag := 0;
        fehlfeld := '';
        werte := '';
        for fidx := 0 to Pred(wmax) do
        begin
        if werte = 'then
        begin
        werte := ':wert'+inttostr(fidx);
        end
        else
        begin
        werte := werte +',:wert'+inttostr(fidx);
        end;
        end;
          for fidx := 0 to Pred(wmax)-1 do
          begin
          Adoquery2.SQL.Text := 'select * from information_schema.columns where table_name=''dpd_'+datei+''' and Column_name='''+fieldssl.strings[fidx]+''' ' ;
          AdoQuery2.Active := true;
            if adoquery2.RecordCount > 0 then
            begin
            //logsl.Add('Das Feld '+fieldssl[fidx]+' wurde gefunden ');
            try
            detailsl.Delimiter := '|'; // Trennzeichen der Einträge pro Zeile
            mastersl.LoadFromFile(pfad);
            for ndx := 7 to Pred (mastersl.Count) do
            begin
            detailsl.Clear;
            detailsl.DelimitedText := mastersl.Strings[ndx];
            datensaetze := 0;
            with arbeitsquery do
            begin
            Close;
            SQL.Text := 'INSERT INTO DPD_'+datei+' ('+felder+') VALUES ('+werte+')';
            ParamCheck := True;
            for didx := 0 to wmax -1 do
            begin
            if detailsl.strings[didx] = 'then
            begin
            Parameters.ParamByName('wert'+inttostr(didx)).value := 'NULL';
            logsl.add ('wert'+inttostr(didx)+' NULL');
            end
            else
            begin
            Parameters.ParamByName('wert'+inttostr(didx)).value := detailsl.Strings[didx];
            logsl.add ('wert'+inttostr(didx)+' '+detailsl.Strings[didx]);
            end;
            end;
            Datensaetze := Datensaetze +1;
            ExecSQL;
            end;
            end;
            finally
            FreeAndNil (mastersl);
            FreeAndNil (detailsl);
            end;
          end
            else
            begin
            flag := 1;
            fehlfeld := fehlfeld + ' '+fieldssl[fidx];
            logsl.Add('Das Feld '+fieldssl[fidx]+' wurde nicht gefunden ');
            end;
          end;
        end
      else
        begin
          logsl.Add(pfad +' nicht gefunden');
          logsl.Add('------------------------------------------------');
          logsl.Add('');
        end;
      if flag = 0 then
        begin
          logsl.Add('');
          logsl.Add('Die Datei '+pfad+' wurde korrekt eingelesen');
          logsl.Add('es wurden '+inttostr(datensaetze)+' Datensätze importiert');
          logsl.Add('------------------------------------------------');
          logsl.Add('');
        end
        else
        begin
          logsl.Add('');
          logsl.Add('Das/Die Felder '+fehlfeld+' wurden nicht gefunden.');
          logsl.Add('es wurden keine Datensätze aus der Tabellen '+datei+' importiert');
          logsl.Add('------------------------------------------------');
          logsl.Add('');
        end;
    end;
  jetzt := datetimetostr(now);
  jetzt := StringReplace(jetzt, ':', '.', [rfReplaceAll]);
  logsl.SaveToFile('c:/import_log_'+jetzt+'.txt');
  end;
und hier die Problemstelle:

Delphi-Quellcode:
for i :=0 to ListBox1.Items.Count -1 do
    begin

Schon mal danke für die Hilfe!

Gruß

Michael
Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 14:59
Fehlerzeile:
Listbox1.Items := OpenDialog1.Files; Schau die mal die Methoden Assign oder Addstrings an!
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:01
Zitat von sirius:
Fehlerzeile:
Listbox1.Items := OpenDialog1.Files; Schau die mal die Methoden Assign oder Addstrings an!
Was soll daran falsch sein? TListBox.Items hat einen Setter mit einem Assign() drin.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:02
Ich würde das in etwa so machen:
Delphi-Quellcode:
if OpenDialog1.Execute then
  begin
    Listbox1.Items.Assign(OpenDialog1.Files);
    ...
  end;
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 Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:02
Die Freigaben der lokalen Stringlisten sollten auf der gleichen Ebene erfolgen wie die erzeugung. Ansosnten hast du je nach Pfadabdeckung schöne Speicherlücken.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:04
Befinden sich überhaupt Einträge in der ListBox?
Markus Kinzler
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#7

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:04
Zitat von Michael80:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
// ...
begin
OpenDialog1.Execute;
Listbox1.Items := OpenDialog1.Files;
// ...
Und was machst du, wenn der Benutzer "Abbrechen" in dem Dialog wählt?

OT: Jeder hat so seinen Stil was Source-Formatierung angeht. Aber ich würde dir auch mal einen Pascal-Styleguide zu lesen empfehlen und über ordentliche Code-Einrückung nachdenken. ^^
  Mit Zitat antworten Zitat
jottkaerr

Registriert seit: 2. Jul 2007
Ort: Tuttlingen
81 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:05
Du erzeugst masterl und detailsl am Anfang der Prozedur, zerstörst sie aber innerhalb der inneren for-Schleife im finally-Teil. Beim zweiten Schleifendurchlauf kracht es dann.

Ich habe mir den Code nicht genauer angeschaut, aber vielleicht möchtest Du statt FreeAndNil(masterl) lieber masterl.Clear aufrufen.

jkr
Jürgen Krämer
Sometimes I think the surest sign that intelligent life exists elsewhere
in the universe is that none of it has tried to contact us. (Calvin)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:06
Dein Sourcecode ist ja ein richtiger Saustall - bitte besser einrücken und vielleicht auch mal eine Unterfunktion einbauen.
Und mittendrin steht FreeAndNil (mastersl); FreeAndNil (detailsl); das wirft dann beim 2. Schleifendurchlauf die Bomben. Ich will jetzt auch gar nicht nachschauen, ob die Anweisungen innerhalb oder ausserhalb der Schleife liegen...
Andreas
  Mit Zitat antworten Zitat
Michael80

Registriert seit: 20. Nov 2003
Ort: Treuchtlingen
72 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Zugriffsverletzung bei 2. Durchlauf einer Schleife

  Alt 3. Mär 2008, 15:07
machbar wäre das ja so auch:

Listbox1.Items.AddStrings(OpenDialog1.Files); Abbrechen habe ich noch nicht abgefangen, das weiß ich. Mir gehts im Moment rein um das Problem mit dem Durchlauf, der Rest (Feinheiten) kommt danach.

Styleguide, ok sollt ich mal wieder auffrischen :p
Wer kämpft kann verlieren, wer nicht kämpft hat schon verloren
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:32 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