AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei Form.ShowModal

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

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 10:45
Die Reihenfolge in der dpr ist nicht irrelevant sondern wird genauso aus dem Formulare-Abschnitt der Projektoptionen gesteuert bzw. vorgegeben.

Dennoch ist der Einwand gut, daß man Formulare erst dann erzeugen sollte, wenn man sie braucht, das beschleunigt ja auch den Anwendungsstart.

Eventuell wird das fragliche Formular irgendwann vorher freigegeben?

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

n/a Beiträge
 
#12

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 11:09
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.
Das hat was mit dem Timing zu tun.

Die Form wird in der dpr definitiv erzeugt, allerdings zu spät für den entsprechenden Codeteil. Und nur wenn es erzeugt wurde kann man es verwenden nicht wenn es erzeugt werden würde (wenn da nicht vorher die Exception fliegt)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 11:37
Eventuell Offtopic, wer weiß das schon
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.
Das hat was mit dem Timing zu tun.

Die Form wird in der dpr definitiv erzeugt, allerdings zu spät für den entsprechenden Codeteil. Und nur wenn es erzeugt wurde kann man es verwenden nicht wenn es erzeugt werden würde (wenn da nicht vorher die Exception fliegt)
Ich Danke Ihnen für diese gute Erklärung.
Es war mir schon bewusst aufgrund der Fehlermeldung das dieses Objekt noch nicht existiert.
Nur kann ich es gerade nicht nachvollziehen. Ich führe mal ein paar selbst-Tests durch mit .DPR und langsamen Formularen.
Bis jetzt habe ich so ein Verhalten noch nicht erlebt, dass das Laden lange dauern kann schon.
Das ein Objekt, obwohl man es explizit Created nicht erstellt wird erscheint mir im Moment unlogisch.

Was mir einfällt wäre, wenn ich das Hauptformular Visible=True setze, kann es sein das es da schon angezeigt wird bevor Application.Run einsetzt? Sonst ist es für mich unlogisch.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#14

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 11:49
Die Reihenfolge in der dpr ist nicht irrelevant sondern wird genauso aus dem Formulare-Abschnitt der Projektoptionen gesteuert bzw. vorgegeben.

Dennoch ist der Einwand gut, daß man Formulare erst dann erzeugen sollte, wenn man sie braucht, das beschleunigt ja auch den Anwendungsstart.

Eventuell wird das fragliche Formular irgendwann vorher freigegeben?

Sherlock
Sorry, habe mich unpräzise geäußert.

Irrelevant in Bezug auf die Erstellungsreihenfolge.

Wenn Form_DBZugriffsdaten bereits im Form_Main angezeigt werden soll, dann muss sein Application.CreateForm in der dpr auch vor dem der Form_Main stehen.

Pech: In dem Fall wird dann Form_DBZugriffsdaten zur MainForm des Programmes.

Für diese Reihenfolge ist die Reihenfolge im Uses "egal".
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#15

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 11:50
Es ist doch ganz einfach
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm_Main, Form_Main); // ruft den Konstruktor auf
  Application.CreateForm(TForm_Passwort, Form_Passwort);
  Application.CreateForm(TForm_DBZugriffsdaten, Form_DBZugriffsdaten); // der auf das hier zugreifen möchte
  Application.Run;
end.
Also wenn im Konstruktor von TForm_Main eine Instanz von TMYSQLDB erzeugt wird, wo dann Form_DBZugriffsdaten verwendet wird, dann passiert das eben.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#16

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 11:51
Ich versuche mal ein Scenario zu skizzieren:

MainForm wird erzeugt,
darin im OnCreate wird die TDatenbankunit erzegut,
die wiederum im Create in der Connect-Funktion auf die zu diesem Zeitpunkt noch nicht existierende TForm_DBZugriffsdaten zugreift.

Mit dem Workarround wird sie nun bei Bedarf erzeugt und dann nochmal später automatisch aus der dpr? Kann das nicht auch Probleme machen?
Ralph
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#17

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 11:56
Eventuell Offtopic, wer weiß das schon
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.
Das hat was mit dem Timing zu tun.

Die Form wird in der dpr definitiv erzeugt, allerdings zu spät für den entsprechenden Codeteil. Und nur wenn es erzeugt wurde kann man es verwenden nicht wenn es erzeugt werden würde (wenn da nicht vorher die Exception fliegt)
Ich Danke Ihnen für diese gute Erklärung.
Es war mir schon bewusst aufgrund der Fehlermeldung das dieses Objekt noch nicht existiert.
Nur kann ich es gerade nicht nachvollziehen. Ich führe mal ein paar selbst-Tests durch mit .DPR und langsamen Formularen.
Bis jetzt habe ich so ein Verhalten noch nicht erlebt, dass das Laden lange dauern kann schon.
Das ein Objekt, obwohl man es explizit Created nicht erstellt wird erscheint mir im Moment unlogisch.

Was mir einfällt wäre, wenn ich das Hauptformular Visible=True setze, kann es sein das es da schon angezeigt wird bevor Application.Run einsetzt? Sonst ist es für mich unlogisch.
Wenn ich im FormCreate von Form_Main eine Routine aufrufe, die Form_DBZugriffsdaten benötigt, dann existiert es noch nicht, da es in der dpr erst später erstellt wird.

Mach Dir mal ein Programm mit ein paar Formularen, steck jeweils ins FormCreate was rein, um dort 'nen Breakpoint setzen zu können. Setze in der dpr vor das Application.Initialize einen Breakpoint und gehe dann schrittweise durch.

Was wird zuerst aufgerufen? Der Breakpoint im FormCreate des ersten Formulares oder das letzte Application.CreateForm in der dpr?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 12:14
Habe es mehr als Verstanden, Danke nochmal für Hinweise diesbezüglich.

Ich wünsche Euch einen tollen Tag!

Mach Dir mal ein Programm mit ein paar Formularen, steck jeweils ins FormCreate was rein, um dort 'nen Breakpoint setzen zu können. Setze in der dpr vor das Application.Initialize einen Breakpoint und gehe dann schrittweise durch.

Was wird zuerst aufgerufen? Der Breakpoint im FormCreate des ersten Formulares oder das letzte Application.CreateForm in der dpr?
Zuerst der vor Application.Initialize ^_^, ich weiß worauf Du hinaus wolltest, Danke auch dafür!
Gruß vom KodeZwerg

Geändert von KodeZwerg (23. Aug 2018 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#19

AW: Fehler bei Form.ShowModal

  Alt 23. Aug 2018, 13:40
Es ist doch ganz einfach
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm_Main, Form_Main); // ruft den Konstruktor auf
  Application.CreateForm(TForm_Passwort, Form_Passwort);
  Application.CreateForm(TForm_DBZugriffsdaten, Form_DBZugriffsdaten); // der auf das hier zugreifen möchte
  Application.Run;
end.
Also wenn im Konstruktor von TForm_Main eine Instanz von TMYSQLDB erzeugt wird, wo dann Form_DBZugriffsdaten verwendet wird, dann passiert das eben.
Die reihenfolge zu ändern ist aber nicht unbedingt eine gute Lösung,
denn die erste so erstellte Form wird zur MainForm,
was bei einer anderen Reihenfolge zu komischen Ergebnissen führt.

Tja, besser wäre es, wenn die Letzte die MainForm würde, aber das wird nicht passieren.
Lösungen: nicht im Konstruktor sowas machen, sondern erst nachdem alles erstellt wurde. (mein Tipp: Delphi könnte ein OnStartup in den TForm bekommen, was im Run als Erstes aufgerufen würde)
oder man muß eben weiterhin mit Messages/Timern sowas manuell machen.

Oder man lässt die abhängigen Forms nicht automatisch erstellen, sondern erstellt sie selber, vor dem Zugriff darauf (es ist eh nicht immer schön, wenn "alles" automatisch erstellt wird, vor allem wenn es dann fast niemals verwendet wird)


Delphi-Quellcode:
   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;
Du kennst schon Delphi-Referenz durchsuchenTStrings.NameValueSeparator?
Eine TStringList, jenes auf ':' gesetzt und schon könntest du Delphi-Referenz durchsuchenTStrings.ValueFromIndex verwenden, anstatt diesem rumgeCOPYe.
Und vorher vielleicht auch noch Count proüfen, ob die Anzahl passt, mit einer netteren Fehlermeldung, anstatt deinem grauenhaften "Lesefehler". (beim Zuriff über den Index, anstatt über die Namen)

Aber da ich vermute, dass vor dem : jeweils ein "Name" steht, würde ich eher zu Delphi-Referenz durchsuchenTStrings.Values raten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20:27 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