Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Form in OnCreate Anzeige anzeigen lassen - Fehler (https://www.delphipraxis.net/92426-form-oncreate-anzeige-anzeigen-lassen-fehler.html)

Nagetier 19. Mai 2007 15:59


Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Guten Tag ;)

Ich habe folgendes Problem, sobald ich in der MainForm meines Programmes eine Anweisung wie "Form2.Show" einbinde, oder einen Button Klick, der dies erledigen soll, dann wirft mir mein Programm beim start eine EAccess Voiolation Meldung hin... und unterlegt mir folgendes im Code

Delphi-Quellcode:
program XYZ;

uses
  Forms,
  UiChem in 'UiChem.pas' {Form1},
  Ablage in 'Ablage.pas' {Form2},
  Rechner in 'Rechner.pas' {Form3};

{$R *.res}

begin
  Application.Initialize;
  Application.Title := 'XYZ';
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2); {<<-- wird dann hellrot unterlegt}
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.
Mein Code Schnippsel im OnCreate ist folgender:

Delphi-Quellcode:
procedure TForm1.BtSplashClick(Sender: TObject);
begin
 Form2.Show;
 sleep(1000);
 Form2.Hide;
end;
Ich versuche diese Form Testweise als eine Art Splash Screen einzubinden, allerdings akzeptiert er einfach kein Form.Show im OnCreater meiner MainForm, was genau ist das los...?

Nager

Edit: Achja, ich weiß, dass die Methode ziemlich simpel ist etc. allerdings brauch ich den Splash nicht, damit das Programm laden kann(Wie im hiesigen Tutorial beschrieben ;)), denn das geht schnell, der soll einfach nur erscheinen...

patti 19. Mai 2007 16:10

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Zitat:

Zitat von Nagetier
Mein Code Schnippsel im OnCreate ist folgender:

Delphi-Quellcode:
procedure TForm1.BtSplashClick(Sender: TObject);
begin
 Form2.Show;
 sleep(1000);
 Form2.Hide;
end;

Der CodeSchnipsel ist doch nicht im OnCreate ("BtSplashClick") oder verstehe ich da was falsch? Funktioniert der Aufruf von Form2 beim Klick auf den Button auch nicht oder geht es da?

P@Tti

Nagetier 19. Mai 2007 16:13

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Zitat:

Zitat von patti
Zitat:

Zitat von Nagetier
Mein Code Schnippsel im OnCreate ist folgender:

Delphi-Quellcode:
procedure TForm1.BtSplashClick(Sender: TObject);
begin
 Form2.Show;
 sleep(1000);
 Form2.Hide;
end;

Der CodeSchnipsel ist doch nicht im OnCreate ("BtSplashClick") oder verstehe ich das falsch?

P@Tti

Jein, das war nur ein versuch, im OnCreate wird dann BtSplash.Click ausgeführt ;)

Apollonius 19. Mai 2007 16:14

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Wie man unschwer erkennen kann, wird form1 vor form2 erzeugt. Also folgende Reihenfolge:
Form1 erzeugen
Form1.onCreate
Form2 erzeugen

Du rufst nun aber im FormCreate eine Methode (show) eines Objektes(form2) auf, das gar nicht existiert. Setze das Ganze ins onShow, das müsste auch funktionieren.

patti 19. Mai 2007 16:18

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Habs bei mir rekonstruiert, funktioniert nur im OnShow, da er beim OnCreate Form2 noch nicht kennt (Erstellungsreihenfolge).

Nagetier 19. Mai 2007 16:19

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Zitat:

Zitat von Apollonius
Wie man unschwer erkennen kann, wird form1 vor form2 erzeugt. Also folgende Reihenfolge:
Form1 erzeugen
Form1.onCreate
Form2 erzeugen

Du rufst nun aber im FormCreate eine Methode (show) eines Objektes(form2) auf, das gar nicht existiert. Setze das Ganze ins onShow, das müsste auch funktionieren.

Ok, stimmt dummer Denkfehler ;)
Allerdings gibts dann immer noch den Fehler wenns nur im onShow steht, also noch schnell was vertauscht und es scheint zu gehen...

Delphi-Quellcode:
  Application.Initialize;
  Application.Title := 'XYZ';
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm3, Form3);
  Application.Run;
Wunderbar ;)


edit: doch nicht... Jetzt kommt plötzlich ein Fehler das er Visible nicht bei OnShow und OnHide verändern kann...

Code sieht mittlerweile so aus:

Delphi-Quellcode:
begin
  Application.Initialize;
  Application.Title := 'XYZ';
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.
und so...

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  Form1.Visible := false;
  Form4.Show;
  sleep(2000);
  Form1.Visible := true;
  Form4.Visible := false;
end;

patti 19. Mai 2007 16:24

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
oder so ... ;-)

Nagetier 19. Mai 2007 16:25

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Naja doch nicht irgendwie, wie du im Edit siehst, irgendwo is wieder so n saublöder Fehler drin...

Apollonius 19. Mai 2007 16:40

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Du kannst doch visible nicht im onShow verändern! Am Ende setzt du nämlich visible auf true, sodass onShow aufgerufen wird-> nochmal visible auf true->nochmal onShow->usw.
Ist form1 dein Mainform? Dann hilft Application.showmainform:=false;

Nagetier 19. Mai 2007 16:55

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Das mit dem Application.ShowMainform weiß ich jetzt net wos genau hinkommt, ich hab allerdings was gefunden per Google, was das ganze recht einfach macht...

Delphi-Quellcode:
program XYZ;

uses
  Forms,
  UiChem in 'UiChem.pas' {Form1},
  Ablage in 'Ablage.pas' {Form2},
  Rechner in 'Rechner.pas' {Form3},
  Splash in 'Splash.pas' {Form4};

{$R *.res}

begin
  Form4 := TForm4.Create (Application);   {Splash Screen anzeigen}

  try
    Form4.Show;
    Form4.Update;

    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
    Application.CreateForm(TForm3, Form3);


    Form4.Hide;      {Splash Screen ausblenden}
  finally
    Form4.Free;
end;
  Application.Run;

end.
Allerdings kann ich jetzt keinen sleep Befehl einbinden, da er das nicht kennt, aber das lässt sich lösen indem man in die uses noch ein "SysUtils," einfließen lässt, dann kann ich einen sleep(2000) z.b einbinden, klappt wunderbar... endlich :D

cruiser 19. Mai 2007 17:53

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
ich weiss, dass das nervig ist, aber wozu brauchst du da einen Splashscreen? Lädtst du so viele Daten um deine Anwendung zu initialisieren? dann und nur dann ist ein Splashscreen eigentlich "erwünscht".

mh... aber ich will nicht nur negativ sein. Die Splashscreen-form brauchst du wie oft? genau. 1 mal.

also bind doch die Unit dieser Form in deine MainForm ein und nimm sie aus der automatischen Erstellung heraus.
Splashscreens sollten Veränderungen anzeigen... also am besten eine public procedure UpdateStatus(const status: string); in der Splashscreen-Form erzeugen.

Was dann? Gut... im On-Create deiner Mainform erzeugst du nun also den Splashscreen:

Delphi-Quellcode:
procedure TForm.oncreate; // oder so -.-
var
  Splash: TSplashForm;
  Wait: Cardinal;
begin
  Splash := TSplashForm.Create(Self);
  Splash.Show;
Jetzt wird der Screen angezeigt. Nun willst du die Statusveränderung ja sichtbar machen:

Delphi-Quellcode:
  MachWas;
  Splash.updatestatus('Hab was gemacht!');
Jetzt wissen wir also, was beim Start so abgeht ;) was fehlt noch? Kurze Pause und weg mit dem Splash

Delphi-Quellcode:
  wait := GetTickCount + 200;
  repeat Application.ProcessMessages until GetTickCount >= wait;
  Splash.Free;
end;
Dazu solltest du in deinen Programmoptionen den Splash-Screen abschaltbar machen.

Greetz

Nagetier 19. Mai 2007 18:45

Re: Form in OnCreate Anzeige anzeigen lassen - Fehler
 
Viele Daten werden nicht gerade geladen, nur ein paar Datenblätter lade ich...
Ich werde mir deinen Code später mal genauer zu Herzen führen und schaun was ich daraus machen kann, das mit dem Abschaltbar in den Optionen ist allerdings eine gute Idee...


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