AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fehler bei Form.ShowModal

Ein Thema von Ykcim · begonnen am 23. Aug 2018 · letzter Beitrag vom 23. Aug 2018
Antwort Antwort
Seite 1 von 2  1 2   
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
617 Beiträge
 
Delphi XE5 Professional
 
#1

Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 08:54
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:
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;
und so weiter...


Procedure, in der der Fehler auftritt:
Delphi-Quellcode:
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;
Fehlermeldung:Eine Exception in der Klasse $C0000005 mit der Meldung 'access violation at 0x00b31be0: read of adress 0x00000000' aufgetreten. Sieht jemand was ich falsch mache?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.635 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 09:06
Ist an der betreffenden Stelle das Form_DBZugriffsdaten auch initialisiert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 09:15
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.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...

Geändert von KodeZwerg (23. Aug 2018 um 09:17 Uhr)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
617 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 09:25
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
Patrick

Geändert von Ykcim (23. Aug 2018 um 09:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
6.635 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 09:34
Aber ist das Form zum Zeitpunkt des fehlschlagenden Aufrufs auch schon erstellt worden?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.250 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 09:34
Ist sie erzeugt? Also entweder per vom KodeZwerg geshilderten Automatismus oder durch ein simples Form_DBZugriffsdaten := TForm.Create .

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
617 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 09:50
Aber ist das Form zum Zeitpunkt des fehlschlagenden Aufrufs auch schon erstellt worden?
Das könnte der Grund sein... Die Prüfung, ob die Datei vorhanden ist oder nicht findet im CREATE von TDatenbankUnit statt. Bis Gerade stand das Form_DBZugriffsdatenUnit ganz unten. Ich habe es jetzt nach oben gesetzt, aber das hat nicht den gewünschten Erfolg gebracht...

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.
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
617 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 10:01
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;
Aber ist das Form zum Zeitpunkt des fehlschlagenden Aufrufs auch schon erstellt worden?
Ist sie erzeugt? Also entweder per vom KodeZwerg geshilderten Automatismus oder durch ein simples Form_DBZugriffsdaten := TForm.Create .

Sherlock
Vielen Dank für die Hilfe - die Kombination war es...

Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 10:19
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.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
929 Beiträge
 
Delphi 7 Professional
 
#10

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 10:31
Aber ist das Form zum Zeitpunkt des fehlschlagenden Aufrufs auch schon erstellt worden?
Das könnte der Grund sein... Die Prüfung, ob die Datei vorhanden ist oder nicht findet im CREATE von TDatenbankUnit statt. Bis Gerade stand das Form_DBZugriffsdatenUnit ganz unten. Ich habe es jetzt nach oben gesetzt, aber das hat nicht den gewünschten Erfolg gebracht...

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.
Die Reihgenfolge im Uses ist irrelevant.

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 Application.CreateForm(TForm_DBZugriffsdaten, Form_DBZugriffsdaten); aus der DPR entfernen und den Aufruf des Formulares anpassen:
Delphi-Quellcode:
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;
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf