Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überprüfung bei Programmstart (https://www.delphipraxis.net/191227-ueberpruefung-bei-programmstart.html)

Freyr77 22. Dez 2016 09:22

Delphi-Version: 10 Berlin

Überprüfung bei Programmstart
 
Ich möchte das bei Doppelklick auf die .exe meines Programms geprüft wird ob sich die Ini-Datei im Programmverzeichnis befindet.
Das Programm startet sich ja generell ohne diese Ini gar nicht.

Wenn die Ini nicht gefunden wurde, soll sich das Einstellungsfenster als erstes öffnen, hier soll der Nutzer die Daten für die Ini selbst eingeben. Ich habe die ganze Prozedur als erste auszuführende Instanz in das "OnCreate" gepackt.

Alles was passiert ist das eine Exception bei Start angezeigt wird, danach geht gar nichts mehr.

Hat jemand eine Idee wie ich das am besten realisieren kann?

DeddyH 22. Dez 2016 09:32

AW: Überprüfung bei Programmstart
 
Wenn Du im OnCreate des Hauptformulars auf ein anderes Formular zugreifst, muss es zwangsläufig knallen, da dieses ja noch gar nicht erzeugt wurde. Es gibt mehrere Möglichkeiten:
- eine temporäre Instanz des Einstellungsfensters per Code erstellen und darauf zugreifen
- Code aus dem OnCreate entfernen und z.B. ins OnActivate verschieben
- selbstdefinierte Nachricht ans eigene Fenster schicken (per PostMessage) und später darauf reagieren
- etc. pp.

user0815 22. Dez 2016 09:56

AW: Überprüfung bei Programmstart
 
Delphi-Quellcode:
  if fileexists(FileName) then
    ShowMessage(FileName + ' exists OK')
  else
    ShowMessage(FileName + ' does not exist');

Zitat:

OnCreate des Hauptformulars auf ein anderes Formular zugreifst
macht er ja nicht...

TBx 22. Dez 2016 09:59

AW: Überprüfung bei Programmstart
 
Hallo,

- Welche Exception wird denn geworfen?
- Eine Ini-Datei im Programmverzeichnis ist keine gute Idee, Otto-Normal-User hat auf den Programme-Ordner keine Schreibrechte.

Freyr77 22. Dez 2016 10:33

AW: Überprüfung bei Programmstart
 
Zitat:

Zitat von TBx (Beitrag 1356945)
Hallo,

- Welche Exception wird denn geworfen?
- Eine Ini-Datei im Programmverzeichnis ist keine gute Idee, Otto-Normal-User hat auf den Programme-Ordner keine Schreibrechte.

Zugriffsverletzung bei Adresse 009409A 12 in Modul 'Programm.Exe'. Lesen von Adresse 0000FFC4.
Ich rufe das hier im OnCreate auf:

Delphi-Quellcode:
var
  lEinstellungen: TTFormEinstellungen;

begin
  if not(FileExists(ParamStr(0) + 'Test.INI')) then
  begin
    //Einstellungen-Fenster öffnen, Daten selbst eintragen, Übernehmen -> Programm starten
    ShowMessage('Ini-Datei nicht gefunden. Daten im nächsten Schritt selbst eintragen.');
    lEinstellungen.BringToFront;
  end;
end;
Mir ist klar das es so noch nicht gehen kann, aber auch noch nicht so ganz wie ich das lösen soll.

a.def 22. Dez 2016 10:33

AW: Überprüfung bei Programmstart
 
Immer wieder schöne Lösung wie ich finde:
- du prüfst, ob die Ini-Datei existiert bereits in der DPR-Datei bevor die Formulare erzeugt werden
- im Hauptformular wartest du darauf, bis das Formular komplett sichtbar ist (das impliziert meiner Meinung nach "Ok, Formular(e) komplett geladen")

- Dann wertest du deine Prüfung aus der DPR-Datei aus

TBx 22. Dez 2016 10:36

AW: Überprüfung bei Programmstart
 
Du hast lEinstellungen noch nicht intantiiert, versuchst aber dennoch, darauf zuzugreifen. Das kann nicht funktionieren.

Freyr77 22. Dez 2016 10:41

AW: Überprüfung bei Programmstart
 
Zitat:

Zitat von TBx (Beitrag 1356953)
Du hast lEinstellungen noch nicht intantiiert, versuchst aber dennoch, darauf zuzugreifen. Das kann nicht funktionieren.

Richtig. Ich überlege gerade wie ich das am besten umsetze. Ich werde wohl mal a.defs Vorschlag versuchen.

H.Bothur 22. Dez 2016 10:54

AW: Überprüfung bei Programmstart
 
mache so etwas so:

Delphi-Quellcode:
Var:
  ProgrammGestartet: Boolean;

im OnCreate:
  ProgrammGestartet := False;

im OnShow:
  if not ProgrammGestartet then
  begin
    PrüfeObIniDatei
    if NotIniDatei
    begin
      Abfragen
    end;
  end;
Und ja - das geht bestimmt besser und eleganter, aber ich programmiere immer noch in Delphi 6.0

Hans

Luckie 22. Dez 2016 11:05

AW: Überprüfung bei Programmstart
 
Und guck dir mal an, was das ParamStr(0) + 'Test.INI' ergibt. Ich denke nicht, dass du das willst.

ConnorMcLeod 22. Dez 2016 11:24

AW: Überprüfung bei Programmstart
 
Delphi-Quellcode:
begin
  if (not FileExists(ExtractFilePath(Application.ExeName) + 'Test.INI')) then
  begin
    //Einstellungen-Fenster öffnen, Daten selbst eintragen, Übernehmen -> Programm starten
    ShowMessage('Ini-Datei nicht gefunden. Daten im nächsten Schritt selbst eintragen.');
    TFormEinstellungen.Create(Application).Show;
  end;
end;
Edit:
und
Delphi-Quellcode:
Action := caFree;
ins OnClose von TFormEinstellungen.

a.def 22. Dez 2016 11:34

AW: Überprüfung bei Programmstart
 
Zitat:

Zitat von H.Bothur (Beitrag 1356957)
mache so etwas so:

Delphi-Quellcode:
Var:
  ProgrammGestartet: Boolean;

im OnCreate:
  ProgrammGestartet := False;

im OnShow:
  if not ProgrammGestartet then
  begin
    PrüfeObIniDatei
    if NotIniDatei
    begin
      Abfragen
    end;
  end;
Und ja - das geht bestimmt besser und eleganter, aber ich programmiere immer noch in Delphi 6.0

Hans

Ich würde eher eine Kombination aus WMFormVisible und Paint nehmen.
http://www.delphipraxis.net/190560-f...-zu-sehen.html

Freyr77 22. Dez 2016 12:26

AW: Überprüfung bei Programmstart
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1356964)
Delphi-Quellcode:
begin
  if (not FileExists(ExtractFilePath(Application.ExeName) + 'Test.INI')) then
  begin
    //Einstellungen-Fenster öffnen, Daten selbst eintragen, Übernehmen -> Programm starten
    ShowMessage('Ini-Datei nicht gefunden. Daten im nächsten Schritt selbst eintragen.');
    TFormEinstellungen.Create(Application).Show;
  end;
end;
Edit:
und
Delphi-Quellcode:
Action := caFree;
ins OnClose von TFormEinstellungen.

Es kracht immer wenn ich versuche die Einstellungen Form zu öffnen. Selbst wenn ich sie vorher "Create". Ich verstehs nicht.

ConnorMcLeod 22. Dez 2016 12:38

AW: Überprüfung bei Programmstart
 
Zeig mal, wie Du es machst.
Und die Krachermeldung.

nahpets 22. Dez 2016 12:47

AW: Überprüfung bei Programmstart
 
1. Verlege die Prüfung aus dem Create in eine eigene Methode des Formulars (z. B. TForm1.CheckIni)
2. Füge vor der Zeile Application.Run die Prüfung in die dpr ein.

Z. B.:
Delphi-Quellcode:
if Form1.CheckIni then Application.Run;
Ist der Rückgabewert von CheckIni <> true, wird das Programm nicht gestartet.

CheckIni könnte so in der Art aussehen:
Delphi-Quellcode:
function TForm1.CheckIni : Boolean;
begin
  if not FileExists(ChangeFileExt(Application.ExeName,'.ini')) then
  begin
    // Du musst hier dafür sorgen, dass das Einstellungsformular auch einen passenden Rückgabewert hat.
    // Buttons haben dafür z. B. die Eigenschaft ModalResult.
    Result := FormEinstellungen.ShowModal = mrOK;
  end;
end;

Freyr77 22. Dez 2016 13:00

AW: Überprüfung bei Programmstart
 
Delphi-Quellcode:
Result := TFormSettings.ShowModal = mrOk;
Hier kracht er wieder bei mir.

Im dpr sieht das jetzt so aus:

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'Application';
  Application.CreateForm(TApplication, Application);
  Application.Create;

  if Application.CheckIni then
  Application.Run;
end.

DeddyH 22. Dez 2016 13:15

AW: Überprüfung bei Programmstart
 
Heißt Dein Hauptformular Application? Das ist sehr ungünstig.

a.def 22. Dez 2016 13:17

AW: Überprüfung bei Programmstart
 
Außerdem würde ich das CheckIni nicht in TForm1 legen sondern diese Funktion direkt in die DPR-Datei schreiben und noch VOR Application.Initialize; aufrufen.

Delphi-Quellcode:
function CheckIni : Boolean;
begin
  Result := FileExists(ChangeFileExt(Application.ExeName,'.ini'));
end;

