![]() |
Delphi-Version: 2009
Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Moin.
Ich habe eine Applikation mit einem unsichtbaren Hauptfenster. Es ist in der Regel nur ein TrayIcon zusehen, da das Hauptfenster nur zu Debugzwecken eingeblendet werden kann/soll. Nun werden beim Start der Software einige Sachen abgeprüft. Dies habe ich in OnCreate meines Hauptfensters erledigt. Nun kann es aber sein, dass ich je nach Ergebnis der Prüfungen ein anderes Fenster (modal) anzeigen muss. Dies geht in OnCreate aber nicht. Ich erhalte dort eine Zugriffsverletzung. Und das Problem ist, dass OnActivate und OnShow meines Hauptenster nicht ausgeführt werden, weil mein Hauptenster ja unsichtbar ist. Wo kann ich meine Prüfungen und die Anzeige des anderen Fensters nun realisieren? Vielen Dank |
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Sende eine Windows-Message an dein Hauptformular ala WM_SECOND_FORM_SHOWMODAL.
|
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Könntest Du des etwas weiter ausführen?
|
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
ich kann das Problem nicht nachvollziehen
folgendes funktioniert bei mir Problemlos
Delphi-Quellcode:
program Project3;
uses Forms, Unit5 in 'Unit5.pas' {Form5}, Unit6 in 'Unit6.pas' {Form6}; {$R *.res} begin Application.Initialize; Application.ShowMainForm:= false; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm5, Form5); Application.Run; end.
Delphi-Quellcode:
unit Unit5;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ExtCtrls; type TForm5 = class(TForm) Button1: TButton; TrayIcon1: TTrayIcon; PopupMenu1: TPopupMenu; jlj1: TMenuItem; procedure jlj1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form5: TForm5; implementation uses unit6; {$R *.dfm} procedure TForm5.Button1Click(Sender: TObject); begin hide; end; procedure TForm5.FormCreate(Sender: TObject); begin With TForm6.Create(self) do Show; end; procedure TForm5.jlj1Click(Sender: TObject); begin Show; end; end. |
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Okay, so funktioniert es bei mir auch.
Ich brauche aber die Form als die Instanzvariable. Deswegen habe diese als globale Variable angelegt. Und da kommt die AV.
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit2; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; From2: TForm2; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin From2.Show; end; |
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Die Instanz wird ja auch nirgends angelegt.
|
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Was für eine AV?
die :glaskugel: rät mal und glaubt an was mit "zugriffsverletzung an Adresse $000000**" Wie soll auch die Form2 von alleine in diese Variable kommen? (Die VCL hat dafür eine eigene Variable in der Unit von Form2. Übergib diese Instanz als Parameter, beim Erstellen und vergiß diese globalen Variablen gleich wieder (diese vordefinierten Globalen sind eh ein schlimmer Designfehler) |
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Zitat:
Zitat:
|
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Schau mal in deine Projektdatei/DPR.
Form2 wird erst nach Form1 erzeugt, also kann sie da noch nicht existieren. Wenn man etwas mit einem Externen Objekt machen will, dann läßt man es sich am Besten (meistens im Constructor) als Parameter mitgeben, bzw. übergibt es selber (z.B. über einen eigenen Constructor) und verwendet es erst danach dieses Objekt. Für deinen Fall von
Delphi-Quellcode:
... setze stattdessen einfach nur .Visible der Form2 (im OI) auf True und fertig.
Form2.Show;
|
AW: Was wird bei einem unsichtbaren Fenster nach OnCreate ausgeführt
Wenn ich visible im OI auf true setzen, wird meine zweite Form ja immer angezeigt.
Was ich aber ja möchte, dass beim Start der Anwendung einige Dinge geprüft werden und abhängig davon das zweite Fenster anzeigt wird, oder auch nicht... Und das mache ich in OnCreate der ersten Form... Oder habe ich da jetzt was falsch verstanden? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz