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
TStrings.NameValueSeparator?
Eine TStringList, jenes auf
':'
gesetzt und schon könntest du
TStrings.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
TStrings.Values raten.