![]() |
Zugriffsverletzung bei visible:=true von form
Hallo,
folgender Sachverhalt: Ich will zum Programmstart abfragen, ob eine Datei, in der SQL-Zugangsdaten hinterlegt sind, vorhanden ist. Wenn dies der Fall ist, ist auch kein Problem, passt, alles läuft wie es soll. Wenn die Datei nicht vorhanden ist, will ich jedoch einen Hinweis ausgeben, dass beim ersten Start des Programms (bzw. beim ersten Verbindungsversuch zum MySQL-Server), die Daten hinterlegt werden müssen, und danach ein form mit formname.visible:=true aufrufen, wo dann eine Eingabemaske zum Hinterlegen der Daten erscheint. Im ganzen Programm gib es diverse Prozeduren, die auf die Prozedur mysqlConnect (s.U.) zugreifen.
Delphi-Quellcode:
procedure TForm1.mysqlConnect;
var f: File of TSQLSettings; SQLsettings: TSQLsettings; port,username,databasename, password,serveradress:string; begin if fileexists('mysql.dat') then begin AssignFile(f,'mysql.dat'); reset(f); read(f,SQLsettings); closefile(f); port:=sqlsettings.port; username:=sqlsettings.username; databasename:=sqlsettings.databasename; password:=sqlsettings.serverpassword; serveradress:=sqlsettings.serveradress; FMysql.Host := 'localhost'; FMysql.port := StrToInt(port); FMysql.user := username; FMysql.password := password; FMysql.UnixSocket := ''; FMysql.Db := databasename; FMysql.UseNamedPipe := false; FMysql.UseSSL := false; FMysql.Compress := true; FMysql.TrySockets := false; end else begin application.MessageBox('Vor der ersten Benutzung müssen sie ihre'+#10#13+'MySQL Zugangsdaten hinterlegen','MySQL Zugangsdaten benötigz!'); formSettings.visible:=true; //<--Knackpunkt end; end; Die Messagebox erscheint noch, aber danach, bekomme ich eine Acces Vioalation Exception. Und zwar passiert das an der ersten Stelle, wo die mysqlConnect benötigt wird.
Delphi-Quellcode:
procedure updateShowDoctors;
var q: string; ex: boolean; i: integer; begin Form1.mysqlConnect; //<--Hier wird die o.G. prozedur aufgerufen q := 'SELECT name,id FROM doctors ORDER BY name ASC'; Form1.FResult := Form1.FMysql.query(q, true, ex); Form1.boxShowDoctors.Clear; if assigned(Form1.FResult) then begin setlength(saveresultDoctor, Form1.FResult.RowsCount); for i:=1 to Form1.FResult.RowsCount do begin Form1.boxShowDoctors.items.add('Dr. '+Form1.FResult.FieldValueByName('name')); saveresultDoctor[i-1]:=Form1.FResult.FieldValueByName('id'); Form1.FResult.Next; end; end; Form1.mysqlDisconnect; end; Ich weiss nicht mehr weiter. Wie kann ich das Vernünftig handhaben? Ich habe keine Idee. Ohne die Zeile mit dem formsettings.visible:=true passiert garnichts, auch keine Fehlermeldung. Ich möchte aber halt nach dem Hinweiss auf die zu hinterlegenden Daten gleich die Eingabemaske aufrufen. Über jede hilfreiche Antwort würde ich mich sehr freuen |
Re: Zugriffsverletzung bei visible:=true von form
Ist formSettings zu diesem Zeitpunkt erstellt?
|
Re: Zugriffsverletzung bei visible:=true von form
:oops: Wie kann ich nachvollziehen, ob das form zu diesem Zeitpunkt schon erstellt ist?
|
Re: Zugriffsverletzung bei visible:=true von form
Schreib mal:
Delphi-Quellcode:
if Assigned(formSettings) then
formSettings.Visible := true else ShowMessage('Formsettings noch nicht erstellt!'); |
Re: Zugriffsverletzung bei visible:=true von form
Okay, formSettings ist noch nicht erstellt. Wie sorge ich dafür?
Entweder steh ich im Moment gewaltig auffem Schlauch oder ich weiss auch nicht. Einen solchen Fehler hatte ich noch nie in diesem Zusammenhang edit: es geht jetzt! Ich habe mir im Debugger das den Aufruf-Stack anzeigen lassen, der so aussah:
Delphi-Quellcode:
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {addPatient}, mysqlqueries in 'mysqlqueries.pas', Unit5 in 'Unit5.pas' {doctorFrame}, settings in 'settings.pas' {formSettings}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TaddPatient, addPatient); Application.CreateForm(TdoctorFrame, doctorFrame); Application.CreateForm(TformSettings, formSettings); //das hier muss ganz nach oben Application.Run; end. daraus wurde dann
Delphi-Quellcode:
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {addPatient}, mysqlqueries in 'mysqlqueries.pas', Unit5 in 'Unit5.pas' {doctorFrame}, settings in 'settings.pas' {formSettings}; {$R *.res} begin Application.Initialize; Application.CreateForm(TformSettings, formSettings); //<--so ist das schon besser! Application.CreateForm(TForm1, Form1); Application.CreateForm(TaddPatient, addPatient); Application.CreateForm(TdoctorFrame, doctorFrame); Application.Run; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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