![]() |
Fehler bei Form.ShowModal
Hallo Zusammen,
ich habe eine Fehlermeldung, die ich nicht verstehe. Ich habe ein kleines Eingabe-Form erstellt, in dem Informationen, die nachher in eine Textdatei geschrieben werden erfasst werden. Wenn ich das dieses Form mit ShowModal von meinem Hauptprogramm aus öffne, dann funktioniert alles wie es soll. Jetzt habe ich aber eine Klasse in einer eigenen Unit definiert und ich möchte, dass sich das Form öffnen, wen keine Textdatei gefunden wurde. Aber dabei wird mir leider immer ein Fehler ausgeworfen... Unit:
Delphi-Quellcode:
und so weiter...
unit TDatenbankUnit;
interface uses Uni, UniProvider, MySQLUniProvider, Codes, SysUtils, Vcl.Forms, Data.DB, Vcl.StdCtrls, System.Classes, ODBCUniProvider, CREncryption, Form_DBZugriffsdatenUnit; Type TEvent = procedure(Sender: TObject) of object; TMySQLDB=class strict protected FMySQLConnection: TUniConnection; FMySQLProvider: TMySQLUniProvider; //Querys FMySelectQuery: TUniQuery; FMyWriteQuery: TUniQuery; FMyQuery_Signature: TUniQuery; FMyQuery_Einstellungen: TUniQuery; FMyQuery_Ansprechpartner: TUniQuery; FMyQuery_Sprache: TUniQuery; Procedure, in der der Fehler auftritt:
Delphi-Quellcode:
Fehlermeldung:
procedure TMySQLDB.Connect (Connection: TUniConnection);
var Datei: TextFile; MyString: String; ResultDBZugriff: integer; begin ResultDBZugriff:=0; if not FileExists(ExtractFilePath(Application.ExeName) + 'SQL.set') then begin ResultDBZugriff:=Form_DBZugriffsdaten.ShowModal; //Hier tritt der Fehler auf! if ResultDBZugriff>1 then begin Exit; end; end; AssignFile(Datei, ExtractFilePath(Application.ExeName) + 'SQL.set'); Reset(Datei); try ReadLn(Datei, MyString); Connection.Server := copy(MyString, pos(':', MyString)+1, length(MyString)); ReadLn(Datei, MyString); Connection.Username := copy(MyString, pos(':', MyString)+1, length(MyString)); ReadLn(Datei, MyString); Connection.Password := copy(MyString, pos(':', MyString)+1, length(MyString)); ReadLn(Datei, MyString); Connection.Database := copy(MyString, pos(':', MyString)+1, length(MyString)); ReadLn(Datei, MyString); Connection.ProviderName := copy(MyString, pos(':', MyString)+1, length(MyString)); ReadLn(Datei, MyString); Connection.Port := strtoint(copy(MyString, pos(':', MyString)+1, length(MyString))); finally CloseFile(Datei); end; Connection.Connected:=true; end;
Delphi-Quellcode:
Sieht jemand was ich falsch mache?
Eine Exception in der Klasse $C0000005 mit der Meldung 'access violation at 0x00b31be0: read of adress 0x00000000' aufgetreten.
Vielen Dank Patrick |
AW: Fehler bei Form.ShowModal
Ist an der betreffenden Stelle das Form_DBZugriffsdaten auch initialisiert?
|
AW: Fehler bei Form.ShowModal
Um Uwes Aussage zu verfeinern:
Schau mal unter " Projekt -> Optionen -> Forms " rein ob Form_DBZugriffsdaten im Auto-Create drinnen steht. Dafür sollte Visible = False auf dem Form_DBZugriffsdaten Formular gesetzt sein. |
AW: Fehler bei Form.ShowModal
UPS, hatte den einen Beitrag übersehen...
Das Form steht unter Automatisch erzeugen mit drin. Ich vermute, dass etwas in der Unit, von der ich es aufrufen möchte, falsch ist, weil es ja vom HauptForm aus funktioniert... Ich hatte deshalb meinen "USES-Teil" mit in die Frage geschrieben. Irgendwo fehlt ein Verweis... Aber der Fehler entsteht nicht beim compilieren, sondern erst zur Laufzeit... Ich habe keine Idee... Patrick |
AW: Fehler bei Form.ShowModal
Aber ist das Form zum Zeitpunkt des fehlschlagenden Aufrufs auch schon erstellt worden?
|
AW: Fehler bei Form.ShowModal
Ist sie erzeugt? Also entweder per vom KodeZwerg geshilderten Automatismus oder durch ein simples
Delphi-Quellcode:
.
Form_DBZugriffsdaten := TForm.Create
Sherlock |
AW: Fehler bei Form.ShowModal
Zitat:
Delphi-Quellcode:
program iVisitor;
uses Vcl.Forms, Form_MainUnit in 'Form_MainUnit.pas' {Form_Main}, Form_DBZugriffsdatenUnit in 'Form_DBZugriffsdatenUnit.pas' {Form_DBZugriffsdaten}, TMultiLanguageUnit in 'TMultiLanguageUnit.pas', TDatenbankUnit in 'TDatenbankUnit.pas', TExcelExportUnit in 'TExcelExportUnit.pas', TGridDesignUnit in 'TGridDesignUnit.pas', TBitMapUnit in 'TBitMapUnit.pas', Form_PasswortUnit in 'Form_PasswortUnit.pas' {Form_Passwort}, Frame_SQLUnit in 'Frame_SQLUnit.pas' {Frame_SQL: TFrame}; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm_Main, Form_Main); Application.CreateForm(TForm_Passwort, Form_Passwort); Application.CreateForm(TForm_DBZugriffsdaten, Form_DBZugriffsdaten); Application.Run; end. |
AW: Fehler bei Form.ShowModal
GELÖST!
Delphi-Quellcode:
if not FileExists(ExtractFilePath(Application.ExeName) + 'SQL.set') then begin
if (Form_DBZugriffsdaten = nil) then Form_DBZugriffsdaten:= TForm_DBZugriffsdaten.Create(nil); ResultDBZugriff:=Form_DBZugriffsdatenUnit.Form_DBZugriffsdaten.ShowModal; if ResultDBZugriff>1 then begin Exit; end; end; Zitat:
Zitat:
Patrick |
AW: Fehler bei Form.ShowModal
Das verstehe wer will, ich tu es gerade nicht.
Wenn in .dpr es automatisch erzeugt wird aber bei Aufruf nicht vorhanden ist, da stimmt doch was nicht. Das es forciert funktioniert mag ja schön und gut sein, aber normal ist so ein Verhalten nicht. |
AW: Fehler bei Form.ShowModal
Zitat:
Wenn, dann muss man die Reihenfolge bei den Application.CreateForm ändern. Dann kann sich aber auch das Hauptformular der Anwendung ändern, was nicht zwingend zielführend ist. Sinnvoller wäre es meiner Meinung nach, das Formular, das ja nur in bestimmten Fällen, aber nicht immer, benötigt wird, aus dem Erstellautomatismus rauszunehmen und nur bei Bedarf zu erstellen und nach der Nutzung freizugeben. Also die Zeile
Delphi-Quellcode:
aus der DPR entfernen und den Aufruf des Formulares anpassen:
Application.CreateForm(TForm_DBZugriffsdaten, Form_DBZugriffsdaten);
Delphi-Quellcode:
Und wenn man das dann noch in eine eigene Methode, mit 'ner vernünftigen Fehlerbehandlung packt, die sicherstellt, dass auch garantiert eine Freigabe des Formulares erfolgt, dann könnte das was werden.
if not FileExists(ExtractFilePath(Application.ExeName) + 'SQL.set') then begin
Form_DBZugriffsdaten := TForm_DBZugriffsdaten.Create(nil); ResultDBZugriff := Form_DBZugriffsdatenUnit.Form_DBZugriffsdaten.ShowModal; Form_DBZugriffsdaten.Free; if ResultDBZugriff > 1 then Exit; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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