AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi ntdll.dll Zugriffsverletzung bei ComboBox
Thema durchsuchen
Ansicht
Themen-Optionen

ntdll.dll Zugriffsverletzung bei ComboBox

Ein Thema von SiD · begonnen am 2. Jun 2004 · letzter Beitrag vom 3. Jun 2004
Antwort Antwort
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#1

ntdll.dll Zugriffsverletzung bei ComboBox

  Alt 2. Jun 2004, 15:27
Hallo Leute!

Habe ein Problem mit einer norm. ComboBox. Wenn ich sie aufmache und den Scrollbalken bewege bekommen ich eine ntdll.dll Zugrifsverletzung…. HILFE.
Was komisch ist, das passiert nicht bei jeder Combobox.

hier mein Beispiel:

Delphi-Quellcode:
Privat
   sLand_id:TStrings;

..
..
..

//cbo Laden
procedure cbo_Laden;
var
     sTemp:TStrings;
begin
    sTemp:= Nil;
    try
            sLand_id:=TStringList.Create;
            sTemp:=TStringlist.Create;
            Standard_Lesen_Laenderkennung(sTemp, sLand_id, false);
            cboLand.Items.Clear;
    finally
            sTemp.Free;
        end;

//Ende
procedure TfrmFenster.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
    sLand_id.Free;
    frmFenster:= Nil;
   Action:= CaFree;
end;



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
                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
                frmDatamodul.dbConnection.Connected:= false;
            end;
        except
            //Fehler
            Result:=-1;
            exit;
        end;
end;
  Mit Zitat antworten Zitat
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, 16: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
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#3

Re: ntdll.dll Zugriffsverletzung bei ComboBox

  Alt 2. Jun 2004, 16:54
danke für die vielen Tipps! Aber leider kommt immer noch die Fehlermeldung.

Mal eine ganz andere Frage, warum darf ich die DB Connection nicht schließen. Ich will keine Netzwerklast prod. deswegen habe ich die immer geschlossen...
  Mit Zitat antworten Zitat
shmia

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

Re: ntdll.dll Zugriffsverletzung bei ComboBox

  Alt 2. Jun 2004, 17:08
Zitat von SiD:
Aber leider kommt immer noch die Fehlermeldung.
Dann ist den Fehler ausserhalb des Programmcodes, den du gezeigt hast.
Zitat von SiD:
Mal eine ganz andere Frage, warum darf ich die DB Connection nicht schließen. Ich will keine Netzwerklast prod. deswegen habe ich die immer geschlossen...
Weil diese Funktion überhaupt nichts von der Connection wissen darf. Die Funktion
soll einen bestimmten Job verrichten (Daten aus einer Tabelle lesen und damit 2 Stringlisten füllen)
und darf nicht globale Objekte verändern. Andernfalls kommt es zu einer unglücklichen Verzahnung
von Programmcode der letztendlich als Spaghetti-Code endet.

Ständiges Öffnen und Schliesen der Connection erhöht übrigens die Netzwerklast; es sei denn,
deine Anwendung arbeitet mit Connection-Polling.
Eine offene TCP/IP-Verbindung bedeutet nicht, dass auch ständig Daten über das Netzwerk geschickt werden.
Andreas
  Mit Zitat antworten Zitat
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#5

Re: ntdll.dll Zugriffsverletzung bei ComboBox

  Alt 3. Jun 2004, 10:10
Moin,

also ich bin echt am verzweifeln, die blöde Meldung kommt immer noch
so jetzt etwas mehr Quellcode.
Habe diesmal alle TStrings in Hauptformuler Created und die werde auch nur da Destroyt.



Create Funktion
Delphi-Quellcode:
procedure TfrmAuftrag_Auftrag_Suchen.FormCreate(Sender: TObject);
var
     sTemp:TStrings;
begin
    inherited;
    sTemp:=TStringlist.Create;
    try
        try
            //Mitarbeiter
            Standard_Lesen_Mitarbeiterliste(sTemp, frmHauptmenue_Auswahlmenue.sMitarbeiter_id, true);
            cboMitarbeiter.Items.Clear;
            cboMitarbeiter.Items.AddStrings(sTemp);
        finally
            sTemp.Free;
        end;
    except
        //Die Auswertung kommt später
    end;
end;
Das ist eine Unit die nur für Laden zuständig ist
Delphi-Quellcode:
//####################
//# Mitarbeiterliste #
//####################
procedure Standard_Lesen_Mitarbeiterliste(Mitarbeiterliste, Mitarbeiterliste_id:TStrings;Leerzeile:boolean);
begin
    try
        //Daten initialisieren
        If Mitarbeiterliste<>NIL then
        begin
            //Kann initaliaisiert werden
            Mitarbeiterliste.Clear;
            If Leerzeile then Mitarbeiterliste.Add('');
        end;
        If Mitarbeiterliste_id<>NIL then
        begin
            //Kann initaliaisiert werden
            Mitarbeiterliste_id.Clear;
            If Leerzeile then Mitarbeiterliste_id.Add('0');
        end;
        Assert(Assigned(frmDatamodul));
        With frmDatamodul.fsel_Mitarbeiter do
        begin
            try
                Close;
                Parameters.ParamByName('Mitarbeiter_id').Value:= null;
                Open;
                While not Eof do
                begin
                    If Mitarbeiterliste<>NIL then Mitarbeiterliste.Add(FieldByName('Username').AsString);
                    If Mitarbeiterliste_id<>NIL then Mitarbeiterliste_id.Add(FieldByName('Mitarbeiter_id').AsString);
                    next;
                end;
            finally
                Close;
            end;
        end;
    except
        //Die Auswertung kommt später
    end;
end;
Wenn Das Formular geöffnet wird, wird eine Initialisierungsfunktion gestartet
Delphi-Quellcode:
//#################
//# Formulat Init #
//#################
procedure TfrmAuftrag_Auftrag_Suchen.Init;
begin
    cboMitarbeiter.ItemIndex:= cboMitarbeiter.Items.IndexOf(Bestimme_Benutzername); //Bestimme_Benutzername liefert den Name des angemeldeten Benutzers
    ...
    ...
    ...
    Show;
end;
Es wird noch der richtige Name aus der cbo ausgewählt. Aber wenn man die cbo anklickt kommt die Fehlermeldung (ntdll.dll ......)
  Mit Zitat antworten Zitat
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#6

Re: ntdll.dll Zugriffsverletzung bei ComboBox

  Alt 3. Jun 2004, 10:29
endlich hab’s geschafft

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(' '); // <--- Der Fehler, da muss ein leerzeichen, jetzt gehts
            end;
            If Laenderkennung_id<>NIL then begin
                Laenderkennung_id.Clear;
                If Leerzeile then Laenderkennung_id.Add('0');
            end;
Danke shmia für deine Bemühungen!
  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 10:53 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