![]() |
ntdll.dll Zugriffsverletzung bei ComboBox
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; |
Re: ntdll.dll Zugriffsverletzung bei ComboBox
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; |
Re: ntdll.dll Zugriffsverletzung bei ComboBox
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... |
Re: ntdll.dll Zugriffsverletzung bei ComboBox
Zitat:
Zitat:
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. |
Re: ntdll.dll Zugriffsverletzung bei ComboBox
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:
Das ist eine Unit die nur für Laden zuständig ist
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;
Delphi-Quellcode:
Wenn Das Formular geöffnet wird, wird eine Initialisierungsfunktion gestartet
//####################
//# 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;
Delphi-Quellcode:
Es wird noch der richtige Name aus der cbo ausgewählt. Aber wenn man die cbo anklickt kommt die Fehlermeldung (ntdll.dll ......)
//#################
//# 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; |
Re: ntdll.dll Zugriffsverletzung bei ComboBox
endlich :) hab’s geschafft
Delphi-Quellcode:
Danke shmia für deine Bemühungen!
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz