Einzelnen Beitrag anzeigen

shmia

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

Re: ntdll.dll Zugriffsverletzung bei ComboBox

  Alt 2. Jun 2004, 15:19
Also ich habe diverse Fehler in deinem Programmcode festgestellt:
Delphi-Quellcode:
begin
    sTemp:= Nil; // unnötig -> weglassen
    try // das try sollte nach dem Erzeugen der Objekte kommen
        sLand_id:=TStringList.Create; // sollte man besser einmalig in OnCreate erzeugen
        sTemp:=TStringlist.Create;
         Standard_Lesen_Laenderkennung(sTemp, sLand_id, false);
         cboLand.Items.Clear;
    finally
        sTemp.Free;
    end;
procedure TfrmFenster.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
    sLand_id.Free; // falsch: Objekte sollte man nur in OnDestroy freigeben
    frmFenster:= Nil; // falsch: die Formularklasse darf nicht globale Variablen ihrer eigenen Klasse
                       // verändern
   Action:= CaFree;
end;

Delphi-Quellcode:
function Standard_Lesen_Laenderkennung(Laenderkennung, Laenderkennung_id:TStrings;Leerzeile:boolean):integer;
begin
    Result:= 0;
    Try
       If Laenderkennung <>NIL then begin
            Laenderkennung.Clear;
            If Leerzeile then Laenderkennung.Add('');
       end;
       If Laenderkennung_id<>NIL then begin
           Laenderkennung_id.Clear;
           If Leerzeile then Laenderkennung_id.Add('0');
       end;
       try
           // hier fehlt ein Assert
           Assert(Assigned(frmDatamodul)); // <---
           With frmDatamodul.fsel_Land do begin
               Close;
               Open;
               While not Eof do begin
                   If Laenderkennung<>NIL then Laenderkennung.Add(FieldByName('Laenderkennung').AsString);
                    If Laenderkennung_id<>NIL then Laenderkennung_id.Add(FieldByName('Land_id').AsString);
                next;
                end;
                Close;
            end;
            finally
                // Falsch: die Connection geht diese Funktion gar nichts an!
                // man provoziert so nur unerwünschte Seiteneffekte
                // also Finger weg von dbConnection
                frmDatamodul.dbConnection.Connected:= false;
            end;
        except
            // Falsch: die Exception wird abgefangen und in einen Fehlercode -1 übersetzt
            // die orginale Fehlermeldung geht verloren
            // Richtig: den Abschnitt nach Except komplett löschen
            // und die Funktion in eine Prozedure umwandeln
            Result:=-1;
            exit;
        end;
end;
Andreas
  Mit Zitat antworten Zitat