begin
  if not CheckIni then
   begin
    showmessage('Ini-Datei nicht vorhanden ...');
    Halt(1);
   end;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'Application';
  Application.CreateForm(TApplication, Application);
  Application.Create;
  Application.Run;
end.

Freyr77 22. Dez 2016 13:17

AW: Überprüfung bei Programmstart
 
Zitat:

Zitat von DeddyH (Beitrag 1356990)
Heißt Dein Hauptformular Application? Das ist sehr ungünstig.

Nein. Ich ändere nur eindeutige Namen ab bevor ich den Code hier poste ;)

DeddyH 22. Dez 2016 13:19

AW: Überprüfung bei Programmstart
 
Was soll den die Zeile "Application.Create" bewirken?

a.def 22. Dez 2016 13:21

AW: Überprüfung bei Programmstart
 
Mach es doch einfach so wie beschrieben.

- prüfe in der Ini-Datei FRÜH GENUG, ob die Ini-Datei vorhanden ist.
-- wenn nicht, dann merke dir das in einer Variablen oder beende das Programm

- wenn Ini nicht vorhanden und du es dir merkst, dann behandle diese Variable im WMFormVisible nachdem die Anwendung komplett geladen wurde (habe ich oben ja bereits geschrieben)

nahpets 22. Dez 2016 13:25

AW: Überprüfung bei Programmstart
 
Schrieb irgend wer was von
Delphi-Quellcode:
Result := TFormSettings.ShowModal = mrOk;


Delphi-Quellcode:
Result := NameDesFormularsFuerDieEinstellungen.ShowModal = mrOk;


nicht:

Delphi-Quellcode:
Result := TypDesFormularsFuerDieEinstellungen.ShowModal = mrOk;


Heißt Dein Hauptformular tatsächlich Application und ist vom Typ TApplication?

Ausgehend von Deinem Quelltext der DPR wird das Einstellungsformular dort nicht erstellt, also kannst Du auch nicht darauf zugreifen.

Da das Programm vom Typ TApplication ist, kannst Du kaum ein Formular vom Typ TApplication produzieren, ohne dadurch massiv Probleme zu bekommen.

Poste doch bitte den realen Quelltext der DPR und kein Beispiel, wie es aussehen könnte.
Und wenn Du eindeutige Namen abänderst vor dem Posten, dann ersetze sie bitte durch sinnvolle Namen und nicht durch solche, die zu Konflikten führen müssen.

So könnte die dpr aussehen:
Delphi-Quellcode:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'Ein sinnvoller Titel für die Taskbar';
  Application.CreateForm(TfmMain, fmMain);
  Application.CreateForm(TfmEinstellungen, fmEinstellungen);
  if fmMain.CheckIni then Application.Run;
end;
Und im Hauptformular:
Delphi-Quellcode:
function TfmMain.CheckIni : Boolean;
begin
  if not FileExists(ChangeFileExt(Application.ExeName,'.ini')) then
  begin
    // Du musst hier dafür sorgen, dass das Einstellungsformular auch einen passenden Rückgabewert hat.
    // Buttons haben dafür z. B. die Eigenschaft ModalResult.
    Result := fmEinstellungen.ShowModal = mrOK;
  end;
end;
@DeddyH
Zitat:

Was soll denn die Zeile "Application.Create" bewirken?
Wir ersetzen eindeutige Namen durch unsinnige, um die Verwirrung zu maximieren ;-)

@a.def
Wenn die INI fehlt soll aber der Einstellungsdialog erscheinen, um sie zu erstellen und das Programm dann mit sinnvollen Einstellungen laufen. Wird es an der von Dir benannten Stelle beendet, bekommt man die Einstellungen nicht zustande und das Programm wird nie laufen ;-)

Freyr77 22. Dez 2016 13:26

AW: Überprüfung bei Programmstart
 
Funktioniert jetzt.

Poste später nochmal wie ich es gemacht habe. Sorry für die Verwirrung mit den Namen ;)

Danke!

a.def 22. Dez 2016 13:27

AW: Überprüfung bei Programmstart
 
Zitat:

Zitat von nahpets (Beitrag 1356999)
@a.def
Wenn die INI fehlt soll aber der Einstellungsdialog erscheinen, um sie zu erstellen und das Programm dann mit sinnvollen Einstellungen laufen. Wird es an der von Dir benannten Stelle beendet, bekommt man die Einstellungen nicht zustande und das Programm wird nie laufen ;-)

Deswegen mein Vorschlag mit dem "Status merken" und "WMFormVisible".

haentschman 22. Dez 2016 13:55

AW: Überprüfung bei Programmstart
 
Hallöle...:P
Delphi-Quellcode:
TFormSettings.ShowModal
müßte es nicht FormSettings.ShowModal heißen?

Wenn es so wäre dann empfehle ich dir den OOP Crashkurs... https://www.delphi-treff.de/tutorial...phi-crashkurs/ :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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